如何将isAuthorized和Auth-> allow / deny的功能混合到CakePHP中的一个方法中?

时间:2012-04-24 06:26:44

标签: cakephp authentication

在我的设计中,一个动作有一个等级,0-10需要访问它(0是访客[未登录],10是管理员)。每个用户的等级为0-10。如果您具有等级或更高级别,则可以访问该操作,否则您不能。很好,很简单,这就是我所需要的。

问题在于CakePHP希望我用两个独立的概念来对待动作。我必须将它们标记为Auth->允许/拒绝以确定auth系统是否与它们相关,然后我使用isAuthorized()控制对它们的访问。

isAuthorized对我的需求很有用......除了我想要访问等级0的任何动作必须是Auth-> allow()...然后完全忽略我的isAuthorized方法。如果我拒绝所有页面,登录会在检查isAuthorized之前触发应该排名为0的页面,所以即使我通过它授予授权,该人也必须先登录。

有没有办法将两个系统合并在一起,还是一种简单的方法来替换它?大多数auth系统都很棒,并且在没有我不得不搞砸的情况下照顾我的业务......但这只是尴尬并且当我没有注意到混淆允许/拒绝或某事时会引起问题

谢谢!

2 个答案:

答案 0 :(得分:4)

据我所知,唯一的方法是创建一个访客用户。这是因为Auth组件在你按照你解释的isAuthorized()之前检查用户是否存在。

您可以直接写入会话来完成此操作。这将告诉Auth组件有人登录,因此将调用isAuthorized()方法。

<强> AppController的

public function beforeFilter() {
  // if no one is logged in, log in a guest
  if (!$this->Auth->user()) {
    $this->Session->write(AuthComponent::$sessionKey, array(
      'User' => array(
        'id' => 0
       )
    ));
  }
}

public function isAuthorized($user) {
  $authorized = false;
  if ($this->Auth->user('id') == 0) {
    // public guest user access
  }
  // other logic
  return $authorized;
}

可能更好的方法是使用自定义身份验证对象,它基本上告诉Cake使用该类来帮助进行身份验证。这将逻辑分成一个单独的类,使其更容易测试甚至禁用。

应用/控制器/组件/认证/ GuestAuthenticate.php

App::uses('BaseAuthenticate', 'Controller/Component/Auth');

class GuestAuthenticate extends BaseAuthenticate {
    public function authenticate(CakeRequest $request, CakeResponse $response) {
        // no real authentication logic, just return a guest user
        return array('User' => array('id' => 0));
    }
}

<强> AppController的

public $components = array(
  'Auth' => array(
    'authenticate' => array(
      'Form',
      'Guest' // tell Cake to try Form authentication then Guest authentication
    )
  )
);

public function beforeFilter() {
  if (!$this->Auth->user()) {
    // no user? log in a guest (this will fail form authentication
    // then try guest authentication)
    $this->Auth->login();
  }
}

public function isAuthorized($user) {
  $authorized = false;
  if ($this->Auth->user('id') == 0) {
    // public guest user access
  }
  // other logic
  return $authorized;
}

您可以在此处找到有关自定义身份验证对象的详细信息:http://book.cakephp.org/2.0/en/core-libraries/components/authentication.html

答案 1 :(得分:1)

也许这已经得到了令人满意的处理,但我有一个解决方案。

在我的AppController中,我有以下内容:

    public function isAuthorized($user = null) {
        if (in_array($this->action, $this->Auth->allowedActions)) {
            return true;
        }
        return false;
    }

public function isAuthorized($user = null) { if (in_array($this->action, $this->Auth->allowedActions)) { return true; } return false; } 正如您所发现的,如果您没有明确授权操作,即使允许他们向公众发布,他们也会被拒绝经过身份验证的用户。这段代码只是使isAuthorized()方法符合Auth-&gt; allow()列表中的设置。

它似乎对我有用,所以我希望它有所帮助。