KRest一款Java平台的RESTful框架包含Shiro+Jwt+通信加密,功能完善使用。欢迎大家选用。
推广一下自己刚刚完成的新框架。是一款整合了Shiro Jwt Cryption(一个自行实现的通信加/解密模块)来实现RESTful服务的Java框架。主要功能是在吸收上述框架强大功能的基础上,通过代理模式整合出一个极为精简的配置方式来供大家配置使用。使用简单、配置灵活、扩展性强。期待大家选用。如果有任何问题和意见,我会第一时间吸收和改进,力争把它做成同类中最好用的产品。
联系方式,在这里留言或站内信可能不能第一时间看到,推荐给我发邮件,或者在Gitee或者Github的公共源码库的issue里留言。当然最推荐的还是加qq群(818464800)。
项目地址如下:
http://krest.chenkaiwei.com/ (推荐,gitee,最快更新)
https://github.com/chenkaiwei/krest (github的地址,因为众所周知的原因,不一定能保证最及时的更新)
同时本项目已发布到maven中央库,使用起来非常方便。当前最新版本是1.0.4,之后会也和gitee中的源码版本同步更新。
具体用法还是点进gitee的项目地址查看,我已经写了详细的初步使用方法。进一步的使用方法都在三个demo的源码和注释里,保证一目了然清晰易懂。
对本项目的的改进和完善提供较大帮助的朋友,我会把你列入项目源码的鸣谢名单中并请你喝奶茶!!
再次感谢大家!
以下是项目的README.md文档介绍,最新的版本请参考README.md
KRest
介绍
krest是一款基于Java的轻量级RESTful框架套装,旨在整合no-session服务中常见的基础模块(身份验证、权限控制、通信加密等),并提供统一的配置方式和精简的使用方式,以帮助开发人员降低学习门槛和提升开发效率。具有功能完善、配置简单、耦合低、侵入性小、扩展灵活、安全稳定等特点。
产品特性
- 本产品的身份验证以及权限控制功能通过整合shiro jwt以及一个自行开发的加解密模块来实现。规则成熟可靠通用性好。且充分运用了shiro1.8版本的新机制,对jwt机制有更好的兼容。
- 本产品的通信加密模块采用了不对称和对称加密的结合使用的加密策略,使用简单、性能高效、安全性高。
- 本产品通过代理模式整合精简了原本繁琐的配置方式,最大程度地帮助用户降低工作难度和复杂度。即使对shiro、jwt或者通信接口加/解密的具体技术一无所知,也可跟随本文轻松搭建一整套功能完善的RESTful服务端框架。
- 本产品具有耦合低、侵入性小的特点:不会参与任何数据持久层或远程缓存的读写配置。用户可以自行设计所有数据的存储获取方式,只需确保权限数据的设计符合RBAC规范。
- 采用SpringBoot的自动装配机制实现对shiro和jwt的封装,方便用户自行扩展和覆写各种功能模块。
- 完善的使用说明和功能能演示,demos目录下包含三个完整的演示模块,有着非常完善的注解帮助你快速上手本框架。其中demos根目录下有postman的脚本,三个模块通用(因为接口和端口都定义成一样),krest-demo-db模块下有演示数据库(mysql)的sql脚本,如有需要都可以找来试用。
版本要求
- JDK1.8以上
快速开始
-
在pom中导入包(本项目已发布到maven中央库,直接写配置即可。)
<dependency> <groupId>com.chenkaiwei.krest</groupId> <artifactId>krest-core</artifactId> <version>${最新是啥就写啥}</version> </dependency>
注:您可以在本项目的发布(release)页找到最新的版本号,也可在maven中央库中查看(https://search.maven.org/search?q=a:krest-core)。
-
新建一个config类(或在您原有的config类上)实现KrestConfigurer接口
@Configuration public class DemoConfig implements KrestConfigurer { //按下图方式配置角色-权限映射,返回值中key为角色(Role)名称,value为该角色所拥有的所有权限(Permission) @Override public Map<String, Collection<String>> configRolePermissionsMap() { Map<String, Collection<String>> res=new HashMap<String, Collection<String>>(); res.put("admin", Arrays.asList("p1","p2","p3","p4")); res.put("user", Arrays.asList("p3","p4")); return res; } //返回jwt Token的加密策略,字符串部分为秘钥 @Override public Algorithm configJwtAlgorithm() { return Algorithm.HMAC256("mydemosecretkey"); } }
-
(可选)实现登录方法。如果您的客户端已经拥有了token,则可跳过本步骤。
在您的登录方法中加入以下代码:
//if(您自己的登录逻辑,验证通过后:) JwtUser jwtUser=new JwtUser("zhang3", Arrays.asList("admin")); //↑ 您确认已登陆的用户及其角色信息。 resultBody.put("token",KrestUtil.createJwtTokenByUser(jwtUser));
本段代码的功能为以 该用户名和该用户的角色(Role)列表生成一个token(按照jwt规则实现)并返回给客户端。基于jwt验证机制,只需将token返回给客户端即视为已经登录完成。
本例中zhang3为用户名,admin为其角色。该角色名必须与步骤2中的key对应。
-
客户端的操作(即Jwt令牌使用规则):
客户端在获取到token后,应将其加上"Bearer "前缀使用。在后续的请求中,只须将该"Bearer " token的字符串以"Authorization"为属性名加到请求头中,即可自动实现身份验证。完成后的效果类似下表
KEY VALUE Authorization Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJhZG1pbiJdLCJleHAiOjE2NDY3OTcyMjEsInVzZXJuYW1lIjoiemhhbmczIn0.HroVIdxf5qmpjWJlOs0QGW7OtaTcjirD9aMViK4oDdI 注意:Bearer和令牌字符串之间有且仅有一个半角空格。
-
服务端的操作,在所有业务请求的返回值中,加入以下代码,即可按照步骤6中配置的过期时间和刷新时间实现Token的自动刷新。
resBody.put("token",KrestUtil.createNewJwtTokenIfNeeded());
一般建议使用ResponseBodyAdvice等方式统一封装在返回结果中。
-
(可选)自定义token过期时间和自动刷新时间。
在application.yml文件中增加如下配置:
krest: jwt: expire-time: 1m #↑token过期时间,默认20分钟 refresh-time-before-expire: 40s #↑过期前多久更新token。默认10分钟。若设为与expire-time一致则每次请求都会刷新。
若您使用application.properties则自行更改对应配置,不再赘述。
至此,配置完成。
-
运行测试
在controller中加入如下代码
@GetMapping("/permissionDemo") @RequiresPermissions("p1")//当用户拥有"p1"权限时才被许可访问该方法。以此便捷地实现粗粒度的权限控制。 public Map permissionDemo(){ Map<String,String> res=new HashMap<>(); res.put("result","you have got the permission [permissionDemo]"); res.put("token",KrestUtil.createNewJwtTokenIfNeeded()); return res; }
进阶使用
启用shiro原生的用户名-密码登录功能
本框架通过实现shiro的realm,自定义了一套用户名密码登陆机制,可在配置文件中一键开启。配置如下。
krest:
enable-username-password-realm: true
您仅需在config文件中配置一些最必要的设置即可实现。其具体规则参考krest-demo-1源码。
自定义异常返回
-
继承KrestErrorController并覆盖getErrorResponseBody方法来自定义返回错误时的数据结构。
-
通过定义全局ExceptionHandler来捕获异常。具体规则参考demo中的GlobalExceptionController文件。
通信加密模块
本框架还包含一个通信加密模块。使用规范如下:
-
由客户端生成一个临时秘钥(tempSecretKey),以此为秘钥,使用 对称加密 策略将整条消息体加密(也可只加密您需要的字段)。加密策略须与服务端协商一致。。
-
与服务端约定一个不对称加密策略,用以加密解密临时秘钥(tempSecretKey)。公钥由客户端维护,私钥由服务端维护。客户端在访问服务端的加密接口前,将临时秘钥用不对称加密的公钥加密后放入头信息的Cryption字段中。伴随在步骤1中已加密的消息体一并发送到服务端对应的接口。
-
以下是服务端部分:需要先在配置文件中开启接口加密功能:
krest.cryption.enable-cryption = true
-
需要实现的配置为 configTempSecretKeyCryptoAlgorithm(即步骤2中的加解密临时秘钥的不对称加密策略)和createMessageBodyCryptoAlgorithm(即步骤1中使用临时秘钥加解密消息体的对称加解密策略)两处
-
服务端对应的加密接口由@Cryption注解标签修饰。该注解包含四种策略:请求时的消息体全加密、返回时的消息体全加密、以上二种叠加、自定义的局部消息加密。
-
前三种加解密模式由框架自动完成。自定义局部信息加解密,通过调用KrestUtil.decryptMessageBody和KrestUtil.encryptMessageBody来加/解密您与客户端所约定的相应密文字段来实现。
-
在服务端加密配置和具体实现的语法参考krest-demo-1。在客户端将KrestDemo.postman_collection.json导入postman,参考这个。
后续开发计划
- 完善javadoc注解
联系作者
欢迎试用并留下宝贵意见,帮助本产品进一步成熟和完善。如您在本产品的使用中有任何疑问或交流建议,请随时联系作者。
- Email: ckw1988@163.com
- QQ群: 818464800(推荐)
- 在github或gitee的本项目的issue下留言也是可以的
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgehjgi
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01