Java EE服务器独立安全性

时间:2014-06-06 13:10:29

标签: java security java-ee jboss websphere

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

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

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

我最初计划进行容器句柄身份验证,然后使用每个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安全新手,所以请原谅我可能错过了一些非常明显的事情。希望有人能把我推向正确的方向!

3 个答案:

答案 0 :(得分:2)

通过使用security-constraint中的web.xml,您可以为应用程序定义授权。因此,您的配置意味着:只有具有指定角色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时未正确映射角色。

答案 1 :(得分:1)

正如kwart所写,web.xml中定义的安全设置或标准安全注释必须由所有容器实现,因此使用它们是安全且可移植的。

什么是服务器特定的,是如何定义用户到安全角色映射,什么可以是用户注册表(例如ldap,文件,数据库,自定义),以及容器支持的其他身份验证机制(例如Kerberos,SAML,自定义)

有关Java EE安全性的一般信息,您可以在WebSphere Application Server V7.0 Security Guide中查看保护Web应用程序章节(虽然说Java EE 5,但大多数信息在最新版本中仍然有效)。

例如,如何在WebSphere检查this page中为JAX-RS应用程序配置web.xml:

答案 2 :(得分:0)

也许你可以使用spring-security作为一种通用的身份验证机制......但是通常混合spring和Java EE并不是一个好主意。

您可以使用标准的Java EE安全框架,如果您想在某些容器中部署应用程序,则需要为每个容器提供特定的配置,这不应该是一个问题,因为配置不会太多long,每个容器都应该忽略其他容器的特定配置。

如果你jboss给你一个403错误,即使在成功登录听起来像是一个配置错误。您是否在WEB-INF / jboss-web.xml中检查了安全域? 在jboss中如果你没有在security-constraint中定义任何auth-constraint,它将接受任何用户。