我正在寻找一些关于如何为我的应用程序创建安全身份验证/授权模型的建议。我是为CakePHP写这篇文章的,但我希望能够将这个模型应用于任何应用程序。如果我能对我的模型以及如何让它变得更好有意见,我会非常感激。这就是我所拥有的:
我想保护的每个视图都有以下代码,它是它的控制器:
$getUser= $this->Session->read('get_logged_user');
if($getUser == null){
//no credentials, redirect
$this->render('../Elements/User/login');
}else{
if($getUser->isAuthenticated==false){
//not authenticated
$this->render('../Elements/User/login');
}else{
//its ok, show the page. if needs to check roles, iterate of the roles array
}
}
从本质上讲,我会检查是否有正确的会话可用。如果不是,他们从未登录过,所以重定向到登录页面。如果是,请检查授权。我的会话是一个由以下内容组成的类:名字/姓氏、用户名、角色数组和isAuthenticated布尔值。当用户登录到我的应用程序时,会创建此对象并将其放入会话中。该类根据数据库进行身份验证,并提取用户的所有基本信息(名称、角色等)。应用程序可以进一步使用这些角色来确定用户可以看到什么和不能看到什么并与之交互。当用户单击"注销"按钮时,此会话对象将被销毁。
这种方法安全吗?我应该也使用代币吗?如果需要更多的代码,请告诉我,我可以发布。我知道cakePhp有一个安全插件,但我宁愿从头开始创建自己的插件。
谢谢!
所以。。。你想重新发明轮子吗?当然,去吧。我只想告诉你一个提醒。
首先,让我们从一些非常基本的东西开始。我不会在每个操作中复制/粘贴该代码,而是将其放置在您的AppController中。
public function beforeFilter() { //called in all your controller actions
parent::beforeFilter();
$mySession = $this->Session->read('yourSession');
if ($mySession === null) {
$this->render('something');
return;
}
if (!$mySession->isAuthenticated()) {
$this->render('login');
return;
}
//the rest of your logic
}
这种方法非常基本,你可能想把它封装在一个组件中,这样你就可以在另一个应用程序中使用它,或者你甚至可以创建一个插件,这是这种情况下的最佳解决方案。
如果你不想进入Auth的内部,那么你可以看看我们在CakeDC中做的用户插件。
另一个建议(与身份验证逻辑无关)是,注意编码约定。它们使您的代码更易于阅读和理解。另外,尽量早点回来,避免嵌套条件句。
在你的学习过程中,我致以最良好的祝愿。