OFBiz —— 关于用户角色安全组的设计

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版权协议,转载请附上原文出处链接和本声明。