Ralasafe访问控制(权限管理)中间件的配置工作非常少。因为项目发起人非常讨厌配置。因此,“己所不欲,勿施于人”,Ralasafe的配置也非常少。
Ralasafe配置工作只有3个:
-
数据源配置
-
用户元数据配置
-
web.xml配置策略XML文件存储路径
权限逻辑配置,使用Ralasafe web控制端在线图形化设计,无需手工配置。
Ralasafe将来可能会采取图形化方式处理前面提到的3种配置工作。但现在还是让我们先熟悉一下配置工作吧。
数据源配置
配置入口
Ralasafe不仅强调权限与业务解耦合,也强调权限数据与业务数据解耦合,独立保存。
Ralasafe数据源的入口是WEB-INF/ralasafe/datasources.xml文件,里面配置2个数据源。
-
其中1个是name=“ralasafe”的权限数据源,该数据源里面将保存权限数据。configFile属性指该权限数据源的详细配置信息,名称随意,但对应的文件必须也在WEB-INF/ralasafe目录下;
-
另1个是业务数据源,name属性自定义,只要不等于“ralasafe”即可。configFile属性指该业务数据源的详细配置信息,名称随意,但对 应的文件必须也在WEB-INF/ralasafe目录下。schema属性可选(可以有,也可以没有),该属性表示在数据查询页面显示数据源哪几个 schema的表和视图。
下面是ralasafe demo自带的数据源配置信息:
<?xml version="1.0"?> <datasources> <datasource name="ralasafe" configFile="ralasafe-db.properties"/> <datasource name="app" configFile="app-ds.properties" schemas="mydemo,ralasafe"/> </datasources>
表示2个数据源:ralasafe和app。ralasafe数据源配置信息在ralasafe-db.properties文件里面;
app数据源配置信息在app-ds.properties里面;在设计数据查询页面,指显示mydemo和ralasafe两个schema里面的表和视图。
如下截图是,进入Ralasafe web控制端的查询设计界面,显示的数据库表和视图信息:
如果,我将datasources.xml配置文件的schemas改成schemas=“mydemo”。将只显示mydemo里面的数据表和视图,不显示ralasafe里面的表和视图。
详细配置信息
前面讲到的configFile里面提到的配置文件,又如何配置数据源呢?Ralasafe又支持几种配置方式的数据源呢?
Ralasafe支持3种方式配置数据源,且3种配置方式,都随发行包提供了示例。这些示例就是在WEB-INF/ralasafe目录下的ralasafe-db.properties,jndi.properties和method.properties。 下面详细叙述它们。
DBCP数据源
ralasafe-db.properties就是DBCP(http://commons.apache.org/dbcp/)数据源配置示例,Ralasafe将按照配置信息启动一个DBCP数据源。
配置参数有jdbc驱动、用户名、密码和url等。配置参数与DBCP一致。
jdbcDriver=com.mysql.jdbc.Driver jdbcUrl=jdbc:mysql://localhost/ralasafe?useUnicode=true jdbcUser=root jdbcPassword=1234 connectionPoolMaxSize=5 connectionPoolMaxIdle=2 connectionPoolMaxWait=60000 connectionPoolMinSize=0
JNDI数据源
JNDI数据源在Java EE程序里面非常常见。Ralasafe使用JNDI数据源,配置参数非常简单。
写上type=jndi,然后配上jndi的名称即可。
以下是配置示例:
type=jndi jndiName=jdbc/datasourceName
通过方法调用获取数据源
假如,你的数据源需要通过调用API暴露(当然,我承认这种情况非常少)。当初,我是这么想的:或许有一种数据源我没用考虑到。那么就通过某个java方法调用获取吧。
假如你有这样的API:
public javax.sql.DataSource com.your.company.db.DatasourceProvider.getDatasource();
那么对应的配置就是:
type=method class=com.yourcompany.db.DataSourceProvider method=getDatasource
创建基本权限数据库表
当权限数据源配置好后,你还需要在权限数据库执行如下脚本,创建基础权限数据表。
-- ralasafe schema CREATE TABLE ralasafe_sequence ( currentValue int, name varchar(100) NOT NULL, PRIMARY KEY( name ) ); CREATE TABLE usertype ( name varchar(100) NOT NULL, description varchar(500), userMetadataXML varchar(4000), PRIMARY KEY(name) ); CREATE TABLE application ( name varchar(100) NOT NULL, description varchar(500), PRIMARY KEY(name) ); CREATE TABLE applicationusertype ( appName varchar(100) NOT NULL, userTypeName varchar(100) NOT NULL, userMetadataStr varchar(1000), PRIMARY KEY(appName, userTypeName) );
以上脚本,也随发行包提供,文件名称是sql/create-database.sql。
用户元数据配置
用户元数据的目的,就是为了说明当前应用系统的用户信息保存在哪里,有哪些字段,对应的业务意义是什么。
在Ralasafe权限策略里面,钻取用户属性,我们使用业务意义的名称,而不是数据库列字段名称。
你可以在本地配置好用户元数据文件,然后通过Ralasafe web控制端安装。安装方法为,首先登陆Ralasafe web控制端,比如:http://localhost:8080/demo/ralasafe/designer.rls,在左侧“架构师”一栏中选择【用户元数据】菜单;接着在“用户元数据”页面中,填写描述,并选择对应的用户元数据文件;最后,点击【Submit】按钮,系统将开始安装用户元数据。操作过程如下图所示:
当用户元数据被顺利安装后,会在权限数据库生成 9 张表:
ralasafe_businessdata,ralasafe_decision_entitlement,ralasafe_privilege,ralasafe_query,ralasafe_query_entitlement,ralasafe_ralasafe_userrole,ralasafe_role,ralasafe_roleprivilege 和ralasafe_usercategory。和前面手工创建的4张表一起,权限数据库应该共有 13 张表。如果没有 13 张表,说明安装用户元数据过程失败,需要重新安装。
Ralasafe 1.1-版本还有ralasafe-backup表。该表在1.2+版本不再使用。
如下是Ralasafe demo应用的用户元数据配置信息:
<?xml version="1.0"?> <user> <table ds="app" name="mainTable" sqlName="UserView" uniqueFields="loginName"> <field name="id" columnName="id" sqlType="int" javaType="java.lang.Integer" /> <field name="name" columnName="name" sqlType="varchar(40)" javaType="java.lang.String" displayName="Name" show="true" /> <field name="companyName" columnName="companyName" sqlType="varchar(100)" javaType="java.lang.String" displayName="Company" show="true" /> <field name="loginName" columnName="loginName" sqlType="varchar(40)" javaType="java.lang.String" /> <field name="password" columnName="password" sqlType="varchar(40)" javaType="java.lang.String" /> <field name="isManager" columnName="isManager" sqlType="int" javaType="java.lang.Boolean" /> <field name="companyId" columnName="companyId" sqlType="int" javaType="java.lang.Integer" /> <field name="departmentId" columnName="departmentId" sqlType="int" javaType="java.lang.Integer" /> <field name="companyLevel" columnName="companyLevel" sqlType="int" javaType="java.lang.Integer" /> </table> </user>
如上配置表示:
-
用户表在app数据源下,表名称是sqlName=“UserView”;
-
name=“mainTable”是目前固定写法,不能改变,在后继版本会引入新的意义;
-
这个表的unique fields是”loginName”,如果有多个字段(如loginName,companyId)确定唯一用户,中间用逗号隔开即可。这里填写的是字 段必须在field元素里面有配置,而且填写的是field name属性值,而不是columnName属性值;
-
field元素表示用户表的字段,每个字段的数据库列字段名称是什么(columnName属性),对应的业务意义是什么(name属性);
-
其中有2个业务意义字段是必须的:id和name,分别代表用户唯一id和用户名称;
-
field的show=“true”表示该字段在页面显示,displayName属性表示该字段在页面显示名称(测试权限策略的时候,比如测试某用户查 询订单权限时,Ralasafe弹出的选择选择用户对话框,将显示show=”true”的用户字段,各个字段的title就是 displayName)。
注:
-
用户元数据配置支持数据库表和数据库视图。如果你的用户信息分散在多个表里面,你只要创建一个视图将用户各个字段统一到视图里面,然后在table的sqlName属性设置为你新创建的视图。
Ralasafe demo的用户信息被统一到视图里面: create or replace view userview as select d."ID",d."LOGINNAME",d."NAME",d."PASSWORD",d."COMPANYID",d."DEPARTMENTID",d."ISMANAGER", d."HIREDATE",c.companylevel,c.name as companyName from demouser d, company c where d.companyid=c.id;
-
如果你的用户表没有id字段,但有一个唯一字段,那么可以将该字段等同于id字段设置到id里面。如:数据列myname是唯一字段,那么id字段可以设置为<field name=“id” columnName=“myname”….
-
如果你的用户表没有id字段,同时有多个唯一字段组合,那么你应该创建视图“做出”一个逻辑id字段,然后设置到id里面。如数据列myname和companyId是唯一字段组合,可以创建视图
CREATE VIEW myview AS SELECT myname||companyId AS userId...
XML文件存储路径配置
因为各个数据库之间平台移植,大字段往往造成很大困难。所以,我们干脆将XML文件存在文件系统里面,就不存放在数据库里面。这样移植就方便很多;Ralasafe也多了一项配置工作——XML文件存储路径。
打开WEB-INF/web.xml,找到如下代码行:
<servlet> <servlet-name>ralasafe</servlet-name> <servlet-class>org.ralasafe.servlet.RalasafeController</servlet-class> <init-param> <param-name>repositoryDir</param-name> <param-value>/home/julian/workspace/ralasafe/xml</param-value> </init-param> <init-param> <param-name>secured</param-name> <param-value>false</param-value> </init-param> <load-on-startup>4</load-on-startup> </servlet>
设置repositoryDir的参数值为你存放XML存储路径的地方,如:d:/yourproject/xml等。等安装往用户元数据后,系统会自动在该目录下生成一些目录。目录结构是:
${repositoryDir} |____ralasafe |____businessData |____query |____userCategory |____usertype
该配置也支持相对目录,只要new File(${repositoryDir})能找到对应目录即可。详情参考:论坛文章:配置repositoryDir的相对路径 。