0

我有一个关于使用受信任的 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,但最终端点的响应是拒绝访问!!!!为什么?这是非常微不足道的,我没有什么可以解决这个微不足道的问题!

一切正常,但访问被拒绝!我肯定有一些我无法理解的错误!

提前感谢您的回复!

4

1 回答 1

0

好的!我找错了!!!我分析了自定义登录模块的代码,我意识到 loginmodule getRoleSets 的本机方法定义了一个名为“已验证”的自定义角色,而不是从数据库中检索角色:| !我修复了经过身份验证删除“ADMIN”的角色,一切正常!

最后,我可以通过安全登录来执行这个休息端点!

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

谢谢大家!!

于 2020-07-23T16:28:31.000 回答