Не удалось (ответ об отказе в доступе) выполнить оставшуюся конечную точку с аннотацией @RolesAllowed после успешного входа в систему с подходом LoginModule JBoss

У меня есть тривиальная проблема с повторным выполнением конечной точки с доверенным SecurityDomain и определенным RolesAllowed.

После успешного входа в систему с подходом 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>

В этом ухе находится артефакт веб-модуля .war с набором эндпоинтов с немедленным подходом со следующей конфигурацией:

веб.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 я устанавливаю customrealm, определенный в standlalone.xml.

Класс 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 с ADMIN (как определено в web.xml)

Если я позвоню остальным uri

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

форма входа просматривается, я правильно ввожу учетные данные, полученные от модуля custom.jaas.AuthenticationProxyLoginModule. Аутентификация в порядке после успешного входа в систему.

После того, как все в порядке, конечная точка не выполняется, но систематически отвечает отказ в доступе.

Что я не так?

Модуль входа в систему настроен правильно на standlone.xml, форма входа отображается правильно, учетные данные отправки получены правильно из пользовательского модуля входа в систему, метод входа в систему предоставляет ок аутентификацию, но в конечном итоге ответ конечной точки - отказ в доступе !!!! Почему? Это очень тривиально, и у меня нет ничего, чтобы решить эту тривиальную проблему!

Все в порядке, но доступ запрещен! Я уверен, что есть несколько ошибок, которые я не могу понять!

Заранее спасибо за ответ!


person Alessandro Modica    schedule 23.07.2020    source источник


Ответы (1)


В порядке! Я нахожу ошибку!!! Я проанализировал код пользовательского модуля входа в систему и понял, что собственный метод getRoleSets модуля входа в систему определяет пользовательскую роль, называемую аутентифицированной, а не извлекает роли из базы данных: | ! Я исправил так роль с проверкой подлинности, удаляя ADMIN, и все идет нормально!

Наконец, я могу выполнить эту конечную точку отдыха с безопасным входом в систему, когда я ее аспектирую!

Я очень рад решить эту проблему! Не рекомендуется исправлять роль в пользовательском методе getRoleSets, но это приложение уже много лет находится в производстве, и я должен интегрировать конечную точку отдыха веб-модуля поверх них!

Спасибо всем!!

person Alessandro Modica    schedule 23.07.2020