使用 Login Module JBoss Approach 成功登录后,无法(拒绝访问响应)执行带有注释 @RolesAllowed 的 rest 端点
Posted
技术标签:
【中文标题】使用 Login Module JBoss Approach 成功登录后,无法(拒绝访问响应)执行带有注释 @RolesAllowed 的 rest 端点【英文标题】:Failed (access denied response) to execute rest endpoint with annotation @RolesAllowed after a succesfull login with LoginModule JBoss Approach 【发布时间】:2020-11-13 10:13:06 【问题描述】:我有一个关于使用受信任的 SecurityDomain 和特定的 RolesAllowed 执行端点 resteasy 的小问题。
使用 loginmodule 方法通过登录表单成功登录后,端点的响应是拒绝访问(HTTP 状态 403 - 对所请求资源的访问已被拒绝)
现在我描述一下实际案例使用:
环境是Jboss AS7,有一个.ear神器,配置如下
独立的.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-module artifact .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 模块接收到的正确凭据。成功登录后autentication就可以了。
一切正常,端点不执行,但响应系统地拒绝访问。
我怎么了?
在standlone.xml上正确配置了登录模块,正确查看了登录表单,从自定义登录模块正确接收了提交凭据,方法login grant ok authentication,但最终端点的响应是拒绝访问! !!!为什么?这很琐碎,我没有什么可以解决这个琐碎的问题!
一切正常,但访问被拒绝!我肯定有一些我无法理解的错误!
提前感谢您的回复!
【问题讨论】:
【参考方案1】:好的!我找错了!!! 我分析了自定义登录模块的代码,我意识到 loginmodule getRoleSets 的本机方法定义了一个名为“authenticated”的自定义角色,而不是从数据库中检索角色:| ! 我修复了经过身份验证删除“ADMIN”的角色,一切正常!
我终于可以使用安全登录来执行这个休息端点了!
我很高兴解决这个问题!在自定义方法 getRoleSets 上修复角色不是一个好主意,但这是多年以来的生产应用程序,我必须在它们上集成一个 webmodule 休息端点!
谢谢大家!!
【讨论】:
以上是关于使用 Login Module JBoss Approach 成功登录后,无法(拒绝访问响应)执行带有注释 @RolesAllowed 的 rest 端点的主要内容,如果未能解决你的问题,请参考以下文章
为 Spring Portlet 获取异常“无法启动服务 jboss.module.service”
JBoss AS7 上的 AWS Java 开发工具包 - module.xml 条目
错误 [org.jboss.msc.service.fail](MSC 服务线程 1-3)MSC000001:无法启动服务 jboss.deployment.unit。 .POST_MODULE