我正在完成一个Java EE 6应用程序。这个应用程序是用GlassFish开发的,但我想让它可以在不同的应用服务器上移植。
安全性是通过在应用程序的数据源中定义用户和组来实现的,因此通过使用GlassFish的jdbcRealm。我知道在其他应用服务器中存在类似的实现(尽管我还没有看到细节,但是)。
为了使我的应用程序可移植,我需要了解是否安全角色和主体/用户之间的映射可以在应用程序服务器本身或应用程序源代码中定义,而不使用特定于应用服务器的部署描述符glassfish-web.xml
或等同物。这将避免部署人员编辑.war
文件的任务,这是我想要的,因为应用程序必须是可移植的。
由于我已经将角色映射到具有相同名称的应用程序定义的组,因此我想要删除的代码是
<security-role-mapping>
<role-name>RoleGroup1</role-name>
<group-name>RoleGroup1</group-name>
</security-role-mapping>
<security-role-mapping>
<role-name>RoleGroup2</role-name>
<group-name>RoleGroup2</group-name>
</security-role-mapping>
根据ebj3.1规范:
17.2.5.3从Bean代码中引用的安全角色声明另外…
如果没有使用DeclareRoles注释,Bean Provider必须使用使用部署描述符的security-role-ref元素来声明代码中引用的安全角色。的Security-role-ref元素的定义如下:
使用role-name元素声明安全角色的名称。名称必须是控件的参数isCallerInRole(String roleName)方法。
可选地在description元素中提供安全角色的描述。
:
如果使用部署描述符,则Bean提供者和/或Application Assembler使用安全角色部署描述符元素如下:
- 使用security-role元素定义每个安全角色。
- 使用role-name元素定义安全角色的名称。
- 可选地,使用description元素来提供安全角色的描述。
下面的示例说明了a中的安全角色定义部署描述符。
<assembly-descriptor> <security-role> <description> This role includes the employees of the enterprise who are allowed to access the employee self-service application. This role is allowed only to access his/her own information. </description> <role-name>employee</role-name> </security-role>