Glassfish 3.1默认主体到角色映射

时间:2011-07-18 02:28:56

标签: java java-ee glassfish jaas

我正在使用glassfish和jaas模块。

我以这种方式配置了我的web.xml。

<security-constraint>
    <web-resource-collection>
        <web-resource-name>ALL Page for admin</web-resource-name>
        <url-pattern>/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>user</role-name>
    </auth-constraint>
</security-constraint>
<login-config>
    <auth-method>BASIC</auth-method>
    <realm-name>file</realm-name>
</login-config>
<security-role>
    <description>Administrator</description>
    <role-name>user</role-name>
</security-role>

这意味着所有想要访问我的Web应用程序的用户都需要是组用户。

然后在glassfish控制台上我需要勾选以下选项: 配置 - &gt; server-config - &gt;安全 - &gt;默认主体到角色映射

我的问题是为什么我需要将此默认主体勾选到角色映射?我如何更改我的web.xml以避免勾选它?

非常感谢

卢瓦克

1 个答案:

答案 0 :(得分:38)

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中阅读有关此主题的更多信息。