在我的设计中,一个动作有一个等级,0-10需要访问它(0是访客[未登录],10是管理员)。每个用户的等级为0-10。如果您具有等级或更高级别,则可以访问该操作,否则您不能。很好,很简单,这就是我所需要的。
问题在于CakePHP希望我用两个独立的概念来对待动作。我必须将它们标记为Auth->允许/拒绝以确定auth系统是否与它们相关,然后我使用isAuthorized()控制对它们的访问。
isAuthorized对我的需求很有用......除了我想要访问等级0的任何动作必须是Auth-> allow()...然后完全忽略我的isAuthorized方法。如果我拒绝所有页面,登录会在检查isAuthorized之前触发应该排名为0的页面,所以即使我通过它授予授权,该人也必须先登录。
有没有办法将两个系统合并在一起,还是一种简单的方法来替换它?大多数auth系统都很棒,并且在没有我不得不搞砸的情况下照顾我的业务......但这只是尴尬并且当我没有注意到混淆允许/拒绝或某事时会引起问题
谢谢!
答案 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()列表中的设置。
它似乎对我有用,所以我希望它有所帮助。