我有一个关于使用受信任的 SecurityDomain 和特定的 RolesAllowed 执行端点 resteasy 的小问题。
在使用登录表单的 loginmodule 方法成功登录后,端点的响应是拒绝访问(HTTP 状态 403 - 对所请求资源的访问已被拒绝)
现在我描述一下实际的案例使用:
环境是Jboss AS7,有一个.ear artifact,配置如下
独立的.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 上定义的 customrealm
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 上使用 ADMIN 定义注释 @RolesAllowed(如 web.xml 中所定义)
如果我调用其余的 uri
http://localhost:8080/api/services/endpoint/testendpoint/23456
查看登录表单,我正确插入了从 custom.jaas.AuthenticationProxyLoginModule 模块接收到的正确凭据。成功登录后,身份验证就可以了。
毕竟好的,端点不执行,但响应是系统地拒绝访问。
我怎么了?
在standlone.xml上正确配置了登录模块,正确查看了登录表单,从自定义登录模块正确接收了提交凭据,方法login grant ok authentication,但最终端点的响应是拒绝访问!!!!为什么?这是非常微不足道的,我没有什么可以解决这个微不足道的问题!
一切正常,但访问被拒绝!我肯定有一些我无法理解的错误!
提前感谢您的回复!