1 springsecurity原理图
security的实现原理就是通过一层一层过滤器来实现。
表单登录,账号密码的认证是在UsernamePasswordAuthenticationFilter这个过滤器中完成的。
2 认证流程
3 源码跟踪
进入到UsernamePasswordAuthticationFilter,中请求中获取用户名和密码
用户名和密码封装到UsernamePasswordAuthenticationToken类中
进入到supper的构造方法中,super构造方法的参数是权限集合,由于还没有对改用户进行登录验证所以这里传入的形参为空。
将账号密码设置称为本地变量,setAuthenticationed(false)
表示该用户还未认证。
将一些请求的信息设到UsernamePasswordAuthticationToken
里面,包括请求的ip、session等。
获取AuthenticationManager
这是AuthenticationManager的实现类
这里用循环选取一个AuthenticationProvider实例,不同的登录方式认证逻辑是不一样的,不同的登录方式选择不同的AuthenticationProvider。
这里选取的是DaoAuthenticationProvider
DaoAuthenticationProvider继承自AbstractUserDetailsAuthenticationProvider,接下来接着跟代码。
这个方法在AbstractUserDetailsAuthenticationProvider
是一个抽象的方法,由DaoAuthenticationProvider继承实现。
这一步就是调用UserDetailService的实现来获取UserDetails
预检查,检查UserDetails的其中三个boolean是否为true;
检查密码是否正确
检查UserDetails最后一个boolean
重新创建一个已认证的token,并沿着调用先将已经认证的Authentication返回到UsenamePasswordAuthenticationFilter