这是我参与11月更文挑战的第14天,活动详情查看:2021最后一次更文挑战。
在上一篇文章里,我们完成了JWTService接口的定义及其实现的方法编写,已经能够实现生成JWT Token和注册用户并生成Token,为了将这些方法提供给外部访问,我们需要有Controller去调用这些Service方法,然后对外提供接口。
基于JWT+RSA256的授权
定义一个Controller(AuthorityController),编写以下两个方法。
1、从授权中心获取 Token (其实就是登录功能), 且返回信息中没有统一响应的包装。
2、注册用户并返回当前注册用户的 Token, 即通过授权中心创建用户。
此处我们之所以把@IgnoreResponseAdvice(之前定义的忽略统一响应的注解)注解放在方法上而不是直接放到类上,是因为考虑到将来我们这个Controller肯定还会有新的方法,那些方法不一定需要这个注解,因此我们选择现在就标注在方法上,否则之后修改的时候可能会出现遗漏或者错加的情况,造成意想不到的结果。
基于JWT+RSA256的鉴权工具类
之前有详细介绍过为什么要将鉴权单独提取出来,本文就不再赘述了。
我们在e-commerce-common下创建一个util包,创建TokenParseUtil类,即JWT Token解析工具类。JWT Token是我们通过RSA256私钥加密生成的,因为它是一个非对称的加密算法,因此我们用之前存储在e-commerce-common里的公钥(CommonConstant.PUBLIC_KEY)去解密。
很多企业可能会将公钥和私钥作为文件存储在文件服务器上,然后代码从文件服务器里拉取文件,再从文件里去读取字符串信息,由于文件用户直接获取不到,因此由起到了一层保护作用。
我们这里就直接将它存储到e-commerce-common里去了。先根据本地存储的公钥获取到PublicKey对象,直接通过如下图所示代码去解析JWT Token,该代码是来自java.security包里的内容,一般我们平常也不会去看它,使用的时候去查询相关文档即可。
然后通过公钥去解析JWT Token:
还需要实现从JWT Token中解析LoginUserInfo对象的功能:
验证服务可用性
在e-commerce-authority-center工程的test->java->com.sheep.ecommerce->service下创建一个测试用例的类JWTServiceTest(JWT相关服务测试类)。