security登录的拦截器为 UsernamePasswordAuthenticationFilter ,其中这里默认登录访问接口为/login,且为post请求方式
, attemptAuthentication ( ) 这个方法就是认证方法,最终会将客户端传来的username 和 password 封装成,UsernamePasswordAuthenticationToken 对象,该对象本质也是Authentication对象,
因为UsernamePasswordAuthenticationToken继承了AbstractAuthenticationToken,而AbstractAuthenticationToken实现了Authentication
在UsernamePasswordAuthenticationFilter 的认证方法最后一行代码为 this.getAuthenticationManager().authenticate(authRequest);,这里就是需要传入一个Authentication对象及其子类,这也是我为什么解释
UsernamePasswordAuthenticationToken 本质也是Authentication对象的原因了,下面我们点进去看看,会进入一个AuthenticationManager的接口中,这个接口的实现类ProviderManager提供了具体的认证方法,并最终确定
由哪种provider来处理该方式的认证,当前的认证是有AbstractUserDetailsAuthenticationProvider来处理的,那么接着往下看
下面我们先看看 retrieveUser( )是如何通过用户名来查找数据库的,这个方法是由DaoAuthenticationProvider实现类来具体实现的,下面代码分析
我们自己定义的UserServiceImpl实现重现 loadUserByUsername( ) 方法,如下
用户查到之后我们需要判断用户的状态,下面接着看 preAuthenticationChecks.check(user);
当用户状态都符合,且为一个正常用户时,security就会进行密码校验,下面接着看this.additionalAuthenticationChecks(user, (UsernamePasswordAuthenticationToken)authentication);
到此就完成了所有的认证,这时security就会把认证后的对象放入securityContext域中,重新生成一个UsernamePasswordAuthenticationToken对象,设置它的认证状态为true,并跳转我们在配置文件中或配置类中指定成功后要跳转的页面或接口
default-target-url="/index.jsp"
认证成功后的业务逻辑处理
当我们选择了remeberMe时,security会生成一个token放入到客户端的cookie中
如果配置文件或配置类中开启remember-me,
,就会判断remember-me 有没有值,而且值的要求是否符合security的要求,默认remember是不开启的
如果选择了remember-me则由TokenBasedRememberMeServices这个类去处理, 生成remember-me的token 后,可以选择直接设置cookie返回给客户端
也可以选择持久化token,同时设置cookie响应到客户端,这是由 PersistentTokenBasedRememberMeServices所实现
如果我们没有选择remember-me ,将由NullRememberMeServices来直接处理响应