2012年5月30日星期三

ADF_127:使用userGrantedResource和userGrantedPermission表达式

运行环境:JDeveloper 11.1.2.1.0 + Oracle Database 10g Express Edition 10.2.0.1。

本来想在上一个实验的基础上继续做本实验,但是遇到一些问题,因此切换到JDeveloper 11.1.2.1.0开发环境。
不知道是不是因为JDeveloper 11.1.1.5的Bug或者因为使用了Database作为Policy Store。待查。
本实验在建立《为ADF Web应用增加安全》的基础之上。

重点步骤说明:

1. 设置ProductBase EO的安全
说明:实体的安全是扩展ADFPermission类而来的。
(1)打开read、update、delete的权限。

(2)给staff授予read权限。

(3)给supplier授予read、update、delete权限。

(4)修改edit.jsf页面,增加一个按钮:TestEnitityPermission,绑定相应的EL。
实体的安全是扩展ADFPermission类而来的,对应的EL写法如下:
<af:commandButton text="TestEnitityPermission" id="cb7" disabled="#{!securityContext.userGrantedPermission['permissionClass=oracle.adf.share.security.authorization.EntityPermission;target=model.ProductsBase;action=update']}"/>

2. 增加自定义的ResourcePermission
这个特性意味着你可以增加自己的Permission,你能想出的灵活的权限也就是这样了吧!
(1)在Resource Grants界面,点击Resource Type旁边的绿色的加号,增加一个ResourcePermission:
这里仅仅是出于测试的目的,自定义一个ButtonPermission,实际开发中不需要为Button专门定义Permission。
因为完全可以用已有的EL表达式绑定到Button的各个属性。

(2)把ButtonPermission权限授予supplier角色:

(3)修改edit.jsf页面,增加一个按钮:TestResourcePermission,绑定相应的EL。
自定义的ResourcePermission是扩展ResourcePermission类而来的,对应的EL写法如下:
<af:commandButton text="TestResourcePermission" id="cb8" disabled="#{securityContext.userGrantedResource['resourceType=ButtonPermission;resourceName=Button;action=disable']}"/>
注意,这个表达式的意思是拥有disable的角色返回true,因此就会disable这个Button。

3. 使用不同的用户登录测试
(1)使用achen登录,achen拥有supplier角色,因此achen拥有read、update、delete ProductBase实体对象和disable ButtonPermission的权限。

可以看出achen可以点击Delete和TestEntityPermission按钮,不可以点击TestResourcePermission按钮。
(2)使用sking登录,sking拥有staff角色,因此sking只拥有read ProductBase实体对象的权限。

可以看出sking不可以点击Delete和TestEntityPermission按钮,可以点击TestResourcePermission按钮。

4. 如何使用程序判断用户是否具有某个Permission?
(1)使用程序判断用户是否具有某个ResourcePermission?
public void testResourcePermission() {
String resourceType = "ButtonPermission";
String resourceName = "Button";
String action = "disable";

SecurityContext securityCtx = ADFContext.getCurrent().getSecurityContext();
ResourcePermission resourcePermission = new ResourcePermission(resourceType, resourceName, action);
boolean userHasPermission = securityCtx.hasPermission(resourcePermission);
System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$ ResourcePermission " + userHasPermission);
}

(2)使用程序判断用户是否具有某个ADFPermission,如EntityPermission?
public void testEntityPermission() {
String target = "model.ProductsBase";
String action = "update";

SecurityContext securityCtx = ADFContext.getCurrent().getSecurityContext();
EntityPermission entityPermission = new EntityPermission(target, action);
boolean userHasPermission = securityCtx.hasPermission(entityPermission);
System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$ EntityPermission " + userHasPermission);
}
(3)运行edit.jsf,分别使用不同用户登录,并点击TestPermission按钮
使用用户achen登录后,点击TestPermission按钮,输出了两个true。
使用用户sking登录后,点击TestPermission按钮,输出了两个false。

Project 下载:SecureApplication(userGrant).7z

没有评论: