var*_*s91 1 authorization cakephp cakephp-3.0
我已经按照教程和所有CakePHP授权指南,我无法调用我的isAuthorized()方法.我的理解(纠正我,如果我错了,这是令人难以置信的可能)是通过委派做授权给特定的控制器'authorize'->['Controller']中AppController.php,当UsersController的方法被调用,在这种情况下,"添加",UsersController将运行isAuthorized()我定义的方法.我正在测试看看这个方法是否在isAuthorized()调用时输出flash->错误消息,但没有任何反应.如果我明确地调用isAuthorized($hardcodeduser)我的beforeFilter()方法它将工作,但只有我硬编码用户.
该方法应该起作用的方式是:如果注册用户请求添加/创建新用户,系统将检查用户是否具有管理员/员工级权限(在数据库中只是0或1值)如果用户没有权限,则会重定向到主屏幕,并显示"您无权访问该功能"的错误消息.
任何帮助或建议或其他链接将非常感谢!
class AppController extends Controller {
public $components = ['Flash', 'Auth', 'Session'];
public function initialize() {
$this->loadComponent('Flash');
$this->loadComponent('Auth', [
'authorize' => ['Controller'],
'loginRedirect' => [
'controller' => 'Articles',
'action' => 'index'
],
'logoutRedirect' => [
'controller' => 'Pages',
'action' => 'display',
'home'
]
]);
}
public function beforeFilter(Event $event) {
$this->Auth->authorize = 'Controller';
}
public function isAuthorized($user) {
if(isset($user['is_staff']))
return true;
return false;
}
}
class UsersController extends AppController {
public function beforeFilter(Event $event) {
parent::beforeFilter($event);
$this->Auth->allow(['logout']);
}
public function isAuthorized($user) {
$this->Flash->error(__('Test Message PLEASE WORK'));
if($this->request->action === 'add') {
$isStaff = $user['is_staff'];
if($isStaff == 0) {
$this->redirect($this->Auth->redirectUrl());
$this->Flash->error(__('Not authorized to access this function'));
return false;
}
}
return parent ::isAuthorized($user);
}
}
Run Code Online (Sandbox Code Playgroud)
通常,您的假设是正确的,Controller::isAuthorized()将在使用控制器授权处理程序时自动调用.
代码的问题在于,在您的UsersController::beforeFilter()方法中,您明确允许add每个人访问该方法(它甚至不需要身份验证):
$this->Auth->allow(['logout', 'add']);
Run Code Online (Sandbox Code Playgroud)
您必须了解,一旦允许方法,auth组件将不再进行进一步检查,请参阅AuthComponent :: startup().
另请注意,您无需手动重定向和设置Flash消息,组件将为您执行此操作,您只需使用authError和unauthorizedRedirect选项进行相应配置,请参阅Cookbook>组件>身份验证>配置选项
小智 8
当我们关注Cake博客教程时,他们犯了一个小错误,从未调用过"isAuthorized"函数.我确实花了一些时间来研究它.解决方案是在加载组件"Auth"时添加此行:
'authorize' => array('Controller'),
Run Code Online (Sandbox Code Playgroud)
所以代码看起来应该是这样的:
$this->loadComponent('Auth', [
'loginRedirect' => [
'controller' => 'Articles',
'action' => 'index'
],
'logoutRedirect' => [
'controller' => 'Pages',
'action' => 'display',
'home'
],
'authorize' => array('Controller'),
]);
Run Code Online (Sandbox Code Playgroud)
希望它有助于节省一些时间:)