登录、角色、权限的综合解决方案。
-
下载源码
使用git进行源码下载。
git clone [email protected]:DwArFeng/rbac-weapon-rack.git
对于中国用户,可以使用gitee进行高速下载。
git clone [email protected]:dwarfeng/rbac-weapon-rack.git
-
项目打包
进入项目根目录,执行maven命令
mvn clean package
-
解压
找到打包后的目标文件
rbac-weapon-rack-node/target/rbacwr-[version]-release.tar.gz
将其解压至windows系统或者linux系统
-
配置
- 修改conf文件夹下的配置文件,着重修改各连接的url与密码。
-
enjoy it
该项目使用 dubbo
作为RPC框架,本身支持分布式,您可以在实际使用时,部署该项目任意数量,以进行分布式运算。
-
RBAC
本权限维护系统是基于RBAC的。
RBAC是指定义人员、角色、权限,人员与角色关联,角色与权限关联,最终达到根据人员获得其所有权限的目的。
本权限维护系统在传统的RBAC之上新增了一个权限表达式层,通过权限表达式层可以更好的与权限对接,其工作机制如下:
- 定义人员、角色、权限表达式、权限四个实体对象。
- 人员与角色多对多。
- 角色与权限表达式多对多。
- 权限表达式根据一定的规则匹配具体的一个或多个权限。
-
权限查询机制
本系统在权限查询时,会查按照如下的逻辑执行查询:
- 查询一个人员对应的所有(有效的)角色,并且查询每个角色的所有权限表达式。
- 为每个角色创建包含权限集合、排除权限集合,并且创建一个全局的排除权限集合。
- 遍历所有权限,通过其权限表达式向权限对应的包含权限集合、排除权限集合,以及全局的权限排除集合中添加权限。
- 遍历所有权限,从每个权限对应的包含权限集合中减去每个权限对应的排除权限集合,每个权限得到的新集合合并,生成全局包含权限集合。
- 全局包含权限集合减去全局排除权限集合,得到最终的权限。
权限表达式的格式为
[修饰符][表达式标识符]@[表达式内容]
例如
+id_regex@^.*\.1$
[email protected]
修饰符有三个,分别是 +
, -
, !
+
为当前角色包含修饰符,表达式匹配的所有权限将会放在包含权限集合中-
为当前角色排除修饰符,表达式匹配的所有权限将会放在排除权限集合中!
为全局排除修饰符,表达式匹配的所有权限将会放在全局排除权限集合中
注意: -
与 !
的区别是,-
排除的权限只对本角色有效,如果其它角色包含了本角色排除的权限,则用户最终具有本角色被排除的权限;
!
排除的权限全局有效,即使其它角色包含了被本权限全局排除的权限,用户最终不具有被全局排除的权限
表达式标识符和表达式内容成对出现。表达式标识符定义表达式的功能;表达式内容应按照表达式标识符的要求编写,定义了表达式的内容。
标识符不区分大小写。
本系统预设了3个表达式标识符,可以对应多数情形,且表达式标识符支持插件式扩展。
系统预设
标识符 | 表达式内容 | 说明 |
---|---|---|
EXACT | 文本 | 匹配权限与表达式内容相等的权限(精确匹配) |
PREFIX | 文本 | 匹配以表达式内容开头的所有权限 |
REGEX | 正则表达式 | 匹配所有符合表达式内容对应的正则表达式的所有权限 |
该项目可以进行插件扩展,将自己编写的插件放在项目的 libext
文件夹中,并且在 optext
中编写spring加载文件,以实现插件的加载。
注意:optext
目录下的spring加载文件请满足opt*.xml
的格式,即以opt开头,以.xml结尾。
该项目可以进行插件扩展,将自己编写的插件放在项目的 libext
文件夹中,并且在 optext
中编写spring加载文件,以实现插件的加载。
注意:optext
目录下的spring加载文件请满足opt*.xml
的格式,即以opt开头,以.xml结尾。
本项目支持权限表达式的扩展
扩展权限表达式时,请实现接口实现接口
com.dwarfeng.rbacwr.impl.handler.PermissionFilter
,并将实现类注入到spring的IoC容器中。
以下代码是表达式标识符EXACT的实现代码,以供参考
/**
* 精确匹配的权限过滤器。
*
* @author DwArFeng
* @since 1.0.0
*/
@Component
public class ExactPermissionFilter implements PermissionFilter {
@Override
public String getIdentifier() {
return "EXACT";
}
@Override
public boolean accept(String pattern, String permissionContent) {
return Objects.equals(pattern, permissionContent);
}
}
该项目依赖于 subgrade
项目。
该项目自从 1.5.3.a
以后,与 subgarde
的 <1.4.0.a
版本不兼容。