isAuthorized重定向URL cakephp

时间:2012-02-29 22:13:13

标签: cakephp authentication

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
}

6 个答案:

答案 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”已记录在案,将在以后的版本中予以纠正。

请参阅:http://cakephp.lighthouseapp.com/projects/42648/tickets/591-inconsistent-redirect-behaviour-by-auth-acl

答案 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');

但对于任何身份验证或授权错误,它都是相同的消息。