Web 应用程序中的安全角色引用
使用可用的程序化安全性 Java™ Platform, Enterprise Edition (Java EE) 应用程序编程接口 (API) isUserInRole(String roleName) 和 isCallerInRole(String roleName) 时,Web 应用程序开发者或 Enterprise JavaBeans (EJB) 提供程序必须使用代码中的角色名称。
将 Web 应用程序和 EJB 组件(例如,Web 归档(WAR) 文件和 ejb-jar.xml 文件)组装到企业归档 (EAR) 文件中之前,已部署的运行时环境中使用的角色可能是未知的。因此,在 Web 应用程序或 EJB 组件代码中使用的角色名称都是逻辑角色名称,在应用程序组装期 间,应用程序组装器将这些逻辑角色名称映射至实际运行时环境角色。安全角色引用提供了一个间接层,该间接层使得 Web 应用程序组件和 EJB 开发者不必知道运行时环境中的实际角色。
逻辑角色的定义以及指向实际运行时环境角色的映射是在 Web 应用程序部署描述符和 EJB JAR 文件部署描述符(分别为 web.xml 和 ejb-jar.xml)的 security-role-ref 元素中指定。使用组装工具来定义角色名称并通过 role-link 元素来将它们映射至环境中的实际运行时角色。
... <enterprise-beans>
... <entity>
<ejb-name>AardvarkPayroll</ejb-name>
<ejb-class>com.aardvark.payroll.PayrollBean</ejb-class>
...
<security-role-ref>
<description>
应将此角色指定给工资管理部门的职员。此角色的成员可以访问每个人的工资单记录。该角色已链接至 payroll-department 角色。应将此角色指定给工资管理部门的职员。具有此角色的成员可以访问所
有工资单记录。该角色已链接至 payroll-department 角色。</description> <role-name>payroll</role-name>
<role-link>payroll-department</role-link>
</security-role-ref>
...
</entity>
...
</enterprise-beans>
在前面的示例中,出现在 <role-name> 元素中的字符串 payroll 就是 EJB 提供程序用作 isCallerInRole() API 的参数的内容。正是 <role-link> 元素将逻辑角色与运行时环境中使用的实际角色联系起来。
注意,对于企业 Bean,即使逻辑角色名称与环境中的实际角色名称相同,security-role-ref 元素也必须出现在部署描述符中。
规则 Web 应用程序组件略有不同。如果没有声明与 security-role 元素相匹配的 security-role-ref 元素,那么缺省情况下,容器必须根据 Web 应用程序的 security-role 元素列表检查 role-name 元素参数。isUserInRole 方法引用该列表来确定是否已将调用者映射至安全角色。开发者必须注意,使用这种缺省机制可能会限制在应用程序中更改角色名称时不必重新编译执行调用的 Servlet 的灵活性。
请参阅“安全性:学习资源”一文中的 EJB V2.0 和 Servlet V2.3 规范,以了解有关此规范的完整详细信息。