cakephp:如何在自定义isAuthorized模型方法中设置flash消息?

时间:2010-08-12 06:03:11

标签: cakephp

嗨,我对cakephp比较新。我尝试创建一个简单的应用程序作为学习和实践。 我使用Auth组件实现了一个简单的用户处理系统。我在用户模型中制作了自定义isAuthorized方法。 注册后,用户需要激活他/她自己才能登录。如果用户未处于活动状态,则Authorized会返回false,并且我还要通知用户他未被激活。 但是我不知道如何在这个方法中设置flash消息(我尝试没有成功)。

function isAuthorized($user, $controller, $action) { 
 // We have simply user-rights system. There are admins and non-admins.
 // This function makes a decision if the user have rights to do what requested.
  if($user['User']['active']==0) { // if the user has not been activated yet then gets no rights
   $authed=false;
   $this->Auth->authError = __("Please activate your user first!",true);
  } else {
   $this->Auth->authError = __("Sorry, you do not have access to this area.",true);
   if($user['User']['admin']==1) { //all admins has all rights
    $authed=true;
   } else {
    if($controller=='Areas' or $controller=='Rooms' or $controller=='Categories') {
     if($action=='read') {
      $authed=true;
     } else {
      $authed=false; //non-admin users are not authorized to add or edit rooms or areas
     }
    } else {
     $authed=true; // however they are allowed to do other tasks. the per task rights are controlled within the controllers
    }
   }
  }
  //debug($authed);
  return $authed;

如你所见,我试过,但我失败了:)它不起作用。

我也试过把

$this->Auth->authError = __("Please activate your user first!",true);

在用户控制器登录()中没有成功

1 个答案:

答案 0 :(得分:1)

我意识到Auth组件比控制器方法更早被激活,并且如果用户未经授权则采取行动,这意味着在控制器有机会修改authError之前重定向。这就是我得到“标准”authError的原因。

当我使用自定义授权功能(在模型中)时,用户已经过身份验证(如果有条目)并且已设置会话变量的Auth部分。 因此,如果我检查会话auth数据,我可以在控制器中决定用户是否已经过操作且未激活。然后我设置一条flash消息,以便用户通过auth组件的auth错误消息(无权访问该区域)和另一条消息作为正常的flash消息来激活他/她自己。

function login() {
    if(empty($this->Auth->data) and $this->Session->read('Auth.User.active')===0){
        $this->Session->setFlash(__('Please activate your user first.',true));
    }
}

我认为这不是解决这个问题的最优雅方式;)但我是网络编程和cakephp的新手。