Zuul+OAuth2.0+JWT实战

1.zuul-server编写说明

zuul-server中需要做的就是当请求接口时,判断是 否登录鉴权,如果未登录,则跳转到auth-server的登录 界面(这里使用的是Spring Security OAuth的默认登录 界面,也可以重写相关代码定制页面),登录成功后 auth-server颁发jwt token,zuul-server在访问下游服务时 将jwt token放入header中即可。
Zuul+OAuth2.0+JWT实战
编写核心配置文件bootstrap.yml,提供对引入框架的支持,如代码清单8-9所示:
Zuul+OAuth2.0+JWT实战
代码中定义了从/client到client-a服务的路由规则, 比较重要的是security根下面的配置,验证授权端点 为http://localhost:7777/uaa/oauth/authorize,jwt token的 颁发地址为http://localhost:7777/uaa/oauth/token,声明 jwt头部签名算法为对称加密方式,默认加密算法为HS256,**为springcloud123,当然如果安全性要求更 高,应该使用非对称加密方式,生成公钥与私钥放置于 服务中。

编写核心启动主类ZuulServerApplication.java,如 代码清单8-10所示。

Zuul+OAuth2.0+JWT实战
重写WebSecurityConfigurerAdapter适配器的 configure(HttpSecurity http)方法,声明需要鉴权的url信息。

2.auth-server编写说明

整个示例的另一个核心就是auth-server,它作为认 证授权中心,会颁发jwt token凭证。
Zuul+OAuth2.0+JWT实战
编写核心配置文件bootstrap.yml
Zuul+OAuth2.0+JWT实战

这里说明一下,在Spring Boot 2.0之后,设定工程 基路径需要使用server.servlet.context-Path,而不是原来 的server.contextPath。

编写认证授权服务适配器类 OAuthConfiguration.java
Zuul+OAuth2.0+JWT实战
Zuul+OAuth2.0+JWT实战
这个类主要用于指定客户端ID、**,以及权限定 义与作用域声明,指定TokenStore为JWT,不同于以往 将TokenStore指定为Redis或是其他持久化工具,主要的 不同就是在这里。

编写启动配置类AuthServerApplication.java

Zuul+OAuth2.0+JWT实战
Zuul+OAuth2.0+JWT实战
声明用户admin具有读写权限,用户guest具有读权 限;authenticationManagerBean()方法用于手动注入 AuthenticationManager;passwordEncoder()用于声明用 户名和密码的加密方式,这个功能在Spring Security 5.0 之前是没有的,需要注意一下。

3.client-a编写说明

client-a作为zuul-server的下游服务,需要的功能很 简单,能够被注册发现,以及能够按照规则解析jwt token即可

编写启动配置类ClientAApplication.java
Zuul+OAuth2.0+JWT实战
Zuul+OAuth2.0+JWT实战

到这里相信大家很容易就能看出,它的配置和auth- server的配置其实相差无几:如反析jwt token配置,声
明接口权限可见范围等。这里写了一个/test接口用于返 回内容与打印header到控制台。

示例认证流程

Zuul+OAuth2.0+JWT实战
1)使用浏览器访问http://localhost:5555/client/test结 果,如图所示。
Zuul+OAuth2.0+JWT实战
2)使用浏览器访问http://localhost:5555结果,如图所示。
跳转到auth-server的默认登录页面,使用用户名admin与密码admin登录。
Zuul+OAuth2.0+JWT实战
3)使用浏览器再次访问 http://localhost:5555/client/test,结果如图所示。
Zuul+OAuth2.0+JWT实战
调用接口成功,观察client-a服务控制台打印的结 果,如图所示。
Zuul+OAuth2.0+JWT实战
其中的authorization就是jwt token,使用BASE64解 码后为:
Zuul+OAuth2.0+JWT实战