Apache Open For Business(Apache OFBiz) 是Apache开源的一个经典ERP项目。它提供了一套企业应用,用于集成以及自动化一些企业的“商业流程”。
从学习角度来看,它也是一个非常不错的企业级应用框架。这篇文章从OFBiz的权限设计这一切入点来谈谈OFBiz对于应用系统的权限设计。
设计思想简述OFBiz采用的“安全组”(Security Group)来将"权限"跟"用户"联系起来。系统中有若干种权限,比如系统预置的权限、用户自定义的权限、资源的权限、操作的权限等等,这些权限会跟安全组建立关系(多对多的关系),而用户又与安全组建立关系(也是多对多的关系)。
其中,系统预置权限,是以XML配置的方式导入数据表的。这些配置文件通常的路径为{Component/Application baseDir}/data/XXXSecurityData.xml。这里有对整个权限设计相关表的初始化数据。
权限控制级别OFBiz对于权限有如下几个控制级别:
登录级别在每个Component的根目录下的ofbiz-component.xml文件下,有对于访问该component的“最基本的权限”定义。所谓最基本的权限,就是登录该component的用户需要至少拥有该文件内定义的权限才可以访问。示例:
见其中的“base-permission”属性。可以看到它包含了两个权限值——OFBTOOLS/FACILITY,这也意味着你必须同时拥有这两个权限才能访问该组件。而通常一个Component也会同时包含权限“OFBTOOLS”以及权限“COMPONNENT-NAME_VIEW”,这样配置的目的是OFBTOOLS用于对web app的访问进行控制,而COMPONNENT-NAME_VIEW用于控制浏览web app的信息。
component 菜单级别component的顶级菜单显示的组件将只对登录过的用户(并且这些用户至少具有“WEBAPP-NAME_VIEW”或者“COMPONENT_NAME-ADMIN”权限)显示,这跟登录级别的限制相似。这种级别的访问控制实现在“appbar.ftl”中用以控制显示哪些应用程序的tab bar。
request(controller.xml)级别这里有两个重要的参数,在每个component的webapp下的controller.xml中的每个request(<request-map)标签有一个security(<security)标签,包含了两个属性:
https:定义是否对该请求应用SSL加密
auth:定义是否需要登录才能执行该请求,因此只有在登录成功以及在其他级别上的安全检查通过后,该请求才会被执行
<!-- Request Mappings -->
<request-map uri="MarketingReport">
<security https="true" auth="true"/>
<response type="view" value="MarketingReport"/>
</request-map>
在每个component下的widget文件夹下的screen配置文件中,<section节点下的<condition子节点,存在一个名为<if-has-permission的节点,它有两个属性:
permission:标识位于哪个component
action:标识执行的动作
permission_action正好构成一个权限,示例: