我目前正在编写一个 Web 应用程序(RESTful Web 服务的集合),该应用程序有可能部署在多个不同的应用程序服务器(JBoss
和 WebSphere
)上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/