Glassfish 3.1默认主体到角色映射

use*_*148 17 java glassfish jaas java-ee

我正在使用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>
Run Code Online (Sandbox Code Playgroud)

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

然后在glassfish控制台上我需要勾选选项:Configuration - > server-config - > security - > Default Principal To Role Mapping

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

非常感谢

卢瓦克

Vin*_*lds 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>
Run Code Online (Sandbox Code Playgroud)

与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>
Run Code Online (Sandbox Code Playgroud)

与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>
Run Code Online (Sandbox Code Playgroud)

上述描述符将角色映射user到具有名称的个体标识的Principal Root以及具有Administrators该领域中的名称的用户组.您可以省略这些映射中的任何一个,并仅保留主体映射的角色或角色到组映射的角色.您可能还有多个主体映射到同一角色,或映射到同一角色的多个组,甚至映射到同一角色的多个主体和组.

理解JAAS域中的主体和组的概念很重要 - 主体表示系统中主体(用户登录到应用程序)的身份,它可以是单个身份(单个用户)或组身份(用户组).通过将声明性角色映射到实际的主体或组,可以强制执行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此功能的帖子中阅读有关此主题的更多信息.