我有一个CakePHP 1.3应用程序,它有一个登录系统,运行良好。它使用带有用户表的数据库,该表在创建此应用程序之前就已存在。
我在 AppController 中使用验证。登录功能类似于
function login() {}
它位于 users_controller 。
正如我所说的,一切正常,但我在尝试添加新功能时遇到了问题。我想在登录过程中检测用户是否引入了登录/密码的特定组合(假设 admin / adminpwd )。如果是这样,登录应该是成功的,他将被带到管理区域(/ admin / index)。否则,登录过程应该照常工作。
一旦进入此管理区域(由 admin_controller 控制),此用户应该能够执行对他独有的某些操作,对其他用户执行no(甚至如果他们在浏览器上输入/ admin / 操作)。
我已经阅读过关于ACL的内容,可能它对此有所帮助,但对于我真正需要的内容来说似乎太复杂了。有没有简单的方法来做到这一点?我想我应该修改登录功能,但我真的不知道究竟是怎么回事,如果还有什么我应该改变......有什么想法吗?
答案 0 :(得分:2)
是的,ACL非常复杂(而且功能强大)。但在您的情况下,我建议在用户表中创建一个“组”字段,以区分用户的角色。因此,如果您愿意,可以在以后拥有更多管理员。它比users_controller
中的某个登录凭据的硬编码更灵活。
您需要做几件事:
告知Auth组件在用户登录后将控制权转移给您,以便您可以确定其组并相应地重定向它们。
检查组中的用户是否正在访问其他组的操作:如果不这样做,普通用户只需要登录,他们就可以输入admin url(如果他们知道的话)他们可以做管理员可以做的一切。此检查可能会在app_controller中的before_something_()
中完成,也可以在某个地方点按Auth。
我不记得所有细节,但你可以在Cake Cookbook中获得所需的一切。祝你好运!
答案 1 :(得分:1)
让我们看一些代码......
class UsersController extends AppController {
// we're moving the variable to AppController!
public function login() {
$usrInfo = $this->Auth->user();
if (isset($usrInfo) {
// this index name might not be right. I'm going off memory please check this!
if (in_array($usrInfo['username'], $this->adminUsers)) {
// do your code here for admin users.
// could be a redirect or just changing the layout used
} else {
// is a user that is logged in but not in our admin list
}
}
}
要测试用户是否已登录,您需要执行以下操作:
class AppController extends Controller {
protected $adminUsers = array('joe_blow_uname', 'jane_blow_uname');
public function beforeFilter() {
$routing = Configure::read('Routing.admin');
$usrInfo = $this->Auth->user();
if (isset($this->params[$routing]) && isset($usrInfo)) {
if (!in_array($usrInfo['username'], $this->adminUsers)) {
// do code here for non-admin users using /admin prefix
}
}
}
}
如果这没有用,请告诉我。
或者更坏的事情......
编辑:
这显然不是最好的方法。 ACL或在数据库中设置某种组可能会更好。但是,对于小型网站来说,它是一种相对快速且非常脏的方式,应该可以正常工作。