当您在
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>
<group-name>Administrators</group-name>
</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>
<group-name>Administrators</group-name>
</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>
<group-name>Administrators</group-name>
</security-role-mapping>
...
</glassfish-ejb-jar>
上述描述符将角色“用户”映射到具有名称“Root”的个人身份的主体,并将其映射到领域中名称为“管理员”的用户组。您可以省略这些映射中的任何一个,仅保留角色到主体映射或角色到组映射。您还可以将多个主体映射到同一角色,或将多个组映射到同一角色,甚至将多个主体和组映射到同一角色。
了解JAAS领域中主体和组的概念非常重要-主体表示系统中Subject(登录应用程序的用户)的身份,它可以是单个用户的个人身份,也可以是用户组的组身份。通过将声明性角色映射到实际的主体或组,可以对任何用户身份数据库(即任何领域)执行在web.xml中指定的规则,并且可以动态地执行此操作而不需要更改代码库。毕竟,这样的更改需要重新映射声明性角色到可能不同的领域中的新的主体和组集。您可以在
Java EE 6教程中的安全章节中找到有关Java EE安全和JAAS如何协同工作的基本教程。
Glassfish允许一种简化的映射方案,即只要声明角色的名称与主体或组的名称相似,就无需对容器特定部署描述符(在本例中为glassfish-web.xml)中的所有声明性角色执行映射。这是默认的主体到角色映射方案。在您的情况下,您领域中的主体/组与
web.xml
中指定的声明性角色相同,因此您将避免显式地将角色映射到主体和组。简而言之,如果角色
user
与JAAS领域中的主体
user
或用户组
user
相同(其他标识类似),则可以使用Glassfish的默认角色到主体映射方案,而无需为
web.xml
文件中的每个角色进行映射。
如果您希望避免勾选默认主体到角色映射的部署选项,则必须在容器特定部署描述符中提供角色到主体/组映射,就像通常为其他应用服务器所做的那样。
您可以通过阅读
blogs.oracle.com上描述Glassfish此功能的文章之一来了解更多有关此主题的信息。
glassfish-web.xml
中删除角色到主体的映射,而只使用角色到组的映射。 - Vineet Reynolds