springsecurity作为和shiro齐名的认证授权框架,一直被广大java工程师们所热衷,不过由于以前都是单个服务,而shiro更加轻量化且更易理解 所以用的更多,而现在都是springcloud等微服务主流,springsecurity作为spring家族的一员被应用越来越广泛,所以这里准备好好学习一下这个框架。
这里主要学习一下整个认证和授权流程。
- 页面提交用户名密码后,被
UsernamePasswordAuthenticationFilter拦截,并封装为Authentication,交给AuthenticationManager来处理。查看源码:
2. AuthenticationManager又将认证交给DaoAuthenticationProvider来处理,这里主要会将页面输入的密码和数据库中当前用户的密码进行比对。数据库中取出密码的行为由UserDetailsService来处理,可以自定义UserDetailsService,同时密码比对由passwordEncoder来处理。这里的passwordEncoder也可以自定义,常用的为BCryptPasswordEncoder。认证通过以后,则进入授权环节。
3. 认证通过以后,请求访问当前资源会被FilterSecurityInterceptor拦截进行授权检测,如果有访问资源的权限,系统将放行,没有则返回拦截信息。系统通过SecurityMetadataSource来获取访问当前资源所需要的权限,并由AccessDecisionManager的decide()方法来决定判断是否拥有访问当前资源的权限。
这里:
authentication:要访问资源的访问者的身份
object:要访问的受保护资源,web请求对应FilterInvocation
configAttributes:是受保护资源的访问策略,通过SecurityMetadataSource获取