当isAuthorized = false
用户被重定向到'/'时,有一种方法可以更改它。我想重定向到用户仪表板(/ users / dashboard),并显示一条闪烁消息,说“禁止访问”或类似内容。
干杯!
public function isAuthorized($user) {
if (isset($user['role']) && $user['role'] === 'admin') {
return true; //Admin can access every action
}
return false; // The rest don't
}
答案 0 :(得分:1)
如果您的控制器正在评估您的isAuthorised变量。
您可以调用重定向功能。
$this->redirect(array('controller' => 'users', 'action' => 'dashboard'));
如果您实际上已经在用户控制器内,请调用
$this->redirect(array('action' => 'dashboard'));
如果没有,你在哪里查看isAuthorised值?
这不是一个理想的解决方案。但是,使用当前内置的AuthComponent
似乎无法做到这一点编辑:添加代码作为示例。
public function isAuthorized($user) {
if (parent::isAuthorized($user)) {
return true;
}
// Authorised actions
if (in_array($this->action, array('dashboard'))) {
return true;
}
// Will break out on this call
$this->redirect(array('controller' => 'users', 'action' => 'dashboard'));
return false;
}
答案 1 :(得分:1)
我认为最好的方法是使用异常并像这样扩展:
AppController.php
public function isAuthorized($user) {
throw new ForbiddenException(__('You are not authorized to access.'));
}
AnotherController.php
public function isAuthorized($user) {
if (isset($user['role']) && $user['role'] === 'admin') {
return true;
}
return parent::isAuthorized($user);
}
使用此代码,您可以管理角色和错误。
答案 2 :(得分:0)
如果他们正在退出,您可以将它们发送到您想要的地方:
$this->Auth->logoutRedirect
我个人会用:
$this->Auth->authError = "You are not authorized to access.";
为了通过flash消息将它们重定向到root用户,通知他们错误。
答案 3 :(得分:0)
AuthComponent的行为是错误的。
简而言之:如果链接访问了URL,则框架能够重建路径,然后重定向到引用页面。否则(通过直接进入url栏)它会失败并重定向到主页。
“bug”已记录在案,将在以后的版本中予以纠正。
答案 4 :(得分:0)
我比@ deep55好一点。
isAuthorized()方法可以抛出异常没问题,但我认为控制器的继承允许我们使用第一个AppController.isAuthorized()来改进授权算法,而不是最后一个。
所以,这是我的解决方案,假设我使用名为Utilisateur的用户模型和名为Role的角色模型。
AppController:
/**
* Parent method
*/
public function isAuthorized($user){
App::uses('Utilisateur','Model');
$User = new Utilisateur();
$isAdmin = $User->hasRole(10,$user['id']);
if ($isAdmin) {
return true;
}
}
/**
* Reject unauthorized actions
*/
public function rejectRequest(){
$errorMessage = __("Sorry, you can't do this.");
if ($this->isRest()) {
throw new ForbiddenException($errorMessage);
} else {
$this->Auth->authError = $errorMessage;
$this->Auth->flash['params']['class'] = 'alert-danger';
}
return false ;
}
Utilisateur模型:
/**
* hasRole method return true if the user belongs to the correct role group
*/
public function hasRole($role_id, $user_id){
if (!isset($user_id)) {
if (!empty($this->id)) {
$user_id = $this->id ;
} else throw new Exception("Error, parameter $user_id is missing", 1);
}
$user = $this->find('first',array(
'conditions' => array('Utilisateur.id' => $user_id),
'fields' => array('id'),
'contain' => array('Role.id')
));
$roles = $user['Role'];
foreach ($roles as $r) {
if ($role_id == $r['id']) {
return true;
}
}
}
最后,在一个特定的控制器中:
/**
* Child method
*/
public function isAuthorized($user){
if (parent::isAuthorized($user)) {
return true;
}
if ( false ) {
return true ;
}
if ( false ) {
return true ;
}
return $this->rejectRequest() ;
}
答案 5 :(得分:0)
对于Cake版本2,如documentation for AuthComponent中所述:
<强> AuthComponent :: $ unauthorizedRedirect 强>
控制未经授权的访问。默认情况下,未经授权的用户被重定向到引用者URL或AuthComponent :: $ loginRedirect或'/'。如果设置为false,则抛出ForbiddenException异常而不是重定向。
您可以使用unauthorizedRedirect
属性将AuthComponent配置为在一个位置将您重定向到自定义页面。
只需将其设置为将Auth配置为组件的位置
'Auth' => array(
... other settings...,
'unauthorizedRedirect' => '/users/dashboard'
)
重定向后,您可以打印由authError
属性
echo $this->Session->flash();
echo $this->Session->flash('auth');
但对于任何身份验证或授权错误,它都是相同的消息。