当您在web.xml 中指定角色和角色时,您使用的是声明式安全性,它本质上依赖于使用 JAAS 来强制执行以声明方式指定的身份验证和授权要求。
部署描述符中指定的角色只是应用程序中使用的角色的表示。这些角色不必与运行时使用的用户身份数据库(或身份验证领域)中的角色相同,而且通常这些角色可能不同,因为应用程序的开发可能已经在不考虑实际用户和用户身份数据库中存在的组。
通常,在web.xml 中指定的声明性角色与使用容器特定部署描述符的用户身份数据库中存在的主体或组之间执行映射。在 Glassfish 3,1 中,这恰好是 glassfish-web.xml 文件。每个此类映射都将应用程序中的声明性角色映射到 JAAS 领域中的主体或组,采用以下方式,glassfish-web.xml(用于 WAR 文件部署)或glassfish-application.xml(用于 EAR 文件部署),或glassfish-ejb-jar.xml(用于 EJB JAR 文件部署):
glassfish-web.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE glassfish-web-app PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Servlet 3.0//EN" "http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd">
<glassfish-web-app error-url="">
...
<security-role-mapping>
<role-name>user</role-name>
<principal-name>Root</principal-name> <!-- Map a principal to the role 'user' -->
<group-name>Administrators</group-name> <!-- Map a group to the role 'user' -->
</security-role-mapping>
...
</glassfish-web-app>
glassfish-application.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE glassfish-application PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Java EE Application 6.0//EN" "http://glassfish.org/dtds/glassfish-application_6_0-1.dtd">
<glassfish-application>
...
<security-role-mapping>
<role-name>user</role-name>
<principal-name>Root</principal-name> <!-- Map a principal to the role 'user' -->
<group-name>Administrators</group-name> <!-- Map a group to the role 'user' -->
</security-role-mapping>
...
</glassfish-application>
glassfish-ejb-jar.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE glassfish-ejb-jar PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 EJB 3.1//EN" "http://glassfish.org/dtds/glassfish-ejb-jar_3_1-1.dtd">
<glassfish-ejb-jar>
...
<security-role-mapping>
<role-name>user</role-name>
<principal-name>Root</principal-name> <!-- Map a principal to the role 'user' -->
<group-name>Administrators</group-name> <!-- Map a group to the role 'user' -->
</security-role-mapping>
...
</glassfish-ejb-jar>
上述描述符将角色 user 映射到名称为 Root 的个人身份的 Principal 和领域中名称为 Administrators 的用户组。您可以省略这些映射中的任何一个,而仅保留角色到主体的映射或角色到组的映射。您还可以将多个委托人映射到同一个角色,或者将多个组映射到同一个角色,甚至将多个委托人和组映射到同一个角色。
理解 JAAS 领域中主体和组的概念很重要 - 主体代表系统中主体(登录应用程序的用户)的身份,它可以是个人身份(单个用户)或组身份(用户组)。通过将声明性角色映射到实际的主体或组,可以针对任何用户身份数据库(即任何领域)强制执行web.xml 中指定的规则,并且能够动态地执行此操作而无需对代码库进行任何更改;毕竟,这样的变化需要将声明性角色重新映射到可能不同的领域中的一组新的主体和组。您可以在the chapter on security in the Java EE 6 tutorial 中找到有关 Java EE 安全性和 JAAS 如何协同工作的基本教程。
Glassfish 允许一种简化的映射方案,在这种方案中,无需为容器特定部署描述符(在本例中为 glassfish-web.xml)中的所有声明性角色执行映射,只要声明性的名称即可角色恰好与主体或组的名称相似。这是角色映射方案的默认主体。在您的情况下,您的领域中的主体/组似乎与web.xml 中指定的声明性角色相同,因此您将避免将角色显式映射到主体和组。简而言之,如果角色 user 与您的 JAAS 领域中的主体 user 或用户组 user 相同(对于其他身份也是如此),那么您可以使用 Glassfish 的默认角色到主体映射方案,而不为您的web.xml 文件中的每个角色映射它。
如果您希望避免勾选默认主体到角色映射的部署选项,那么您必须自己在容器特定部署描述符中提供角色到主体/组映射,就像您通常为其他应用程序服务器所做的那样。
您可以在one of the posts on blogs.oracle.com that describes this feature of Glassfish 中阅读有关此主题的更多信息。