CakePhp认证:问题

CakePhp认证:问题,php,authentication,cakephp,Php,Authentication,Cakephp,我必须进行cakePhp身份验证,我希望使用“Auth”组件。我想看看它是否符合我的要求: 我需要用他们的电子邮件或他们的客户ID(当然还有一个额外的密码)对用户进行身份验证。我找不到是否可以有两个(或更多)字段来进行身份验证 我有几个部分需要认证。但我需要不同的粒度: 对于某些事情,不应该访问整个控制器(如果可能,例外情况除外(例如,除登录/注册操作外的所有“用户”控制器),对于其他我真正需要的是整个控制器(例如,购物车控制器) 有时我需要的是,只有一些操作在没有被记录的情况下是不可用的

我必须进行cakePhp身份验证,我希望使用“Auth”组件。我想看看它是否符合我的要求:

  • 我需要用他们的电子邮件或他们的客户ID(当然还有一个额外的密码)对用户进行身份验证。我找不到是否可以有两个(或更多)字段来进行身份验证

  • 我有几个部分需要认证。但我需要不同的粒度:

    • 对于某些事情,不应该访问整个控制器(如果可能,例外情况除外(例如,除登录/注册操作外的所有“用户”控制器),对于其他我真正需要的是整个控制器(例如,购物车控制器)
    • 有时我需要的是,只有一些操作在没有被记录的情况下是不可用的
    • 有时我需要只显示视图的一部分(例如,未显示登录元素)
  • 组件是否管理密码更改之类的操作?因为如果用户更改其密码,我需要确保他没有断开连接

非常感谢您对Auth的帮助

,您需要正好有两个字段(您可以指定)进行身份验证。一个字段(密码)将被散列。是的,您需要的所有访问级别都可以在Auth中指定:

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

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


wut?

使用Auth,您需要正好有两个字段(可以指定)进行身份验证。一个字段(密码)将被散列。是的,可以在Auth中指定您想要的所有访问级别:

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

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

wut?

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

您可以在不同的控制器中指定Auth应允许已验证用户使用的部分。请参阅

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

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

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

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

您可以在不同的控制器中指定Auth应允许已验证用户使用的部分。请参阅

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

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


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

Auth并不能完全按照您的要求进行操作。它只能处理访问操作是否需要用户身份验证。一旦用户登录,Auth就不再关心用户的访问级别

如果您希望使用两个以上的字段,我建议您扩展AuthComponent并重写登录方法以满足您的需要。我从未这样做过,但我认为这相当简单

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

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


(我使用的是CakePHP 2.0,我不知道如果您使用它,您在1.3中扩展AuthComponent会有多容易)

Auth并不能完全按照您的要求进行操作。它只能处理访问操作是否需要用户身份验证。一旦用户登录,Auth就不再关心用户的访问级别

如果您希望使用两个以上的字段,我建议您扩展AuthComponent并重写登录方法以满足您的需要。我从未这样做过,但我认为这相当简单

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

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


(我使用的是CakePHP 2.0,我不知道在1.3中扩展AuthComponent有多容易,如果您使用的话)

对于允许和拒绝部分,可以使用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
对于第一个问题,使用电子邮件或客户id登录不可能直接使用cakephp Auth组件,因为您必须特别定义其中哪一个作为用户名

另一种解决方案是,您可以将Auth组件复制到您的应用程序/控制器/组件中,然后破解代码。 当您收到用户名时,您可以根据电子邮件和客户id对其进行测试,并维护流量


希望这有助于使用Auth组件轻松完成允许和拒绝部分

<
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 );
}
public function beforeFilter() {
  parent::beforeFilter();

  $this->Auth->deny('*');
  $this->Auth->allow( 'login', 'logout' );
}
if( $this->Session->check( 'Auth.User' ) ) { ... }