我们希望自己的微服务能够在用户登录之后才可以访问,而单独给每个微服务单独做用户权限模块就显得很弱了,从复用角度来说是需要重构的,从功能角度来说,也是欠缺的。尤其是前后端完全分离之后,我们的用户信息不一定存在于 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 |
|