前面两篇文章,我们已经把认证&授权功能的基础组件介绍了一遍,这里再来回顾一下:
基础组件总结
上文中提到的大部分都是接口,也就是 Spring Security 把各个问题都抽象成一个接口,可以自由的实现它,列举一下:
UserDetails – 用户信息抽象 GrantedAuthority – 权限信息抽象 UserDetailsService – 用户信息查询 PasswordEncoder – 密码加密与验证 AuthenticationSuccessHandler – 认证成功处理逻辑 AuthenticationFailureHandler – 认证失败处理逻辑 LogoutSuccessHandler – 登出成功处理逻辑 AccessDecisionVoter – 鉴权 AccessDeniedHandler – 权限不足处理逻辑 AuthenticationEntryPoint – 匿名访问处理逻辑
还有三个Filter:
UsernamePasswordAuthenticationFilter – 登录接口,请求路径为 POST /login,请求字段为 username、password LogoutFilter – 登出接口,请求路径为 POST /logout FilterSecurityInterceptor – 鉴权拦截器
看起来说到这貌似可以完结了,UsernamePasswordAuthenticationFilter 直接就引用 UserDetailsService 和 PasswordEncoder 不就可以实现了用户认证吗?
答:实现是实现了,但看起来有点像是硬编码了,扩展性堪忧。UserDetailsService+PasswordEncoder适用于自己系统管理账号密码的情况,那如果此时要同时接入别的认证系统,也就是支持多种认证方式,直接傻眼。 之所以称为框架,就是它还考虑了各种各样的情形,看看 Spring Security 还藏了什么东西。
更高层抽象
上文提到的各个组件只是最底层的抽象而且是比较零散的,作为一个成熟的框架,势必会将各个组件有机的整合起来,提供更高层次的抽象。使得框架更易于使用且可以灵活扩展。 来看看Spring Security做了哪些努力:
Authentication 身份验证的主体,会用于认证前的信息流转,也会用于承载认证后的认证主体信息(标记为已认证),认证后可通过 SecurityContextHolder.getContext().getAuthentication() 获取。内部会包含 UserDetails 和 GrantedAuthority。AuthenticationProvider 认证提供者,用于执行特定类型的身份验证。内置实现有 DaoAuthenticationProvider,内部引用了 UserDetailsService 和 PasswordEncoder,用于支持用户名/密码的身份验证。AuthenticationManager 认证管理者,认证逻辑对外暴露的高层接口。内置实现有 ProviderManager,内部可引用多个 AuthenticationProvider,支持多种认证实现。AccessDecisionManager 鉴权管理者,鉴权逻辑对外暴露的高层接口。内置实现有 AffirmativeBased,内部可引用多个 AccessDecisionVoter,支持多种鉴权实现。
end