CakePhp Auth:问题

时间:2011-09-02 06:38:36

标签: php authentication cakephp

我要做一个cakePhp身份验证,我希望使用“Auth”组件。我正试图看看它是否符合我的要求:

  • 我需要使用他们的电子邮件或他们的customerId对用户进行身份验证(当然还有一个附加密码)。我无法找到是否可以有两个(或更多)可以进行身份​​验证的字段

  • 我有几个部分需要进行身份验证。但我需要不同的粒度:

    • 对于某些事情,它是整个控制器不应该可访问(如果可能的例外(例如所有“用户”控制器,除了登录/注册动作)对于其他我真的需要它是整个控制器(例如,推车控制器)
    • 有时候我需要的是只有一些操作不会被记录而无法记录
    • 有时我需要只显示部分视图(例如,不显示登录元素)
  • 组件是否管理密码更改等操作?因为如果用户更改了密码,我需要他没有断开连接。

非常感谢您的帮助

5 个答案:

答案 0 :(得分:2)

简而言之,是的,你可以做这些事情,但在我看来,ACL可能对你的需求有点过分(但如果有任何开放的话,我也倾向于避开ACL)。为了你的观点:

  • 正如Ivo建议的那样,您需要一个自定义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 )透明地重新验证用户身份。我这样做,例如,当用户注册时。我不希望他/她必须登录,所以我只是自动登录。

答案 1 :(得分:1)

Auth并不能完全满足您的需求。它只能处理是否需要用户身份验证来访问操作。用户登录后,Auth不再关心用户的级别访问权限。

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

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

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

(我正在使用CakePHP 2.0,我不知道如果你正在使用它,你可以轻松扩展1.3中的AuthComponent)

答案 2 :(得分:0)

使用Auth,您需要准确地拥有2个字段(您可以指定)进行身份验证。将对一个字段(密码)进行哈希处理。是的,您可以在Auth:http://book.cakephp.org/view/1251/Setting-Auth-Component-Variables

中指定所需的所有访问级别

您必须管理密码更改,但如果用户更改密码,用户将无法注销。

  

有时我需要只显示视图的一部分(例如,不显示登录元素)

WUT?

答案 3 :(得分:0)

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

您可以在不同的控制器中指定Auth应允许经过身份验证的用户的哪些部分。请参阅Auth methods

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

  

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

创建一个元素,用于检查Auth-> user()以选择要显示的内容。

答案 4 :(得分:0)

对于允许和拒绝部分,可以使用Auth组件轻松完成。

使用类似

的内容
$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

对于第一个问题 - 使用cakephp Auth组件不能直接使用电子邮件或客户ID进行登录,因为您必须特别定义哪些用作用户名。

替代解决方案是您可以将Auth组件复制到您的应用程序/控制器/组件中并破解代码。 当您收到用户名时,您可以根据电子邮件和客户ID对其进行测试并保持流程。

希望这有帮助