java鉴权_一个开箱即用的高效认证鉴权框架,专注于restful api的认证鉴权动态保护...

作者:tomsun28

来源:SegmentFault 思否


写在开头

看了看这个专栏的最近一篇文章已经是两年前了,时间过得好快。应该是出学校后时间就很快了。两年前因为用shiro后,自己就按着想法开始做一个认证鉴权框架 - sureness,想它是针对restful api的,它是易用的,它是没有框架绑定的。就按着这些想法断断续续的写了两年,中间陆陆续续在maven库发了10个版本,线上环境的验证。开始在这个专栏写起来,希望有人关注和使用sureness - https://su.usthe.com


sureness - 面向restful api的认证鉴权

A simple and efficient open-source jvm security framework that focus on the protection of 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.

目前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,无框架依赖,可以动态修改权限,多认证策略,更快速度,易用的认证鉴权框架


Introduction

sureness 是我们在使用 java 权限框架 shiro 之后,吸取其良好设计加上一些想法实现的全新认证鉴权项目


面对 restful api 的认证鉴权,基于 rbac (用户-角色-资源)主要关注于对 restful api 的安全保护


无特定框架依赖(本质就是过滤器处拦截判断,已有springboot,quarkus,javalin,ktor等demo)


支持动态修改权限配置(动态修改哪些api需要被认证,可以被谁访问)


支持主流http容器 servlet 和 jax-rs


支持多种认证策略, jwt, basic auth ... 可扩展自定义支持的认证方式


基于改进的字典匹配树拥有的高性能


良好的扩展接口, demo和文档


sureness的低配置,易扩展,不耦合其他框架,能使开发者对自己的项目多场景快速安全的进行保护

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
  1. 项目使用maven构建,加入maven坐标
 com.usthe.sureness sureness-core 0.1
  1. 项目使用gradle构建,gradle坐标
compile group: 'com.usthe.sureness', name: 'sureness-core', version: '0.1'
  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


- END -

87f6d26b118273997e6c8c2b391a3828.png

9db5fb0e0d5aef7caf9c65cafe44f5a8.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值