2011-09-02 176 views
0

我必须做一个cakePhp验证,并且我希望使用“身份验证”组件。我想看看它填补我的要求:CakePhp身份验证:问题

  • 我需要与他们的电子邮件或他们的客户ID,(当然的加成密码)来验证用户身份。我无法找到是否有两个字段(或更多)的身份验证可以完成

  • 我有几个部分,我需要进行身份验证。但我需要型动物粒度:

    • 对于一些事情,这是整个控制器,它不应该访问的(如果可能的话,出现异常(例如,所有的“用户”控制,除登录/注册动作),其他我真的需要它是整个控制器(例如购物车控制器)
    • 有时我需要只有某些操作不可用而不记录
    • 有时我需要只显示一部分视图(例如,登录元素不显示)
  • 组件ma nage动作像密码更改?因为如果用户更改密码,我需要他没有断开连接。

非常感谢您的帮助

回答

2

简短的回答是,是的,你可以做这些事情,但在我看来,该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)重新认证用户。我这样做,例如,当用户注册时。我不希望他/她必须再登录,所以我只是自动登录。

+0

谢谢,我已经足够从好的方向开始 – J4N

0

有了验证,就需要有完全相同2场(您可以指定)进行身份验证上。一个字段(密码)将被散列。是的,您需要的所有访问级别都可以在Auth中指定:http://book.cakephp.org/view/1251/Setting-Auth-Component-Variables

您必须管理密码更改,但如果用户更改密码,则不会注销。

有时我需要,只有视图的一部分不显示(不显示e.g。login元素)

WUT?

+0

我认为他意味着在视图中有一个if语句,只显示某个HTML片段等,如果用户通过身份验证。我猜你可以用if(!$ this-> Auth-> user()){}来做到这一点,但我不确定如何使它更精细。 – Joseph

+0

@Joseph:是的,但我只需要知道用户是否已通过身份验证,所以它应该足够了 – J4N

0

创建一个自定义登录(),尝试通过任一方法进行身份验证。 您也可以设置Authenticate变量来执行自定义登录。

您可以在不同的控制器中指定Auth允许认证用户的部分。见Auth methods

您也可以使用ACL(请参阅完整的Cake ACL教程等)来控制粒度权限。

有时我需要,只有视图的一部分不被显示

创建该检查Auth-元素>用户(),选择什么样的内容来显示。

0

验证不会完全按照您想要的方式进行。它只能处理是否需要用户认证才能访问某个动作。用户登录后,Auth不再关心用户的级别访问权限。

如果您希望使用两个以上的字段,我建议您扩展AuthComponent并重写登录方法以满足您的需求。我从来没有做过,但我认为这是相当容易的。

关于您的访问级别,我会使用ACL来管理对所有控制器的操作的访问。设置完成后,您必须手动设置每个操作的权限,可以使用社区编写的插件之一或手动设置。

如果您希望禁用部分视图,则需要阅读权限以从此处测试用户的访问级别。一个好的方法是在用户登录时在缓存文件或会话中保存权限,以使其在视图中可用。然后编写测试并回应需要的内容。

(我使用CakePHP 2.0,我不知道该怎么轻易就可以,如果你使用它在1.3扩展AuthComponent)

+0

ACL可能对此有点矫枉过正,我只需要“验证”或不需要 – J4N

0

对于允许和拒绝的一部分能够与验证组件轻松完成。

使用类似

$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进行测试并维护流量。

希望这有助于

+0

这似乎是我需要的,但代码必须在哪里?在每个控制器?在有关的控制器?在一个控制器的具体方法?这是一个耻辱,我们不能自己做一个身份验证 - >登录()与新凭据 – J4N

+0

在控制器的beforeFilter()中添加此。 –