Java 有现成的权限系统框架么?

2020-06-18 20:25:05 +08:00
 tctc4869

之前自己开发 web 项目的时候,关于权限系统的编码,自己从 0 开始编写了一个简易的权限系统,基于 RBAC 的那种,不过还是想看看有没有现成的权限系统设计。

现在的我不太喜欢注解配置,注解侵入太强,想找一套式非侵入式的权限系统框架,权限校验在类似 Web 拦截器之类的地方进行权限校验。各位知道有哪些现成的么,或者有什么思路么

至于是哪个 WebMVC 框架,这里不说明,因为 WebMVC 框架可能使用的是 Spring MVC,也可能是 Vert.x web,也可能是 JFinal,也可能是 Servlet 。所以侵入程度不要太强。尽可能与 WebMVC 的代码解耦。这是一个重点。

权限校验代码不能写在 Controller 类里,所以 shiro 之类通过注解的方式实现权限校验的方式被排除了,如果有 Controller 需要特定的权限校验,那这个交给拦截器之类的组件来进行。

8718 次点击
所在节点    Java
54 条回复
tctc4869
2020-06-19 09:00:31 +08:00
@jzphx 菜单角色权限都在 db 的话,我可以直接通过后台管理界面配置权限,通过 web 拦截器校验权限,这样没注解什么事情了。另外我开头说明中,指定了没有指明是用哪个 WebMVC 框架,要在这个情况下考虑比较通用的权限校验问题。至于特殊的权限校验,那是另外的事情。

注解本来就是硬编码,一旦运行就不可更改(如果需要要改注解对象内容,那还要注解干什么?相比注解,还有更好的配置方式,是建造者模式与链式调用)。
hantsy
2020-06-19 09:06:14 +08:00
@beginor Spring Security 以前的 Oauth 子项目有一个 Authentication Server 实现, 现在这个项目处于维护状态。

https://spring.io/projects/spring-security-oauth

现在这新的 Spring Security 5 核心包括了 OAuth2 模块,完全重写了。目前核心还没包括 Authenticaiton Server,从安全的角度看,这个不属于安全控制的一些部分,Spring Security 的 OAuth Client 和 Resource Server 的实现可以与任何兼容 OAuth2 和 OIDC 协议的 Authentitcation Server 交互。

不过,Spring 启动一个新的社区项目。
https://github.com/spring-projects-experimental/spring-authorization-server

其实现在做安全,只要选择一个 OAuth 兼容的认证服务就行了,如果应用程序不大(像淘宝,天猫),没必要自己建 auth server,可以选择第三方 IDP 服务,如 auth0,okta 都不错。自建的话,现成的开源产品很多,基于 .DotNet Core Identity Server, Redhat 的 Keycloak (基本很多自建的首选),Spring 母公司的之前 Uaa(现在在 CloudFoundry 下面), https://github.com/cloudfoundry/uaa
wangxiaoaer
2020-06-19 09:13:59 +08:00
@lihongming #17 严格讲算的,最典型的部门、人员这种带层级的架构,那么一般数据可见范围是要控制在本部门的。
tctc4869
2020-06-19 09:14:59 +08:00
@tsdbg 这不是 WebMVC 框架的问题,与 Vert.x 或 Sring MVC 等无关,要抛开 WebMVC 框架,单独来看待 Web 权限校验。
wangxiaoaer
2020-06-19 09:22:22 +08:00
@Hanggi #18

我能想到的一种方案:所有跟权限相关的查询属性都作为查询参数,然后还是路由层进行控制。

比如针对这样一个需求:经理角色再查询用户的时候只能看到本部门的用户,并且只能看到姓名这个字段

1 用户接口的粒度要足够细:查询部门、查询字段要作为参数显式声明(客户端提供)

2 用户接口严格按照查询参数做查询,这一步不做验证工作。

2 路由层根据查询参数做过滤实现授权和权限验证,这个过滤就可以借助一些配置文件实现相对的通用。
qq1340691923
2020-06-19 09:24:44 +08:00
这也不愿意,那也不愿意,你是来引战的吧
tctc4869
2020-06-19 09:27:55 +08:00
@qq1340691923 自说自话,先射箭,后画靶子
tctc4869
2020-06-19 09:33:53 +08:00
@wangxiaoaer 权限配置,除了考虑 OA 系统的组织体系,还有客户体系。

比如有些权限无法手动配置,由业务逻辑配置,比如客户申请某类资源的使用,后台审核能否客户使用,审核通过就会赋予客户用户对某类资源的角色权限,这个时候权限就会侵入到业务里,对于这类你有什么好的解耦思路。
wizzer
2020-06-19 09:40:36 +08:00
wangxiaoaer
2020-06-19 09:44:15 +08:00
@tctc4869 #28 这跟我之前说的思路不冲突,审核通过后赋予了某个客户某个新的权限,那么把这个权限信息写入到路由验证所依赖的那个配置文件中就可以了啊。

“ 路由层根据查询参数做过滤实现授权和权限验证,这个过滤就可以借助一些配置文件实现相对的通用。”

这个地方刚没有细说,单实际上整个权限验证的核心就是这一块,他将权限规则抽象成表达式的方法存到某个配置中,又能够解析表达式在路由层结合请求参数做过滤。这个配置可以是文件也可以是数据库,所以既放置预先配置好的规则,当然也可以在运行时更新。
zengyuxi
2020-06-19 09:45:28 +08:00
什么叫抛开 webMVC 框架?你确定不是过来逗我们玩的?你了解“Spring Security”吗?提问题之前,先问是不是,再问为什么!
tctc4869
2020-06-19 10:04:10 +08:00
@wangxiaoaer 关于这个思路,有链接提供完整的说明么?
wucao219101
2020-06-19 10:05:20 +08:00
Spring Security +1
wangxiaoaer
2020-06-19 10:09:08 +08:00
@tctc4869 #32 没有啊。 我只是瞎捷豹想的啊,但是感觉应该有可行性。
tctc4869
2020-06-19 10:16:41 +08:00
@wangxiaoaer 我有个想法,我的开头有说明是脱离 WebMVC 框架,来思考权限校验,我想搞一个 HttpContext 的 java 抽象类,然后我的权限校验就基于该抽象类体系进行。如果要较好的处理权限校验的话,这个抽象类应该添加哪些设计了?
hantsy
2020-06-19 10:38:37 +08:00
@tctc4869 你说这些纯粹是你的业务需求(权限设置),和业务绑定自己要实现,用什么安全架构,框架,技术有什么关系?
ixx
2020-06-19 14:03:02 +08:00
试试 keycloak?
Alex5467
2020-06-19 14:07:56 +08:00
@byaiu 他都说 shiro 之类通过注解的方式实现权限校验的方式被排除了
safilar
2020-06-19 15:40:47 +08:00
@tctc4869 你这种需求很简单,shiro 那种到处要写注解在代码里面确实有一些问题,比如开发自己忘记写了,变成只有前端走个校验了。
BQsummer
2020-06-19 15:44:11 +08:00
我顺便问个题外话,rbac 肯定满足不了中等公司的需求,abac 有啥落地方案吗,我们现在公司是自研的权限系统,基于树的,很绕,介于 rbac 和 abac 之间,很多功能修修补补

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/682823

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX