写在开头
看了看这个专栏的最近一篇文章已经是两年前了,时间过得好快。应该是出学校后时间就很快了。两年前因为用shiro后,自己就按着想法开始做一个认证鉴权框架 - sureness,想它是针对restful api的,它是易用的,它是没有框架绑定的。就按着这些想法断断续续的写了两年,中间陆陆续续在maven库发了10个版本,线上环境的验证。开始在这个专栏写起来,希望有人关注和使用sureness - https://su.usthe.com
sureness - 面向restful api的认证鉴权
若主页usthe.com/sureness 访问不了,请使用备用网站: su.usthe.com
Background
现在很多网站都进行了前后端分离,后端提供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.
Introduction
Framework Sample Support
- spring sample-bootstrap
- springboot sample-tom
- quarkus sample-quarkus
- javalin sample-javalin
- ktor sample-ktor
- spring webflux sample-spring-webflux
- more samples todo
快速开始
使用前一些约定
sureness
尽量简洁,基于rbac
,只有(角色-资源)的映射,没有(权限)动作映射,即 用户-角色-资源- 我们将
restful api
请求视作一个资源,资源格式为:requestUri===httpMethod
即请求的路径加上其请求方式(post,get,put,delete...
) 作为一个整体被视作一个资源eg: /api/v2/book===get
get
方式请求/api/v2/book
接口数据 - 角色资源映射: 用户所属角色--角色拥有资源--用户拥有资源(用户就能访问此
api
)
项目中加入sureness
- 项目使用
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
:
SurenessSecurityManager.getInstance().checkIn(servletRequest)
实现相关异常处理
sureness
使用异常处理流程,我们需要对checkIn
抛出的异常做自定义处理,
安全过滤器,认证鉴权成功直接通过,失败抛出特定异常,捕获异常,如下:
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
非常欢迎参与项目使用和贡献,帮助sureness走得更远更好。对项目代码有疑问或者建议请直接联系 @tomsun28