一、验证授权 Spring Security
1、登录实现思路
- SecurityConfig 配置类:
securityFilterChain(httpSecurity)
中配置拦截和放行的地址并添加授权管理器,并注入 AuthenticationManager(认证管理对象) 和 BCryptPasswordEncoder(随机盐值加密方法对象) - 控制层:接受前端发送的账号密码,调用服务层返回前端需要的内容
- 服务层:使用
authenticationManager.authenticate(带有账号密码的 usernamePasswordAuthenticationToken 对象)
得到认证后的对象 authentication - UserDetailsService 实现类:调用
authenticate()
会执行 UserDetailsService 实现类的loadUserByUsername(username)
,在该方法中通过查询数据库来获取认证后的对象,此对象一般是我们实现 UserDetails 接口自定义的用户对象 - 服务层:
authentication.getPrincipal()
可以获得我们自定义的用户对象,强转 - 服务层:然后就可以构造返回对象,为返回对象赋值,如:Token、角色列表、资源列表等信息
2、访问拦截实现思路
- 配置自定义拦截器实现 HandlerInterceptor
- 在
preHandle(request,response,handler)
中判断是不是控制层方法,不是直接放行,handler instanceof HandlerMethod
- request 对象拿到 Token,进行判断解析
- 可以将解析得到的用户对象存放在 ThreadLocal 对象中,要在
afterCompletion(request,response,handler)
中 remove 掉 - 让这拦截器生效,在实现 WebMvcConfigurer 的类中配置(类上要添加 @ComponentScan),在
addInterceptors(interceptorRegistry)
中添加interceptorRegistry.addInterceptor(我们拦截的名字).excludePathPatterns(排除拦截路径的 String 数组).addPathPatterns("/**");
- 授权管理器,实现 AuthorizationManager 接口,重写 check 方法
- 在授权管理器里面进行用户方法的地址和授权地址进行比较,可以使用
AntPathMatcher
对象的 match 方法进行比较 - 没有该路径则
return new AuthorizationDecision(false)
,有则为 true
3、分布式实现
使用 Spring Security + OAuth2 + JWT 技术
OAuth2 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。应用场景:微信授权登录,外部系统访问本系统资源,前端访问后端。核心:
客户端
请求资源拥有者
得到其授权;客户端请求微信授权服务器
得到令牌;客户端携带令牌请求微信资源服务器
得到资源。授权模式:授权码模式:就是微信扫码授权登录,使用令牌的模式;密码模式
- 搭建授权服务:添加
spring-cloud-starter-security
和spring-cloud-starter-oauth2
依赖,所有需要授权服务都需要。编写配置类:继承WebSecurityConfigurerAdapter
类;添加@EnableWebSecurity
俩注解;重写configure(HttpSecurity http)
实现拦截放行路径;注入对象 BCr