[英]Special Login with Spring Security
我目前工作的公司有一种特殊的身份验证过程。
实际上,一些用户可以拥有相同的登录名和密码。 因此,为了识别它们,用户必须第二次发送他的电子邮件。 但同样,在少数情况下,几个用户可能会担心,然后,用户必须给他的公司ID进行完全身份验证。
所以,我的问题是,在某些情况下,身份验证过程无法在一个步骤中完成 ,这是Spring Security处理的大多数应用程序的默认行为。
所以我的问题是:使用Spring Security实现这种特殊登录过程的最简单方法是什么?
提前致谢。
我不得不做一个类似的两步认证过程。 这听起来很简单,但找到合适的注射位置和正确的覆盖方法并不容易。 基本思想是为中间身份验证(电子邮件检查)提供另一个角色,然后在确认电子邮件后授予完全访问权限。
希望下面的代码提供了一些关于如何为您的场景解决它的好提示。
创建自定义UserDetailsChecker以处理身份验证后检查。 这是确定用户角色的位置。
public class CustomPostAuthenticationChecks implements UserDetailsChecker {
public void check(UserDetails userDetails) {
CustomUser customUser = (CustomUser) userDetails;
if (customUser.needsEmailAuthentication()) {
// Get rid of any authorities the user currently has
userDetails.getAuthorities().clear();
// Set the new authority, only allowing access to the
// email authentication page.
userDetails.getAuthorities().add(new GrantedAuthorityImpl("ROLE_NEEDS_EMAIL_AUTH"));
} else {
userDetails.getAuthorities().add(new GrantedAuthorityImpl("ROLE_AUTHORIZED_USER"));
}
}
创建自定义AuthenticationSuccessHandler。 此类根据用户的角色将用户发送到正确的URL。
public class CustomAuthenticationSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler {
@Override
protected String determineTargetUrl(HttpServletRequest request, HttpServletResponse response) {
String targetUrl = null;
SecurityContext securityContext = SecurityContextHolder.getContext();
Collection<GrantedAuthority> authorities = securityContext.getAuthentication().getAuthorities();
if (authorities.contains(new GrantedAuthorityImpl("ROLE_NEEDS_EMAIL_AUTH"))) {
targetUrl = "/authenticate";
} else if (authorities.contains(new GrantedAuthorityImpl("ROLE_AUTHORIZED_USER"))) {
targetUrl = "/authorized_user_url";
} else {
targetUrl = super.determineTargetUrl(request, response);
}
return targetUrl;
}
在对用户的电子邮件地址进行身份验证后,您需要授予用户对该应用程序的完全访问权限:
public void grantUserAccess(User user) {
SecurityContext securityContext = SecurityContextHolder.getContext();
Authentication auth = securityContext.getAuthentication();
user.getAuthorities().clear();
user.getAuthorities().add(new GrantedAuthorityImpl("ROLE_AUTHORIZED_USER"));
Authentication newAuth = new UsernamePasswordAuthenticationToken(user, auth.getCredentials(), user.getAuthorities());
securityContext.setAuthentication(newAuth);
}
定义自定义身份验证提供程序以注册CustomPostAuthenticationChecks:
<security:authentication-manager>
<security:authentication-provider ref="customAuthenticationProvider" />
</security:authentication-manager>
<bean id="customAuthenticationProvider" class="YourAuthenticationProvider">
<property name="postAuthenticationChecks">
<bean class="CustomPostAuthenticationChecks"/>
</property>
</bean>
如果您使用标准的form-login标记,则可以轻松定义自定义AuthenticationSuccessHandler:
<security:form-login authentication-success-handler-ref="customAuthenticationSuccessHandler">
...
<bean id="customAuthenticationSuccessHandler" class="CustomAuthenticationSuccessHandler"/>
为/ authenticate URL添加新的角色拦截规则,因此只有需要更多身份验证的用户才能访问该页面。
<security:intercept-url pattern="/authenticate/**" access="hasRole('ROLE_NEEDS_EMAIL_AUTH')" />
<security:intercept-url pattern="/authorized_user_url/**" access="hasRole('ROLE_AUTHORIZED_USER')" />
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.