Java权限框架2——sureness框架介绍

1,643 阅读5分钟

这是我参与更文挑战的第5天,活动详情查看: 更文挑战

背景

目前前后端分离架构已经非常流行,后端专注于给前端提供REST API接口,对于接口的认证鉴权也非常重要。

目前市场上的主流权限框架有Shiro和Spring Security,但是他们都有瑕疵,比如Shiro不原生支持RESTful,Spring Security深度绑定了Spring,上手难度高。

而sureness框架解决了上述问题,提供一个面向REST API,无框架依赖,可以动态修改权限,多认证策略,更快速度,易用易扩展的认证鉴权框架。

来自sureness官网的各个权限框架的对比:

~SurenessShiroSpring Security
多框架支持支持需改动支持不支持
REST API支持需改动支持支持
Websocket支持不支持不支持
过滤链匹配优化的字典匹配树ant匹配ant匹配
注解支持支持支持支持
Servlet支持支持支持
JAX-RS支持不支持不支持
权限动态修改支持需改动支持需改动支持
性能速度较快较慢较慢
学习曲线简单简单陡峭

资源约定

所谓的资源,就是用户所能访问的最小粒度单位。

对于前后端分离的架构来说,后端给前端提供一系列API接口,这些API接口由资源名称+请求方法组成。

比如对于用户模块,/api/user的get请求意味获取用户,而/api/user的post请求则为创建用户,单独的url没法具体体现业务,必须结合动词。

所以sureness非常创新的把资源+动词(get,post,put,delete...)形成一个整体作为资源来鉴权。

比如上面的获取用户,按sureness的规则,可表示为/api/user===get,创建用户可表示为/api/user===post。

RBAC模型

RBAC基于角色的权限访问控制(Role-Based Access Control)是商业系统中最常见的权限管理技术之一。

在RBAC中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限,这就极大地简化了权限的管理。

在一个组织中,角色是为了完成各种工作而创造,用户则依据它的责任和资格来被指派相应的角色,用户可以很容易地从一个角色被指派到另一个角色。角色可依新的需求和系统的合并而赋予新的权限,而权限也可根据需要而从某角色中回收。

最经典的RBAC的数据库实现就是五表设计,即三张实体表(用户,角色,权限)加两张关系表(用户-角色,角色-权限,两者都是多对多关系)。

image.png

sureness的认证与授权

权限框架一般要解决两个问题:认证与授权。

认证的英文为Authentication,验证用户是不是拥有相应的身份。

授权的英文为Authorization,验证某个已认证的用户是否拥有某个权限;即判断用户是否能做事情,常见的如:验证某个用户是否拥有某个角色。或者细粒度的验证某个用户对某个资源是否具有某个权限。

sureness框架支持一些简单登录认证方式,如basic auth,jwt等。授权功能也是利用了RBAC的思想来实现的。

如果想了解sureness的功能,可参见官方的手把手教程例子。

在这份教程里,没有过多的自定义功能,更多的是通过文件配置来对认证和授权进行了模拟。

这份配置文件是:

## -- sureness.yml文本数据源 -- ##

# 加载到匹配字典的资源,也就是需要被保护的,设置了所支持角色访问的资源
# 没有配置的资源也默认被认证保护,但不鉴权,例如/api/v1/source2===get
# eg: /api/v1/source1===get===[role2] 表示 /api/v1/source1===get 这条资源支持 role2这一种角色访问
# eg: /api/v2/source2===get===[] 表示 /api/v2/source2===get 这条资源不支持任何角色访问
resourceRole:
  - /api/v1/source1===get===[role2]
  - /api/v1/source1===delete===[role3]
  - /api/v1/source1===put===[role1,role2]
  - /api/v2/source2===get===[]
  - /api/v1/source2/*/*===get===[role2]
  - /api/v2/source3/*===get===[role2]

# 需要被过滤保护的资源,不认证鉴权直接访问
# /api/v1/source3===get 表示 /api/v1/source3===get 可以被任何人访问 无需登录认证鉴权
excludedResource:
  - /api/v1/account/auth===post
  - /api/v1/source3===get
  - /**/*.html===get
  - /**/*.js===get
  - /**/*.css===get
  - /**/*.ico===get

# 用户账户信息
# 下面有 admin root tom三个账户
# eg: admin 拥有[role1,role2]角色,明文密码为admin,加盐密码为0192023A7BBD73250516F069DF18B500
# eg: root 拥有[role1],密码为明文23456
# eg: tom 拥有[role3],密码为明文32113
account:
  - appId: admin
    # 如果填写了加密盐--salt,则credential为MD5(password+salt)的32位结果
    # 没有盐认为不加密,credential为明文
    # 若密码加盐 则digest认证不支持  
    credential: 0192023A7BBD73250516F069DF18B500
    salt: 123
    role: [role1,role2]
  - appId: root
    credential: 23456
    role: [role1]
  - appId: tom
    credential: 32113
    role: [role3]

除了配置文件,sureness也支持自定义数据源,把角色信息和资源信息全部持久化到数据库里。

另外,sureness也有非常多的扩展点,比如自定义用户对象,自定义认证方式等等,这些我会在后面的文章里继续介绍。

Java权限框架系列文章

《Java权限框架1——业务痛点与技术调研》

参考资料

《RESTful API 最佳实践》

《理解RESTful架构》

《sureness官方文档》