文章目录
OFBiz —— 关于用户角色安全组的设计
前言
设计一个saas架构的权限系统,这里基于OFBiz用户角色安全组的设计原则进行设计,在此记录。
OFBiz 安全组核心表
SECURITY_GROUP - 安全组
OFBiz中,安全组绑定用户登陆主键(USER_LOGIN_ID),间接与权限产生关系,一个安全组包含N个权限的集合。
- 建表语句
DROP TABLE IF EXISTS `security_group`;
CREATE TABLE `security_group` (
-- 安全组主键
`GROUP_ID` varchar(20) NOT NULL,
-- 安全组描述
`DESCRIPTION` varchar(255) DEFAULT NULL,
`LAST_UPDATED_STAMP` datetime DEFAULT NULL,
`LAST_UPDATED_TX_STAMP` datetime DEFAULT NULL,
`CREATED_STAMP` datetime DEFAULT NULL,
`CREATED_TX_STAMP` datetime DEFAULT NULL,
PRIMARY KEY (`GROUP_ID`),
KEY `SCRT_GRP_TXSTMP` (`LAST_UPDATED_TX_STAMP`),
KEY `SCRT_GRP_TXCRTS` (`CREATED_TX_STAMP`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
SECURITY_PERMISSION - 权限表
权限表,定义系统中所有的权限。
PERMISSION_ID 规则:“APPLICATION_OPERTATE”,例如一个可查看首页权限,定义为“INDEX_VIEW”,首页可修改权限(INDEX_UPDATE)。让具体权限分配到按钮级,结合安全控制管理组件实现按钮级别的后台可配功能。
- 建表语句
DROP TABLE IF EXISTS `security_permission`;
CREATE TABLE `security_permission` (
-- 权限主键
`PERMISSION_ID` varchar(60) NOT NULL,
-- 权限描述
`DESCRIPTION` varchar(255) DEFAULT NULL,
`LAST_UPDATED_STAMP` datetime DEFAULT NULL,
`LAST_UPDATED_TX_STAMP` datetime DEFAULT NULL,
`CREATED_STAMP` datetime DEFAULT NULL,
`CREATED_TX_STAMP` datetime DEFAULT NULL,
PRIMARY KEY (`PERMISSION_ID`),
KEY `SCRT_PRMSSN_TXSTMP` (`LAST_UPDATED_TX_STAMP`),
KEY `SCRT_PRMSSN_TXCRTS` (`CREATED_TX_STAMP`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
SECURITY_GROUP_PERMISSION - 权限与安全组多对多关系表
PERMISSION与GROUP的中间表,一个安全组可以拥有多个权限,一个权限同时可以属于多个安全组。
- 建表语句
DROP TABLE IF EXISTS `security_group_permission`;
CREATE TABLE `security_group_permission` (
-- 安全组主键
`GROUP_ID` varchar(20) NOT NULL,
-- 权限主键
`PERMISSION_ID` varchar(60) NOT NULL,
`LAST_UPDATED_STAMP` datetime DEFAULT NULL,
`LAST_UPDATED_TX_STAMP` datetime DEFAULT NULL,
`CREATED_STAMP` datetime DEFAULT NULL,
`CREATED_TX_STAMP` datetime DEFAULT NULL,
-- 联合主键
PRIMARY KEY (`GROUP_ID`,`PERMISSION_ID`),
-- 外键关联到安全组
KEY `SEC_GRP_PERM_GRP` (`GROUP_ID`),
KEY `SCT_GRP_PRMN_TXSTP` (`LAST_UPDATED_TX_STAMP`),
KEY `SCT_GRP_PRMN_TXCRS` (`CREATED_TX_STAMP`),
CONSTRAINT `SEC_GRP_PERM_GRP` FOREIGN KEY (`GROUP_ID`) REFERENCES `security_group` (`GROUP_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
USER_LOGIN_SECURITY_GROUP - 用户登陆安全组表
是一个多对多表,USER_LOGIN_ID、GROUP_ID、FROM_DATE同时联合主键,FROM_DATE作为配置启用时间存在,与THRU_DATE成对判断,当安全组失效当时候不会删除数据,而是设置失效即可,在业务执行时,可以通过判断过期时间来做业务控制,也规避“删除”数据导致的问题发生,系统有留痕。
- 建表语句
DROP TABLE IF EXISTS `user_login_security_group`;
CREATE TABLE `user_login_security_group` (
-- 用户登陆主键(一个用户可以有多个登陆账号,用户用PARTY作为主键,USER_LOGIN是扩展的用户登陆表)
`USER_LOGIN_ID` varchar(250) NOT NULL,
-- 安全组主键
`GROUP_ID` varchar(20) NOT NULL,
-- 配置时间
`FROM_DATE` datetime NOT NULL,
-- 过期时间
`THRU_DATE` datetime DEFAULT NULL,
`LAST_UPDATED_STAMP` datetime DEFAULT NULL,
`LAST_UPDATED_TX_STAMP` datetime DEFAULT NULL,
`CREATED_STAMP` datetime DEFAULT NULL,
`CREATED_TX_STAMP` datetime DEFAULT NULL,
-- `USER_LOGIN_ID`,`GROUP_ID`,`FROM_DATE` 为联合主键
PRIMARY KEY (`USER_LOGIN_ID`,`GROUP_ID`,`FROM_DATE`),
KEY `USER_SECGRP_USER` (`USER_LOGIN_ID`),
KEY `USER_SECGRP_GRP` (`GROUP_ID`),
KEY `USR_LGN_SCT_GRP_TP` (`LAST_UPDATED_TX_STAMP`),
KEY `USR_LGN_SCT_GRP_TS` (`CREATED_TX_STAMP`),
CONSTRAINT `USER_SECGRP_GRP` FOREIGN KEY (`GROUP_ID`) REFERENCES `security_group` (`GROUP_ID`),
CONSTRAINT `USER_SECGRP_USER` FOREIGN KEY (`USER_LOGIN_ID`) REFERENCES `user_login` (`USER_LOGIN_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
PARTY_RELATIONSHIP - “当事人”关系表
这张表中字段“SECURITY_GROUP_ID字段用来关联一个安全组,通常我们对登陆用户(即“当事人的一种”)我们是不会在这里配置关联安全组的,所以这个字段通常是空,对于登陆用户,我们使用USER_LOGIN_SECURITY_GROUP即可,可这只能确认一种登陆用户的权限,实际开发中系统中的“当事人”不止仅有登陆用户,还有机构等,而这些机构也有自己的安全组,同时也和别的“当事人”存在关系,我们就可以在这里配置。
- 建表语句
DROP TABLE IF EXISTS `party_relationship`;
CREATE TABLE `party_relationship` (
-- 源当事人
`PARTY_ID_FROM` varchar(20) NOT NULL,
-- 目标当事人
`PARTY_ID_TO` varchar(20) NOT NULL,
-- 源当事人角色
`ROLE_TYPE_ID_FROM` varchar(20) NOT NULL,
-- 目标当事人角色
`ROLE_TYPE_ID_TO` varchar(20) NOT NULL,
-- 开始日期
`FROM_DATE` datetime NOT NULL,
-- 截止日期
`THRU_DATE` datetime DEFAULT NULL,
-- 状态
`STATUS_ID` varchar(20) DEFAULT NULL,
-- 当事人关系名称
`RELATIONSHIP_NAME` varchar(100) DEFAULT NULL,
-- 安全组标识
`SECURITY_GROUP_ID` varchar(20) DEFAULT NULL,
-- 优先类型标识
`PRIORITY_TYPE_ID` varchar(20) DEFAULT NULL,
-- 当事人关系类型标识
`PARTY_RELATIONSHIP_TYPE_ID` varchar(20) DEFAULT NULL,
-- 权限枚举标识
`PERMISSIONS_ENUM_ID` varchar(20) DEFAULT NULL,
-- 职位头衔
`POSITION_TITLE` varchar(100) DEFAULT NULL,
-- 说明
`COMMENTS` varchar(255) DEFAULT NULL,
-- 更新时间
`LAST_UPDATED_STAMP` datetime DEFAULT NULL,
-- 最后更新事务时间
`LAST_UPDATED_TX_STAMP` datetime DEFAULT NULL,
-- 创建时间
`CREATED_STAMP` datetime DEFAULT NULL,
-- 创建事务时间
`CREATED_TX_STAMP` datetime DEFAULT NULL,
PRIMARY KEY (`PARTY_ID_FROM`,`PARTY_ID_TO`,`ROLE_TYPE_ID_FROM`,`ROLE_TYPE_ID_TO`,`FROM_DATE`),
KEY `PARTY_REL_FPROLE` (`PARTY_ID_FROM`,`ROLE_TYPE_ID_FROM`),
KEY `PARTY_REL_TPROLE` (`PARTY_ID_TO`,`ROLE_TYPE_ID_TO`),
KEY `PARTY_REL_STTS` (`STATUS_ID`),
KEY `PARTY_REL_PRTYP` (`PRIORITY_TYPE_ID`),
KEY `PARTY_REL_TYPE` (`PARTY_RELATIONSHIP_TYPE_ID`),
KEY `PARTY_REL_SECGRP` (`SECURITY_GROUP_ID`),
KEY `PRT_RLTNSHP_TXSTMP` (`LAST_UPDATED_TX_STAMP`),
KEY `PRT_RLTNSHP_TXCRTS` (`CREATED_TX_STAMP`),
CONSTRAINT `PARTY_REL_SECGRP` FOREIGN KEY (`SECURITY_GROUP_ID`) REFERENCES `security_group` (`GROUP_ID`),
CONSTRAINT `PARTY_REL_FPROLE` FOREIGN KEY (`PARTY_ID_FROM`, `ROLE_TYPE_ID_FROM`) REFERENCES `party_role` (`PARTY_ID`, `ROLE_TYPE_ID`),
CONSTRAINT `PARTY_REL_PRTYP` FOREIGN KEY (`PRIORITY_TYPE_ID`) REFERENCES `priority_type` (`PRIORITY_TYPE_ID`),
CONSTRAINT `PARTY_REL_STTS` FOREIGN KEY (`STATUS_ID`) REFERENCES `status_item` (`STATUS_ID`),
CONSTRAINT `PARTY_REL_TPROLE` FOREIGN KEY (`PARTY_ID_TO`, `ROLE_TYPE_ID_TO`) REFERENCES `party_role` (`PARTY_ID`, `ROLE_TYPE_ID`),
CONSTRAINT `PARTY_REL_TYPE` FOREIGN KEY (`PARTY_RELATIONSHIP_TYPE_ID`) REFERENCES `party_relationship_type` (`PARTY_RELATIONSHIP_TYPE_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
版权声明:本文为Cy_LightBule原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。