CakePhp身份验证:问题
我必须做一个cakePhp验证,并且我希望使用“身份验证”组件。我想看看它填补我的要求:CakePhp身份验证:问题
我需要与他们的电子邮件或他们的客户ID,(当然的加成密码)来验证用户身份。我无法找到是否有两个字段(或更多)的身份验证可以完成
-
我有几个部分,我需要进行身份验证。但我需要型动物粒度:
- 对于一些事情,这是整个控制器,它不应该访问的(如果可能的话,出现异常(例如,所有的“用户”控制,除登录/注册动作),其他我真的需要它是整个控制器(例如购物车控制器)
- 有时我需要只有某些操作不可用而不记录
- 有时我需要只显示一部分视图(例如,登录元素不显示)
- 组件ma nage动作像密码更改?因为如果用户更改密码,我需要他没有断开连接。
非常感谢您的帮助
简短的回答是,是的,你可以做这些事情,但在我看来,该ACL可能是矫枉过正满足您的需要(但我也倾向于避免ACL如果有任何根本打开这样做)。为了你的观点:
-
由于伊沃建议,你需要一个定制
UsersController::login()
方法,通过多个领域进行身份验证(如果您的身份验证模式不User
,然后使用适当的控制器)。如果Auth组件的登录方法失败,它会将控制权传递给您的自定义方法login()
。下面是一个项目,我一直工作在一个片段:function login() { # Allow login by either username (legacy) or email. # If no authenticated user exists at this point then the Auth # component's login() method has failed and control has been passed # here for any further handling. Since the expected credentials # (email and password) have failed we're going to check for # username and password. $user = $this->Auth->user(); if(empty($user) && !empty($this->Auth->data['User']['email']) && !empty($this->Auth->data['User']['password'])) { $user = $this->User->find( 'first', array( 'recursive' => -1, 'conditions' => array( 'User.username' => $this->Auth->data['User']['email'], 'User.password' => $this->Auth->data['User']['password'], ) ) ); if(empty($user) || !$this->Auth->login($user)) { # Set the configured flash message b/c login failed after both checks. $this->Session->setFlash($this->Auth->loginError, null, array(), 'auth'); } } $this->redirect($this->Auth->redirect(), null, true); }
-
对于行动上网,只需使用
$this->Auth->allow()
和$this->Auth->deny()
方法在每个相关控制器的beforeFilter()
回调。例如,在UsersController
,你可能想要做这样的事情:public function beforeFilter() { parent::beforeFilter(); $this->Auth->deny('*'); $this->Auth->allow('login', 'logout'); }
-
在景色,那里确定用户是否通过测试
Auth.User
值来确定显示什么/隐藏来自匿名身份验证/认证:if($this->Session->check('Auth.User')) { ... }
如果密码更改,可以透明地通过调用
$this->Auth->login($user_data)
重新认证用户。我这样做,例如,当用户注册时。我不希望他/她必须再登录,所以我只是自动登录。
有了验证,就需要有完全相同2场(您可以指定)进行身份验证上。一个字段(密码)将被散列。是的,您需要的所有访问级别都可以在Auth中指定:http://book.cakephp.org/view/1251/Setting-Auth-Component-Variables
您必须管理密码更改,但如果用户更改密码,则不会注销。
有时我需要,只有视图的一部分不显示(不显示e.g。login元素)
WUT?
创建一个自定义登录(),尝试通过任一方法进行身份验证。 您也可以设置Authenticate变量来执行自定义登录。
您可以在不同的控制器中指定Auth允许认证用户的部分。见Auth methods。
您也可以使用ACL(请参阅完整的Cake ACL教程等)来控制粒度权限。
有时我需要,只有视图的一部分不被显示
创建该检查Auth-元素>用户(),选择什么样的内容来显示。
验证不会完全按照您想要的方式进行。它只能处理是否需要用户认证才能访问某个动作。用户登录后,Auth不再关心用户的级别访问权限。
如果您希望使用两个以上的字段,我建议您扩展AuthComponent并重写登录方法以满足您的需求。我从来没有做过,但我认为这是相当容易的。
关于您的访问级别,我会使用ACL来管理对所有控制器的操作的访问。设置完成后,您必须手动设置每个操作的权限,可以使用社区编写的插件之一或手动设置。
如果您希望禁用部分视图,则需要阅读权限以从此处测试用户的访问级别。一个好的方法是在用户登录时在缓存文件或会话中保存权限,以使其在视图中可用。然后编写测试并回应需要的内容。
(我使用CakePHP 2.0,我不知道该怎么轻易就可以,如果你使用它在1.3扩展AuthComponent)
ACL可能对此有点矫枉过正,我只需要“验证”或不需要 – J4N
对于允许和拒绝的一部分能够与验证组件轻松完成。
使用类似
$this->allow('*'); // to allow every thing
$this->deny('*'); // to deny every thing
$this->allow('login', 'signup'); // allows login and sign up without being logged in
$this->deny('profile', 'password'); // need to be logged into to access profile and password and rest of the actions are allowed.
对于密码的变化,你可以保存更改的密码数据库和力注销用户和重定向他再次
$this->Auth->logout(); this forces the user to logout of cakephp Auth
登录对于第一个问题 - 使用电子邮件或客户ID登录不可能直接使用cakephp Auth组件,因为您将不得不定义它们中的哪一个充当用户名。
另一种解决方案是,您可以将Auth Component复制到您的应用程序/控制器/组件并破解代码。 当您收到用户名称时,您可以针对电子邮件和客户ID进行测试并维护流量。
希望这有助于
这似乎是我需要的,但代码必须在哪里?在每个控制器?在有关的控制器?在一个控制器的具体方法?这是一个耻辱,我们不能自己做一个身份验证 - >登录()与新凭据 – J4N
在控制器的beforeFilter()中添加此。 –
谢谢,我已经足够从好的方向开始 – J4N