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