我目前正在编写一个Web应用程序(一组RESTful Web服务),可以部署在多个不同的应用程序服务器上(JBoss
和WebSphere
是两个不同的容器我们希望最初支持开箱即用)。
每当我在网上查找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安全新手,所以请原谅我可能错过了一些非常明显的事情。希望有人能把我推向正确的方向!
答案 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,它将接受任何用户。