Java EE 服务器独立安全性

标签 java security jakarta-ee jboss websphere

我目前正在编写一个 Web 应用程序(RESTful Web 服务的集合),该应用程序有可能部署在多个不同的应用程序服务器(JBossWebSphere)上code> 是我们最初希望支持开箱即用的两个不同的容器)。

每当我在线查找 JBoss 的安全示例时,它们都会引用 JBoss 特定的身份验证/授权类,这显然不适用于 WebSphere。

是否有好的方法(Java EE 标准或第 3 方框架)以独立于容器的方式处理安全性?

我最初计划让容器处理身份验证,然后使用每个 REST 方法上的自定义代码来处理身份验证。但是,在我的 web.xml 中设置基本身份验证后,JBoss 似乎自己进行了某种授权,并给了我一个 403成功登录后。在WebSphere中,我能够定义一个“All Authenticated”角色,该角色将授权所有经过身份验证的用户,但我不确定如何在JBoss(以及独立于容器的方法)中执行相同的操作。

这是我的 web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    version="3.0">
    <display-name>identify-service-web</display-name>
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
    </welcome-file-list>

    <security-constraint>
        <web-resource-collection>
            <web-resource-name>All resources</web-resource-name>
            <description>Protects all resources</description>
            <url-pattern>/*</url-pattern>
        </web-resource-collection>
        <auth-constraint>
            <role-name>ApplicationRealm</role-name>
        </auth-constraint>
    </security-constraint>
    <security-role>
        <role-name>ApplicationRealm</role-name>
    </security-role>

    <login-config>
        <auth-method>BASIC</auth-method>
    </login-config>
</web-app>

我是 Java EE 安全新手,所以请原谅我可能错过了一些非常明显的东西。希望有人能把我推向正确的方向!

最佳答案

通过使用 web.xml 中的security-constraint,您可以定义应用程序的授权。因此,您的配置意味着:只有具有分配的角色 ApplicationRealm 的经过身份验证的用户才能访问此应用程序。

您可以在 JBoss AS7.1/EAP 6.x/WildFly 的安全域中使用角色映射。例如使用 CLI 命令:

/subsystem=security/security-domain=other/mapping=classic:add
/subsystem=security/security-domain=other/mapping=classic/mapping-module=mapRoleToAllUsers:add(code="org.jboss.security.mapping.providers.role.DatabaseRolesMappingProvider", type="role", module-options=[("dsJndiName"=>"java:jboss/datasources/ExampleDS"), ("rolesQuery"=>"SELECT 'ApplicationRealm' FROM Dual WHERE ?!=''")])
reload

这会在 standalone.xml 中产生以下配置:

<security-domain name="other" cache-type="default">
    <authentication>
        <login-module code="Remoting" flag="optional">
            <module-option name="password-stacking" value="useFirstPass"/>
        </login-module>
        <login-module code="RealmDirect" flag="required">
            <module-option name="password-stacking" value="useFirstPass"/>
        </login-module>
    </authentication>
    <mapping>
        <mapping-module name="mapRoleToAllUsers" code="org.jboss.security.mapping.providers.role.DatabaseRolesMappingProvider" type="role">
            <module-option name="dsJndiName" value="java:jboss/datasources/ExampleDS"/>
            <module-option name="rolesQuery" value="SELECT 'ApplicationRealm' FROM Dual WHERE ?!=''"/>
        </mapping-module>
    </mapping>
</security-domain>

然后,所有经过身份验证的用户都会自动获得 ApllicationRealm 角色。

我强烈建议使用jboss-web.xml为您的应用程序定义安全域,即使使用默认的:

<jboss-web>
    <security-domain>other</security-domain>
</jboss-web>

目前有an issue ,这会导致在省略 jboss-web.xml 时角色无法正确映射。

关于Java EE 服务器独立安全性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24082684/

相关文章:

java - InitialContext.lookup 从错误的 context.xml 中获取数据

Java/Java EE : to invoke getter method from JSP

java - 在 Java 中进行销售后减少 MySQL 数据库中的库存数量

java - 每次我开始新 Activity 时,ArrayList 共享首选项都会被覆盖

java - GoogleApiClient 无法在 android studio 中连接

delphi - 尝试在标准用户上写入 HKLM 时如何不触发异常?

c# - 有没有 "single line"方式生成加密字符串?

php - 如何使嵌入式视频仅对特定播放器可用

java - 多线程,Java 服务器/客户端项目

web-services - 如何通过 Web 服务传输 java.util.Map?