如何创建一个自定义表单密码身份验证

编辑该页面

警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 3.4,不再维护。

这个页面的更新版本Symfob娱乐下载ony 6.2(当前的稳定版本)。

如何创建一个自定义表单密码身份验证

提示

看看如何创建一个自定义的身份验证系统,保安吗一个更简单、更灵活的方式完成自定义的身份验证任务。

假设您希望允许访问你的网站只有下午2点和4点之间UTC。在本文中,您将学习如何做一个登录表单(即你的用户提交他们的用户名和密码)。

密码身份验证

首先,创建一个新类,它实现了SimpleFormAuthenticatorInterface。最终,这将允许您创建自定义逻辑验证用户:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
/ / src / AppBundle /安全/ TimeAuthenticator.php名称空间AppBundle\安全;使用ob娱乐下载\组件\HttpFoundation\请求;使用ob娱乐下载\组件\安全\核心\身份验证\令牌\TokenInterface;使用ob娱乐下载\组件\安全\核心\身份验证\令牌\UsernamePasswordToken;使用ob娱乐下载\组件\安全\核心\编码器\UserPasswordEncoderInterface;使用ob娱乐下载\组件\安全\核心\异常\BadCredentialsException;使用ob娱乐下载\组件\安全\核心\异常\CustomUserMessageAuthenticationException;使用ob娱乐下载\组件\安全\核心\异常\UsernameNotFoundException;使用ob娱乐下载\组件\安全\核心\用户\UserProviderInterface;使用ob娱乐下载\组件\安全\Http\身份验证\SimpleFormAuthenticatorInterface;TimeAuthenticator实现了SimpleFormAuthenticatorInterface{私人美元编码器;公共函数__construct(UserPasswordEncoderInterface美元编码器){美元- >编码器=美元编码器;}公共函数authenticateToken(TokenInterface美元令牌,UserProviderInterface美元userProvider,美元providerKey){试一试{美元用户=美元userProvider- >loadUserByUsername (美元令牌- >getUsername ());}(UsernameNotFoundException美元异常){/ /注意:此消息将被返回给客户端/ /(所以不要把任何不受信任的消息/错误字符串)CustomUserMessageAuthenticationException (无效的用户名或密码的);}美元currentUser=美元令牌- >getUser ();如果(美元currentUser运算符用户界面){如果(美元currentUser- >getPassword () = =美元用户- >getPassword ()) {BadCredentialsException (凭证已被改变从另一个会话。);}}其他的{如果(= = = (美元givenPassword=美元令牌- >getCredentials ())) {BadCredentialsException (“给定密码不能是空的。”);}如果(!美元- >编码器- >isPasswordValid (美元用户,美元givenPassword)){BadCredentialsException (给定的密码是无效的。);}}美元currentHour=日期(‘G’);如果(美元currentHour<14| |美元currentHour>16){/ /注意:此消息将被返回给客户端/ /(所以不要把任何不受信任的消息/错误字符串)CustomUserMessageAuthenticationException (“你只能登录2和4之间!”[],/ /消息数据412年/ / HTTP 412失败的先决条件);}返回UsernamePasswordToken (美元用户,美元用户- >getPassword (),美元providerKey,美元用户- >将getRoles ());}公共函数supportsToken(TokenInterface美元令牌,美元providerKey){返回美元令牌运算符UsernamePasswordToken & &美元令牌- >getProviderKey () = = =美元providerKey;}公共函数createToken(请求美元请求,美元用户名,美元密码,美元providerKey){返回UsernamePasswordToken (美元用户名,美元密码,美元providerKey);}}

它是如何工作的

太棒了!你现在只需要设置一些如何创建一个自定义表单密码身份验证。但首先,你可以找到更多关于这个类中的每个方法。

1)createToken ()

Symfoob娱乐下载ny开始处理请求时,createToken ()被调用时,您将创建一个在哪里TokenInterface对象包含任何你需要的信息authenticateToken ()对用户进行身份验证(例如用户名和密码)。

无论你创建令牌对象将被传递给你稍后authenticateToken ()

2)supportsToken ()

Symfonob娱乐下载y通电话后createToken (),它会调用supportsToken ()在你的类(和任何其他验证听众)找出谁应该处理令牌。这只是一种方式,允许多个身份验证机制用于相同的防火墙(例如,你可以首先尝试通过证书认证用户或一个API密匙和回到表单登录)。

大多数情况下,你只需要确保这个方法返回真正的的令牌已经创建的createToken ()。你的逻辑应该看起来就像这个例子。

3)authenticateToken ()

如果supportsToken ()返回真正的现在ob娱乐下载,Symfony会调用authenticateToken ()。你的工作是检查令牌被首先得到允许登录用户对象,然后通过用户提供者,通过检查密码和当前时间。

请注意

你如何得到的“流”用户对象,并确定是否令牌是有效的(如检查密码),根据您的要求可能会有所不同。

最终,你的工作是返回一个令牌对象是“验证”(即有至少1角色组)和的用户对象里面。

在这种方法中,密码编码器需要检查密码的有效性:

1
美元isPasswordValid=美元- >编码器- >isPasswordValid (美元用户,美元令牌- >getCredentials ());

这个服务已经在Symfony和它使用的密码算法在安全配置中配置(如。ob娱乐下载security.yml下)编码器关键。下面,您将看到如何注入,TimeAuthenticator

配置

现在,确保你的TimeAuthenticator被注册为一个服务。如果你使用默认的服务。yml配置,自动发生。

最后,激活服务防火墙使用部分的安全配置simple_form关键:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9 10 11 12
# app / config / security.yml安全:#……防火墙:secured_area:模式:^ /管理#……simple_form:身份验证:AppBundle \安全\ TimeAuthenticatorcheck_path:login_checklogin_path:登录

simple_form正常的关键有相同的选项form_login与额外的选项,但是身份验证键指向新服务。有关详细信息,请参见安全配置引用(SecurityBundle)

如果创建一个登录表单通常是你或者你不明白check_pathlogin_path选项,请参阅如何自定义表单登录后重定向

这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。