我正在寻找有关如何为我的应用程序创建安全身份验证/授权模型的一些建议。我正在为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有一个安全插件,但我宁愿自己创建自己的插件。
谢谢!
答案 0 :(得分:0)
所以...你想重新发明轮子? 好,去吧。我只想告诉你一个抬头。
首先,让我们从一些非常基本的东西开始吧。我不会在每个操作中复制/粘贴该代码,而是将其放在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中所做的Users Plugin。
另一个建议(与身份验证的逻辑无关)是,负责coding conventions。它们使您的代码更易于阅读和理解。另外,尽量早点回来并避免嵌套你的条件。
我的祝福在你的学习过程中。