看了看这个专栏的最近一篇文章已是两年前了,时间过得好快。应该是出学校后时间就很快了。两年前由于用shiro后,本身就按着想法开始作一个认证鉴权框架 - sureness,想它是针对restful api的,它是易用的,它是没有框架绑定的。就按着这些想法断断续续的写了两年,中间陆陆续续在maven库发了10个版本,线上环境的验证。开始在这个专栏写起来,但愿有人关注和使用sureness - https://su.usthe.com前端
A simple and efficient open-source jvm security framework that focus on the protection of restful api.
若主页usthe.com/sureness 访问不了,请使用备用网站: su.usthe.comjava
如今不少网站都进行了先后端分离,后端提供rest api,前端调用接口获取数据渲染。这种架构下如何保护好后端所提供的rest api使得更加剧视。 api的保护能够认为:认证-请求携带的认证信息是否校验经过,鉴权-认证经过的用户拥有指定api的权限才能访问此api。然而不只于此,什么样的认证策略, jwt, basic,digest,oauth仍是多支持, 权限配置是写死代码仍是动态配置,我想动态赋权怎么办,云原生愈来愈火用的框架是quarkus等新秀不是spring生态咋弄,http实现不是servlet而是jax-rs规范咋整, to be or not to be, this is a question.git
目前java
主流的权限框架有shiro,spring security
, 下面对于它们的探讨都是我的之见,接受纠正
shiro
对于restful api
原生支持不太友好,须要改写一些代码,2年前一个项目 booshiro 就是改造shiro
,使其在过滤链就能匹配不一样的rest
请求进行权限校验,以后给shiro commit
几回pr
,fix
其在过滤链匹配时的危险漏洞,总的来讲shiro
很强大但其起源并不是面向web
,对restful
不是很友好
spring security
很强大,与spring
深度集成,离开spring
,好比javalin
和以前用过的osgi
框架karaf
就用不了了
若是不用注解配置,它们都会在链式匹配这块,用请求的url和配置的链一个一个ant
匹配(匹配过程当中会有缓存等提升性能),但匹配的链过多时仍是比较耗性能(根据算法时间复杂度判断,暂未测试验证)
咱们但愿能解决这些,提供一个 针对restful api, 无框架依赖,能够 动态修改权限, 多认证策略, 更快速度, 易用的认证鉴权框架
sureness
是咱们在使用java
权限框架shiro
以后,吸收其良好设计加上一些想法实现的全新认证鉴权项目
面对restful api
的认证鉴权,基于rbac
(用户-角色-资源)主要关注于对restful api
的安全保护
无特定框架依赖(本质就是过滤器处拦截判断,已有springboot,quarkus,javalin,ktor等demo)
支持动态修改权限配置(动态修改哪些api须要被认证,能够被谁访问)
支持主流http容器 servlet 和 jax-rs
支持多种认证策略,jwt, basic auth
... 可扩展自定义支持的认证方式
基于改进的字典匹配树拥有的高性能
良好的扩展接口, demo和文档
sureness
的低配置,易扩展,不耦合其余框架,能使开发者对本身的项目多场景快速安全的进行保护
sureness
尽可能简洁,基于rbac
,只有(角色-资源)的映射,没有(权限)动做映射,即 用户-角色-资源restful api
请求视做一个资源,资源格式为: requestUri===httpMethod
即请求的路径加上其请求方式(post,get,put,delete...
) 做为一个总体被视做一个资源 eg: /api/v2/book===get
get
方式请求/api/v2/book
接口数据api
)maven
构建,加入maven
坐标<dependency> <groupId>com.usthe.sureness</groupId> <artifactId>sureness-core</artifactId> <version>0.1</version> </dependency>
gradle
构建,gradle
坐标compile group: 'com.usthe.sureness', name: 'sureness-core', version: '0.1'
sureness-core.jar
依赖在 mvnrepository 下载jar https://mvnrepository.com/artifact/com.usthe.sureness/sureness-core
入口拦截器器实现通常能够是 filter or spring interceptor
在拦截器加入sureness的安全过滤器,以下:
入口,通常放在拦截全部请求的filter
:github
SurenessSecurityManager.getInstance().checkIn(servletRequest)
sureness
使用异常处理流程,咱们须要对checkIn
抛出的异常作自定义处理,
安全过滤器,认证鉴权成功直接经过,失败抛出特定异常,捕获异常,以下:web
try { SubjectSum subject = SurenessSecurityManager.getInstance().checkIn(servletRequest); } catch (ProcessorNotFoundException | UnknownAccountException | UnsupportedSubjectException e4) { // 帐户建立相关异常 } catch (DisabledAccountException | ExcessiveAttemptsException e2 ) { // 帐户禁用相关异常 } catch (IncorrectCredentialsException | ExpiredCredentialsException e3) { // 认证失败相关异常 } catch (UnauthorizedException e5) { // 鉴权失败相关异常 } catch (RuntimeException e) { // 其余自定义异常 }
sureness
认证鉴权,固然也须要咱们配置本身的配置数据 - 帐户数据,角色权限数据等 这些配置数据可能来自文本,关系数据库,非关系数据库 咱们提供了配置数据接口SurenessAccountProvider
, PathTreeProvider
, 用户能够实现此接口实现自定义配置数据源 当前咱们也提供默认文本形式的配置数据实现 DocumentResourceDefaultProvider
, 用户能够配置sureness.yml
来配置数据 默认文本数据源sureness.yml
配置详见文档 默认数据源
咱们提供了使用代码DEMO
: 默认文本数据源具体实现,请参考使用sureness10分钟搭建权限项目--sample-bootstrap
若权限配置数据来自数据库,请参考使用sureness30分钟搭建权限项目--sample-tom 算法
HAVE FUN spring
很是欢迎参与项目使用和贡献,帮助sureness走得更远更好。对项目代码有疑问或者建议请直接联系 @tomsun28数据库