jboss Elytron使用FORM身份验证进行编程登录

axr492tv  于 2022-11-08  发布在  其他
关注(0)|答案(1)|浏览(134)

我们目前正在从传统的安全子系统迁移到Elytron,并在JBossEAP7.3.6中部署了一个基于Struts2的Web应用程序,该应用程序应该支持多种“风格”的身份验证。
标准的登录方式应该是用户在登录表单(j_security_check)中手动提供凭证,然后点击相应的按钮。
第二种可能性是,对Web应用程序的受保护内容的GET请求可以包含一个包含JWT标记的自定义Cookie。此Cookie由io.undertow.server.HttpHandler截取,该io.undertow.server.HttpHandler在其io.undertow.server.HttpHandler#handleRequest方法中处理传入请求。此处理程序由io.undertow.servlet.api.DeploymentInfo#addSecurityWrapper使用DeploymentInfo注册,DeploymentInfoio.undertow.servlet.ServletExtension的实现提供。ServletExtensionMETA-INF/services/io.undertow.servlet.ServletExtension中注册为服务提供者。
io.undertow.server.HttpHandler#handleRequest实现中的请求处理从cookie中提取JWT标记,对其进行预验证,并确定包含的用户名。此用户名和作为口令的标记用作javax.servlet.http.HttpServletRequest#login调用的输入。
使用传统安全子系统时,服务器的行为是,此登录调用触发了针对已配置的传统安全域的身份验证,并在Undertow中创建了一个会话,以便对上一个GET请求的HTTP 200响应包含一个带有新JSESSIONID cookie的Set-Cookie标头。
对于Elytron,javax.servlet.http.HttpServletRequest#login什么都不做,既不触发针对Elytron安全域和安全领域的身份验证,也不触发会话的创建。浏览器只显示登录表单,该表单应该被所描述的拦截过程跳过。
我调试了JBoss附带的javax.servlet.http.HttpServletRequest#login的实现。我们从io.undertow.servlet.spec.HttpServletRequestImpl#login开始,它调用login = sc.login(username, password)。当使用Elytron时,这个SecurityContextorg.wildfly.elytron.web.undertow.server.SecurityContextImplorg.wildfly.elytron.web.undertow.server.SecurityContextImpl#login首先检查if (httpAuthenticator == null)httpAuthenticator只在org.wildfly.elytron.web.undertow.server.SecurityContextImpl#authenticate中设置,org.wildfly.elytron.web.undertow.server.SecurityContextImpl#authenticate由对javax.servlet.http.HttpServletRequest#authenticate的调用来调用。
这就解释了为什么对io.undertow.servlet.spec.HttpServletRequestImpl#login的普通调用没有任何作用。我首先尝试调用javax.servlet.http.HttpServletRequest#authenticate,在内部示例化httpAuthenticator,然后是javax.servlet.http.HttpServletRequest#login。这至少最终触发了针对已配置Elytron安全域和安全领域的身份验证和授权。身份验证/授权成功,但Undertow仍未成功。t发出一个新的JSESSIONID cookie,浏览器再次显示登录表单,而不是继续访问受保护的资源。
我现在没主意了,如何处理这个问题,以及如何实现与传统安全子系统相同的行为。为什么Elytron io.undertow.security.api.SecurityContext的实现与传统安全(io.undertow.security.impl.SecurityContextImpl)的实现有如此大的不同?我应该如何使用Elytron javax.servlet.http.HttpServletRequest#login和/或javax.servlet.http.HttpServletRequest#authenticate以编程方式登录基于FORM的Web应用程序?
与所有这些相关的JBoss配置如下所示:
逆流:

<application-security-domains>
    <application-security-domain name="my_app_security_domain" http-authentication-factory="MyHttpAuthFactory"/>
</application-security-domains>

爱理强:

<security-domains>
    <security-domain name="MySecurityDomain" default-realm="MyCachingRealm" permission-mapper="default-permission-mapper">
        <realm name="MyCachingRealm" role-decoder="FromRolesAttributeDecoder"/>
    </security-domain>
</security-domains>

<security-realms>
    <custom-realm name="MyCustomRealm" module="module name redacted" class-name="class name redacted"/>
    <caching-realm name="MyCachingRealm" realm="MyCustomRealm" maximum-age="300000"/>
    <identity-realm name="local" identity="$local"/>
</security-realms>

<mappers>
    <simple-permission-mapper name="default-permission-mapper" mapping-mode="first">
        <permission-mapping>
            <principal name="anonymous"/>
            <permission-set name="default-permissions"/>
        </permission-mapping>
        <permission-mapping match-all="true">
            <permission-set name="login-permission"/>
            <permission-set name="default-permissions"/>
        </permission-mapping>
    </simple-permission-mapper>
    <constant-realm-mapper name="local" realm-name="local"/>
    <constant-realm-mapper name="MyRealmMapper" realm-name="MyCachingRealm"/>
    <simple-role-decoder name="FromRolesAttributeDecoder" attribute="Roles"/>
</mappers>

<http>
    <http-authentication-factory name="MyHttpAuthFactory" security-domain="MySecurityDomain" http-server-mechanism-factory="global">
        <mechanism-configuration>
            <mechanism mechanism-name="FORM" realm-mapper="MyRealmMapper">
                <mechanism-realm realm-name="MyRealm"/>
            </mechanism>
        </mechanism-configuration>
    </http-authentication-factory>
    <provider-http-server-mechanism-factory name="global"/>
</http>
e0bqpujr

e0bqpujr1#

这是JBoss EAP中的一个错误,已在EAP 7.3.8和7.4.1中修复。有关详细信息,请参阅https://issues.redhat.com/browse/JBEAP-21737https://issues.redhat.com/browse/JBEAP-21738

相关问题