我创建了一个带有管理部分的小项目。 我正在使用管理员路由重定向到我的控制器中的管理员操作。 该网站的页面可供所有人使用,无需登录。 要访问/ admin或/ admin / users等,您必须登录。
我已将管理操作传播到我的控制器,例如“admin_login”,“admin_users”,...
所以我的问题是,当有人进入/ admin / users或其他管理页面时,如果用户在会话中,我必须检查每个控制器操作,否则重定向到登录表单。
有没有办法在一个地方做到这一点?我在AppController类中使用了一个beforefilter,但由于我的控制器包含“标准”操作和“管理”操作的组合,因此将它放在AppController中对于这种情况不起作用,因为它总是在登录时重定向。
在我的AppController中,我有这段代码
public function beforeFilter(){
if(!$this->Session->check('User')){
$this->redirect('/admin/users/login');
}
}
当使用这样的东西时,我得到一个无限循环:
public function beforeFilter(){
if(!empty($this->request->params['admin'])){
if(!$this->Session->check('User')){
$this->redirect('/admin/users/login');
}
}
}
答案 0 :(得分:1)
您使用的是admin routes吗?
例如,您应该UsersController
使用login
和signup
方法,这些方法对每个人都是可访问的,而admin_edit
对于需要登录的admin_edit
。
方法/admin/users/edit
对应于网址AppController
在public $components = array('Auth' => array(
'loginAction' => array(
'admin' => false,
'controller' => 'users',
'action' => 'login'),
'loginRedirect' => array('controller' => 'posts', 'action' => 'index'),
'logoutRedirect' => array(
'controller' => 'pages',
'action' => 'display',
'home'),
'authenticate' => array('Form' => array('fields' => array('username' => 'email')))));
中,您应该包含Auth组件。
实施例
UsersController
在public function beforeFilter() {
parent::beforeFilter();
$this->Auth->allow('login', 'register');
}
中,您应该有类似
{{1}}
答案 1 :(得分:0)
我最终使用本教程因为我没有使用Auth而是使用我自己的脚本。 有点过时但有一些调整符合我的需要。
function beforeFilter() {
// if admin url requested
if(isset($this->request->params['admin']) && $this->request->params['admin']) {
// check user is logged in
if( !$this->Session->check('User') ) {
$this->Session->setFlash('You must be logged in for that action.');
$this->redirect('/login');
}
// save user data
$this->_User = $this->Session->read('User');
$this->set('user',$this->_User);
// change layout
$this->layout = 'admin';
}
}