在 CakePHP 中,$_SESSION['Auth'] 和 Authentication->getIdentity() 有什么区别?

问题描述

标题说明了我的想法。

这两个我都遇到过,但不知道应该在 $_SESSION['Auth'] 和 $this->Authentication->getIdentity() 之间使用哪一个一个比另一个更安全吗?

谢谢,

西蒙

解决方法

使用 CakePHP,您应该始终使用抽象的 API 来访问任何超全局数据,例如 $_POST$_COOKIE$_SESSION 等。

建议这样做的原因有很多,具体取决于具体情况,但通常它有点触及依赖倒置和一般解耦的原则,例如。你的代码应该依赖于抽象,而不是具体,然后例如实现可以改变而不会破坏你的应用程序。虽然会话对象、请求对象或身份验证组件不是接口,但它们仍然抽象了对底层数据的访问(可以这么说)。

通常需要这种情况的地方是测试,除了 CakePHP 会话对象,它必须在内部将数据写入 $_SESSION 超全局变量,其他超全局变量如 {如果您使用 CakePHP 提供的 API,则不会填充 {1}}、$_GET$_POST 等,而是将数据写入请求对象中,该对象通过自己的 API 公开数据.因此,例如,如果您要直接在代码中访问 $_COOKIE,然后在像 $_POST 这样的测试中传递 POST 数据,则您的代码将看不到数据,因为它会直接落在请求中对象而不是 $this->post('/url',$postData) 超全局变量。

就身份验证示例而言,身份验证中间件可以通过谁知道在哪里的数据、会话、cookie、令牌等获取身份,同样它可以在任何地方持久化身份、会话、cookie等,你的应用程序的内层不应该关心这样的实现细节,他们通过组件获取身份,或者从请求对象中获取身份,就是这样,他们不需要知道其他任何事情,那么你可以轻松更改身份验证的处理方式,而不会破坏应用程序的其余部分。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...