一、搭建一个验证服务
1.几个重要接口实现
User
类实现了UserDetails
接口,该接口是实现Spring Security 认证信息的核心接口
。其中getUsername
方法为 UserDetails 接口 的方法,这个方法返回 username,也可以是其他的用户信息,例如手机号、邮箱等。getAuthorities()
方法返回的是该用户设置的权限信息,在本实例中,从数据库取出用户的所有角色信息,权限信息也可以是用户的其他信息,不一定是角色信息。另外需要读取密码,最后几个方法一般情况下都返回 true,也可以根据自己的需求进行业务判断。
Role
类实现了GrantedAuthority
接口,并重写getAuthority()
方法。权限点可以为任何字符串,不一定非要用角色名。
所有的
Authentication
实现类都保存了一个GrantedAuthority
列表,其表示用户所具有的权限。GrantedAuthority是通过AuthenticationManager设置到Authentication对象中的
,然后AccessDecisionManager
将从Authentication中获取用户所具有的GrantedAuthority来鉴定用户是否具有访问对应资源的权限。
Service
层需要实现UserDetailsService
接口,该接口是根据用户名获取该用户的所有信息, 包括用户信息和权限点
。
查询user信息时,需要调用user.setAuthorities( roles )
设置角色权限信息,与AccessDecisionManager
接口中实现的decide
方法做对应实现权限验证。
2.配置权限验证
2.1 FilterInvocationSecurityMetadataSource
用来存储请求和权限的对应关系
FilterInvocationSecurityMetadataSource接口有3个方法:
- boolean supports(Class<?> clazz):指示该类是否能够为指定的方法调用或Web请求提供ConfigAttributes。
- Collection
getAllConfigAttributes()
:Spring容器启动时自动调用, 一般把所有请求与权限的对应关系也要在这个方法里初始化, 保存在一个属性变量里。 - Collection
getAttributes(Object object)
:当接收到一个http请求时, filterSecurityInterceptor会调用的方法. 参数object是一个包含url信息的HttpServletRequest实例. 这个方法要返回请求该url所需要的所有权限集合。
2.2 AccessDecisionManager
AccessDecisionManager
是由AbstractSecurityInterceptor
调用的,它负责鉴定用户是否有访问对应资源(方法或URL)的权限。
2.3 AbstractSecurityInterceptor
每种受支持的安全对象类型(方法调用或Web请求)都有自己的拦截器类,它是AbstractSecurityInterceptor的子类,AbstractSecurityInterceptor 是一个实现了对受保护对象的访问进行拦截的抽象类
。
AbstractSecurityInterceptor的机制可以分为几个步骤:
- 查找与当前请求关联的“配置属性(简单的理解就是权限)”
- 将 安全对象(方法调用或Web请求)、当前身份验证、配置属性 提交给决策器(AccessDecisionManager)
- (可选)更改调用所根据的身份验证
- 允许继续进行安全对象调用(假设授予了访问权)
- 在调用返回之后,如果配置了AfterInvocationManager。如果调用引发异常,则不会调用AfterInvocationManager。
AbstractSecurityInterceptor中的方法说明:
- beforeInvocation()方法实现了对访问受保护对象的权限校验,内部用到了AccessDecisionManager和AuthenticationManager;
- finallyInvocation()方法用于实现受保护对象请求完毕后的一些清理工作,主要是如果在beforeInvocation()中改变了SecurityContext,则在finallyInvocation()中需要将其恢复为原来的SecurityContext,该方法的调用应当包含在子类请求受保护资源时的finally语句块中。
- afterInvocation()方法实现了对返回结果的处理,在注入了AfterInvocationManager的情况下默认会调用其decide()方法。
2.4 SecurityConfig
-
@EnableWebSecurity注解以及WebSecurityConfigurerAdapter一起配合提供基于web的security。自定义类 继承了WebSecurityConfigurerAdapter来重写了一些方法来指定一些特定的Web安全设置。
-
当配置EnableGlobalMethodSecurity(prePostEnabled = true)时,Spring Security会启用方法权限控制。
-
@PreAuthorize(“hasRole(‘ADMIN’)”)方法权限控制。@PreAuthorize使用Spring Expression Language来描述方法权限。本例子为当用户有ADMIN权限时,才能访问。
3.核心组件介绍-内置流程-过滤器
参考地址:https://blog.csdn.net/qq_36095679/article/details/92625701
认证架构(流程)
架构概述
过滤器机制