我整个下午一直在阅读Stack Overflow问题,试图解决这个问题。
我有一个带索引/登录/注销/注册功能的用户控制器,但也有admin_index / admin_add / admin_edit / admin_delete等。
我启用了Auth组件,在我的users_controller中,我试图拒绝访问admin_ *页面Auth.User.role != 'admin'
,当我启用$this->Auth->authorize = 'controller';
时,它拒绝访问site.com/admin / users / page并且即使我的帐户将角色设置为admin,也似乎会终止注销功能。
但是,如果我在i中输入网址,会被重定向回主页。
users_controller.php中
<?php
class UsersController extends AppController {
var $name = 'Users';
function beforeFilter(){
parent::beforeFilter();
$this->Auth->authorize = 'controller';
$this->Auth->allow('register');
}
function isAuthorized() {
if ($this->Auth->user('role') != 'admin') {
$this->Auth->deny('admin_index','admin_view', 'admin_add', 'admin_edit','admin_delete');
}
}
app_controller.php
<?php
class AppController extends Controller {
var $components = array('Auth', 'Session');
function beforeFilter() {
$this->Auth->loginAction = array('controller'=>'users','action'=>'login', 'admin'=>false);
$this->Auth->logoutRedirect = array('controller'=>'users','action'=>'logout');
$this->Auth->loginRedirect = array('controller'=>'shows', 'action'=>'index');
$this->Auth->autoRedirect = false;
$this->Auth->allow('home');
}
我的第二个问题涉及$this->Auth->deny('page');
重定向用户的方式,据我所知它重定向到/但我需要它重定向回用户控制器。
希望一切都有意义,我已经提供了足够的信息..
答案 0 :(得分:8)
问题的根源可能是你的isAuthorized()方法。这应该只返回true或false,并指示经过身份验证的用户是否已授权访问特定操作。
很难说为什么要重定向到主页而不是登录页面。但是你可能在某个地方有其他代码搞砸了。
尝试修改您的代码,如下所示,看看这是否有助于让事情顺利进行:
<强> app_controller.php 强>
<?php
class AppController extends Controller {
var $components = array('Session', 'Auth' => array(
'loginAction' => array('controller'=>'users','action'=>'login', 'admin'=>false),
'logoutRedirect' => array('controller'=>'users','action'=>'logout'),
'loginRedirect' => array('controller'=>'shows', 'action'=>'index'),
'autoRedirect' => false,
'authorize' => 'controller'
);
function beforeFilter() {
$this->Auth->allow('home');
}
function isAuthorized() {
if (!empty($this->params['prefix']) && $this->params['prefix'] == 'admin') {
if ($this->Auth->user('role') != 'admin') {
return false;
}
}
return true;
}
?>
<强> users_controller.php中强>
<?php
class UsersController extends AppController {
var $name = 'Users';
function beforeFilter(){
parent::beforeFilter();
$this->Auth->allow('register');
}
?>
我将所有Auth设置移动到$ components变量中的声明,因为它看起来更干净,并且在那里声明默认值更有意义。但这更多是个人偏好的问题,它不应该对代码的功能产生实际影响。
另请注意,如果将autoRedirect
设置为false,则必须在Users :: login()操作中手动重定向已登录的用户,并使用{{获取loginRedirect
值1}}。
我没有看到任何理由为什么你应该被发送到/当你没有登录并且你试图访问被阻止的动作,但是在你修复上述内容之后可能会更容易理解。 * *
答案 1 :(得分:-1)
你应该这样做......
function beforeFilter()
{
if($this->Auth->user('role')=='admin'){
$this->Auth->allow('admin_view','admin_controls');//put your all admin actions separated by comma
}
else
{
$this->Auth->allow('home');//put your all non-admin actions separated by comma
}
}
希望它能奏效......如果有任何问题让我知道......