使用 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 710 无法处理阶段 POST_MODULE

JBoss AS7 上的 AWS Java 开发工具包 - module.xml 条目

错误 [org.jboss.msc.service.fail](MSC 服务线程 1-3)MSC000001:无法启动服务 jboss.deployment.unit。 .POST_MODULE

无法启动服务 jboss.deployment.unit。“RSSample.war”.POST_MODULE:

jboss-deployment-structure.xml 和 global-module wildfly 20