我已经按照教程和所有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);
}
}
答案 0 :(得分:9)
通常,您的假设是正确的,使用控制器授权处理程序时将自动调用Controller::isAuthorized()
。
您的代码存在的问题是,在UsersController::beforeFilter()
方法中,您明确允许所有人访问add
方法(甚至不需要身份验证):
$this->Auth->allow(['logout', 'add']);
您必须明白,一旦允许某个方法,auth组件将不再进行进一步检查,请参阅AuthComponent::startup()。
另请注意,您无需手动重定向和设置Flash消息,该组件将为您执行此操作,您只需使用authError
和unauthorizedRedirect
选项进行相应配置,见 Cookbook > Components > Authentication > Configuration options
答案 1 :(得分:8)
正如我们关注Cake博客教程, 他们犯了一个小错误,“isAuthorized”功能永远不会被调用。 我确实花了一些时间来研究它。 解决方案是 加载组件“Auth”时添加此行:
'authorize' => array('Controller'),
因此代码看起来像这样:
$this->loadComponent('Auth', [
'loginRedirect' => [
'controller' => 'Articles',
'action' => 'index'
],
'logoutRedirect' => [
'controller' => 'Pages',
'action' => 'display',
'home'
],
'authorize' => array('Controller'),
]);
希望它有助于节省一些时间:)
答案 2 :(得分:1)
从cakephp 3.x文档:您可以使用数组在控制器的beforeFilter()或initialize()方法中配置授权处理程序:
// Basic setup
$this->Auth->config('authorize', ['Controller']);
// Pass settings in
$this->Auth->config('authorize', [
'Actions' => ['actionPath' => 'controllers/'],
'Controller'
]);