我们希望自己的微服务能够在用户登录之后才可以访问,而单独给每个微服务单独做用户权限模块就显得很弱了,从复用角度来说是需要重构的,从功能角度来说,也是欠缺的。尤其是前后端完全分离之后,我们的用户信息不一定存在于 Session 会话中,本文使用 Spring OAuth2 + JWT 来实现鉴权服务。
OAuth2
OAuth2 根据使用场景不同,分成了 4 种模式:
- 授权码模式(authorization code)
- 简化模式(implicit)
- 密码模式(resource owner password credentials)
- 客户端模式(client credentials)
关于 OAuth2 更详细的信息科查看 理解 OAuth 2.0。
Maven 依赖
需要用到 Spring Security(提供 OAuth2 和 JWT)、Spring Web(提供授权、鉴权接口,即 endpoints)、MySQL Connector(连接 OAuth Client 存储数据)、Spring JDBC(连接 OAuth Client 存储数据)、Spring Redis(Token 缓存在 Redis 中)、Spring OpenFeign(用于请求用户服务验证用户名密码是否正确)等等:
| 1 | <dependency> | 
WebSecurityConfigurerAdapter 配置
为了能正常授权及鉴权,需要允许 OAuth2 的 endpoints 接口,以 /oauth/** 形式的接口:
| 1 | 
 | 
自定义验证用户名密码
可以发现在 WebSecurityConfigurerAdapter 中配置了 AuthenticationProvider,这个就是自定义用户名密码验证。
Provider 的类型有很多种,这里讲述两种:
- AnonymousAuthenticationProvider:顾名思义,匿名的- provider,默认的- provider,默认是拒绝所有未授权请求的,需要配置开放的接口。
- DaoAuthenticationProvider:用于验证- UserNamePasswordAuthenticationToken,也就是“用户”和“client”验证时所使用的- token。
而自定义的 CustomAuthenticationProvider 代码如下:
| 1 | 
 | 
