【问题标题】:Glassfish 3.1 default principal to role mappingGlassfish 3.1 默认主体到角色映射
【发布时间】:2011-10-07 09:00:44
【问题描述】:

我正在使用 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>

这意味着所有想要访问我的网络应用程序的用户都必须是组用户。

然后在 glassfish 控制台上,我需要勾选以下选项: 配置 -> 服务器配置 -> 安全 -> 默认主体到角色映射

我的问题是为什么我需要勾选这个 Default Principal to Role Mapping ?以及如何更改我的 web.xml 以避免勾选它?

非常感谢

洛伊克

【问题讨论】:

    标签: java jakarta-ee glassfish jaas


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回答。实际上我想要做的是有一个称为用户的组。每个用户都是这个群体的一部分。这意味着拥有我的应用程序帐户(这是一场战争)的每个人都可以使用密码和用户进行连接。然后在我自己管理之后谁可以访问应用程序中的内容。
    • 如果我使用您为 glassfish-web.xml 提供的代码。尝试连接到我的应用程序时出现以下错误。对指定资源的访问(对所请求资源的访问已被拒绝)已被禁止。它甚至没有给我登录屏幕
    • 对不起。好的,我现在明白了。我只需要添加我的用户的映射,它就可以工作:) 非常感谢你的摇滚
    • 根据您的第二条评论,我推断您在领域中没有名称为 user 的组;如果是这样,您需要创建一个包含所有用户的组。此外,您可以在glassfish-web.xml 中删除角色到主体的映射,并且只使用角色到组的映射。
    • 最后一集。我可以将我的所有用户从领域映射到角色 user 吗?像那样的东西? user*user
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-05
    • 2018-12-21
    • 1970-01-01
    相关资源
    最近更新 更多