使用LoginModule JBoss Approach成功登录后,执行带有注释@RolesAllowed的rest终结



我有一个关于使用受信任的SecurityDomain和特定的RolesAllowed执行端点resteasy的小问题。

在使用登录表单的loginmodule方法成功登录后,端点的响应是拒绝访问(HTTP状态403-拒绝访问请求的资源(

现在我描述实际案例使用:

环境是Jboss AS7,有一个.ear工件,配置如下

standalone.xml

<management>
...
<security-realm name="EJBRealm">
<authentication>
<jaas name="CustomRealm"/>
</authentication>
</security-realm>
...
</management>
<subsystem xmlns="urn:jboss:domain:security:1.1">
...
<security-domain name="CustomRealm">
<authentication>
<login-module code="Database" flag="sufficient">
<module-option name="dsJndiName" value="java:jboss/jdbc/PUDS"/>
<module-option name="principalsQuery" value="SELECT 'system' FROM dual WHERE ? = 'system'"/>
<module-option name="rolesQuery" value="SELECT 'authenticated', 'Roles' from dual WHERE ? = 'system'"/>
</login-module>
<login-module code="custom.jaas.AuthenticationProxyLoginModule" flag="sufficient" module="custom.authentication">
<module-option name="authBE_ip_port" value="${install.module.authBE_ip_port}"/>
<module-option name="authBE_ip_address" value="${install.module.authBE_ip_address}"/>
<module-option name="authBE_context_path" value="${install.module.authBE_context_path}"/>
</login-module>
</authentication>
</security-domain>
...
</subsystem>

在这个耳朵里有一个web模块工件。war与一组具有以下配置的resteasy方法的端点:

web.xml

<context-param>
<param-name>resteasy.role.based.security</param-name>
<param-value>true</param-value>
</context-param>   
<login-config>
<auth-method>FORM</auth-method>
<form-login-config>
<form-login-page>/login.html</form-login-page>
<form-error-page>/login.html</form-error-page>
</form-login-config>
</login-config>
<security-constraint>
<web-resource-collection>
<web-resource-name>Secured Content</web-resource-name>
<url-pattern>/*</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>ADMIN</role-name>
</auth-constraint>
</security-constraint>
<security-role>
<role-name>ADMIN</role-name>
</security-role>

此角色存在于数据库授权领域中

jboss-web.xml

<jboss-web version="7.1"
xmlns="http://www.jboss.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.jboss.com/xml/ns/javaee http://www.jboss.org/schema/jbossas/jboss-web_7_1.xsd">
<security-domain>CustomRealm</security-domain>
</jboss-web>

在jboss-web.xml上,我设置了在standlalone.xml 上定义的customerrealm

resteasy类定义如下:

@Component
@Path(value = "/endpoint")
@SecurityDomain("CustomRealm")
@DeclareRoles({"ADMIN", "DEFAULT"})
public class CustomRest implements ICustomRest
{
...
@Override
@GET
@Path(value = "/testendpoint/{id}")
@Consumes(value = MediaType.APPLICATION_JSON)
@RolesAllowed("ADMIN")
public void testendpoint(@PathParam(value = "id") Long id) throws Exception {

//code to execute
}
...
}

该类在类范围内使用securitydomain进行注释,在方法testendpoint上定义注释@RolesAllowed with ADMIN(如web.xml上定义的(

如果我调用其余的uri

http://localhost:8080/api/services/endpoint/testendpoint/23456

查看登录表单后,我正确插入从custom.jaas.AuthenticationProxyLoginModule模块收到的正确凭据。在成功登录后,确认是可以的。

一切正常后,端点不会执行,但系统地响应为拒绝访问。

我怎么了?

登录模块在standlone.xml上配置正确,登录表单查看正确,从自定义登录模块正确接收提交凭据,方法Login授予ok身份验证,但最终端点的响应是拒绝访问!!!!为什么?这很琐碎,我没有任何办法来解决这个琐碎的问题!

一切正常,但访问被拒绝!我确信有一些错误我不能理解!

提前感谢您的回复!

好!我找错了!!!我分析了自定义登录模块的代码,并意识到loginmodule的本地方法getRoleSets定义了一个名为"的自定义角色;"认证";无法从数据库中检索角色:|!我修复了这样的角色与认证删除";ADMIN";一切顺利!

最后,我可以使用安全登录来执行这个rest端点!

我很高兴能解决这个麻烦!在自定义方法getRoleSets上修复角色不是一个好主意,但这是一个多年来生产的应用程序,我必须在它们上集成一个webmodule rest端点!

谢谢大家!!

最新更新