Glassfish 3.1 默认主体到角色映射

2022-09-02 12:10:25

我正在使用玻璃鱼和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 控制台上,我需要勾选以下选项:配置 -> 服务器-配置 ->安全性 -> 默认主体到角色的映射

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

多谢

洛伊克


答案 1

当您在 中指定角色和角色时,使用的是声明性安全性,这实质上依赖于使用 JAAS 来强制实施以声明方式指定的认证和授权要求。web.xml

部署描述符中指定的角色只是应用程序中使用的角色的表示形式。这些角色不必与运行时使用的用户标识数据库(或身份验证领域)中存在的角色相同,并且通常这些角色可能不同,因为应用程序的开发可能是在不考虑用户标识数据库中存在的实际用户和组的情况下进行的。

通常,使用特定于容器的部署描述符在 中指定的声明性角色与用户标识数据库中存在的主体或组之间执行映射。在Glassfish 3,1中,这恰好是文件。每个这样的映射都会将应用程序中的声明性角色映射到 JAAS 领域中的主体或组,其方式如下(对于 WAR 文件部署)或(对于 EAR 文件部署)或(对于 EJB JAR 文件部署):web.xmlglassfish-web.xmlglassfish-web.xmlglassfish-application.xmlglassfish-ejb-jar.xml

玻璃鱼网.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>

玻璃鱼应用.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>

玻璃鱼-ejb-罐.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>

上述描述符将角色映射到具有名称个人标识的主体和在领域中具有名称的用户组。您可以省略其中任一映射,并仅保留角色到主体的映射或角色到组的映射。您可能有多个主体映射到同一角色,或者多个组映射到同一角色,甚至多个主体和组映射到同一角色。userRootAdministrators

了解 JAAS 领域中主体和组的概念非常重要 - 主体表示系统中主体(登录到应用程序的用户)的标识,它可以是单个标识(单个用户)或组标识(用户组)。通过将声明性角色映射到实际的主体或组,人们将能够强制执行针对任何用户身份数据库(即任何领域)中指定的规则,并且能够在不更改代码库的情况下动态地执行此操作;毕竟,这样的更改需要将声明性角色重新映射到可能不同的领域中的新主体和组集。您可以在 Java EE 6 教程中有关安全性的章节中找到有关 Java EE 安全性和 JAAS 如何协同工作的基础知识教程。web.xml

Glassfish 允许简化的映射方案,其中不需要在特定于容器的部署描述符(在本例中为 glassfish-web.xml)中对所有声明性角色执行映射,只要声明性角色的名称恰好与主体或组的名称相似。这是默认的主体到角色映射方案。在您的情况下,您的领域中的主体/组似乎与 中指定的声明性角色相同,因此您将避免将角色显式映射到主体和组。简单来说,如果角色与 JAAS 域中的主体或用户组相同(对于其他标识也是如此),则可以使用 Glassfish 的默认角色到主体映射方案,而无需将其映射到文件中的每个角色。web.xmluseruseruserweb.xml

如果您希望避免勾选默认主体到角色映射的部署选项,则必须在特定于容器的部署描述符中自行提供角色到主体/组映射,就像通常对其他应用程序服务器所做的那样。

您可以在 blogs.oracle.com 上描述玻璃鱼此功能的一篇文章中阅读有关此主题的更多信息。


答案 2

推荐