点击上方蓝色字体,选择“标星公众号”
优质文章,第一时间送达
作者 | 大嘤熊
来源 | urlify.cn/Q7JB3e
66套java从入门到精通实战课程分享
在前面的简单登录验证,我们简单整合了SpringSecurity的登录,可以通过自定义设置或者从数据库中读取用户权限类。接下来我们实现一些简单的验证码相关的登录验证。
1、图片验证码登录
其实这里和最初的登录验证没啥区别,只是多了一个验证码的验证过程。我们首先需要清楚认识到SpringSecurity的整个登录认证流程
Spring Security使用UsernamePasswordAuthenticationFilter过滤器来拦截用户名密码认证请求
将用户名和密码封装成一个UsernamePasswordToken对象交给AuthenticationManager处理。
AuthenticationManager将挑出一个支持处理该类型Token的AuthenticationProvider(这里默认为DaoAuthenticationProvider,AuthenticationProvider的其中一个实现类)来进行认证
认证过程中DaoAuthenticationProvider将调用UserDetailService的loadUserByUsername方法来处理认证(可以自定义UserDetailService的实现类)
如果认证通过(即UsernamePasswordToken中的用户名和密码相符)则返回一个UserDetails类型对象,并将认证信息保存到Session中,认证后我们便可以通过Authentication对象获取到认证的信息了。
那么我们添加验证码验证则有如下几种思路:
1.1、登录表单提交前发送 AJAX 验证验证码
这种方式和SpringSecurity毫无关系,其实就是表单提交前先发个 HTTP 请求验证验证码。
1.2、和用户名、密码一起发送到后台,在 Springsecurity中进行验证
最开始我是采用的这种方式,这种方式也是和Spring security 结合的最紧密的方式。
首先需要清楚的是security默认只处理用户名和密码信息。所以我们需要自定义实现WebAuthenticationDetails向其中加入验证码。
public class CustomWebAuthenticationDetails extends WebAuthenticationDetails {
private static final long serialVersionUID = 6975601077710753878L; private final String verifyCode; public CustomWebAuthenticationDetails(HttpServletRequest request) {
super(request); // verifyCode为页面中验证码的name verifyCode = request.getParameter("verifyCode"); } public String getVerifyCode() {
return this.verifyCode; }}
在这个方法中,我们将前台 form 表单中的 verifyCode 获取到,并通过 get 方法方便被调用。这样我们就在验证信息类中添加了验证码的相关信息。自定义了WebAuthenticationDetails,我i们还需要将其放入 AuthenticationDetailsSource 中来替换原本的 WebAuthenticationDetails ,因此还得实现自定义 AuthenticationDetailsSource :
@Component("authenticationDetailsSource")public class CustomAuthenticationDetailsSource implements AuthenticationDetailsSource<HttpServletRequest, WebAuthenticationDetails> {
@Override public WebAuthenticationDetails buildDetails(HttpServletRequest request) {
return new CustomWebAuthenticationDetails(request); }}
该类内容将原本的 WebAuthenticationDetails 替换为了我们的 CustomWebAuthenticationDetails。
然后我们将 CustomAuthenticationDetailsSource 注入Spring Security中,替换掉默认的 AuthenticationDetailsSource。
修改 WebSecurityConfig,将其注入,然后在config()中使用 authenticationDetailsSource(authenticationDetailsSource)方法来指定它。
@Autowiredprivate AuthenticationDetailsSource authenticationDetailsSource;@Overrideprotected void configure(HttpSecurity http) throws Exception { http... // 指定authenticationDetailsSource .authenticationDetailsSource(authenticationDetailsSource) ...}
至此我们通过自定义WebAuthenticationDetails和AuthenticationDetailsSource将验证码和用户名、密码一起带入了Spring Security中,下面我们需要将它取出来验证。
这里需要我们自定义AuthenticationProvider,需要注意的是,如果是我们自己实现AuthenticationProvider,那么我们就需要自己做密码校验了。
@Componentpublic class CustomAut