gpt4 book ai didi

spring-security - 如何使用 J2eePreAuthenticatedProcessingFilter 和自定义身份验证提供程序?

转载 作者:行者123 更新时间:2023-12-04 19:15:46 24 4
gpt4 key购买 nike

我希望我的 Spring 应用程序尝试两种预身份验证方法(Siteminder 和 Java EE 容器身份验证)。

  • 如果这些过滤器中的任何一个找到用户名 - 我想根据我的用户数据库检查该用户名,并根据我在数据库中看到的内容分配角色。 (我有一个 AuthenticationUserDetailsS​​ervice 的实现,它为我做这件事。)
  • 如果没有 - 向用户显示登录页面。根据我的用户数据库检查他们在表单中输入的凭据。

  • Siteminder 集成正在运行。登录表单也有效。 我的问题是 Java EE 预身份验证。它永远不会启动。

    我的 applicationContext-security.xml:
    <!-- HTTP security configurations -->
    <sec:http auto-config="true" use-expressions="true">
    <sec:form-login login-processing-url="/resources/j_spring_security_check" always-use-default-target="true" default-target-url="/" login-page="/login"
    authentication-failure-url="/login?login_error=t" />
    <sec:logout logout-url="/resources/j_spring_security_logout" />
    <sec:access-denied-handler error-page="/accessDenied" />
    <sec:remember-me user-service-ref="customUserDetailsService" token-validity-seconds="86400" key="OptiVLM-VaultBalance" />
    <sec:custom-filter position="PRE_AUTH_FILTER" ref="siteminderFilter"/>
    <sec:custom-filter after="PRE_AUTH_FILTER" ref="jeePreAuthenticatedFilter"/>

    <!-- various intercept-url elements here, skipped for brevity -->
    </sec:http>

    <!-- Authentication Manager -->
    <sec:authentication-manager alias="authenticationManager">
    <!-- J2EE container pre-authentication or Siteminder -->
    <sec:authentication-provider ref="customPreAuthenticatedAuthenticationProvider" />
    <!-- Default provider -->
    <sec:authentication-provider user-service-ref="customUserDetailsService" />
    </sec:authentication-manager>

    <!-- Siteminder pre-authentication -->
    <bean id="siteminderFilter" class="org.springframework.security.web.authentication.preauth.RequestHeaderAuthenticationFilter">
    <property name="principalRequestHeader" value="SM_USER" />
    <property name="authenticationManager" ref="authenticationManager" />
    <property name="exceptionIfHeaderMissing" value="false" />
    </bean>

    <!-- J2EE pre-authentication -->
    <bean id="jeePreAuthenticatedFilter" class="org.springframework.security.web.authentication.preauth.j2ee.J2eePreAuthenticatedProcessingFilter">
    <property name="authenticationManager" ref="authenticationManager" />
    </bean>

    <!-- Custom pre-authentication provider -->
    <bean id="customPreAuthenticatedAuthenticationProvider" class="org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider">
    <property name="preAuthenticatedUserDetailsService" ref="customAuthenticationUserDetailsService" />
    </bean>

    我在 Websphere 中启用了 Java 2 安全性,并且我以“admin5”身份登录。 (我的用户数据库中有一个使用此用户名的用户。)但是当我访问应用程序时,从来没有调用 'customAuthenticationUserDetailsS​​ervice' bean 来验证用户名。我知道这一点,因为 'customAuthenticationUserDetailsS​​ervice' 做了大量的日志记录,清楚地显示了它在做什么。当我使用 Siteminder 预身份验证时 - 'customAuthenticationUserDetailsS​​ervice' 工作正常,我在日志中得到一些跟踪输出。但不适用于 J2EE 身份验证...

    我的猜测是这些事情之一正在发生:

    a) Java EE 预认证过滤器没有定位用户名,所以它从不调用认证管理器

    b) Java EE 预身份验证过滤器工作正常,但出于某种原因,身份验证管理器从未调用过我的自定义身份验证提供程序

    顺便说一句,使用“customUserDetailsS​​ervice”的默认身份验证提供程序也不会启动。同样,我可以说这是因为日志中没有来自“customUserDetailsS​​ervice”的输出。

    你能就这里可能出现的问题提出建议吗?如果不是解决方案,那么将不胜感激有关如何解决此问题的建议。

    最佳答案

    好的,我想通了。问题是,即使我在 Websphere 中设置了 J2EE 安全并通过了身份验证,我的 web.xml 仍包含 没有安全限制 .因此,Websphere 没有为我的请求提供主体。这显然是一个有意的特征。如果您访问的不是 protected URL,则不需要预身份验证信息。

    为了克服这个问题,我 添加了安全约束 到我的 web.xml,它允许所有用户访问资源。实际上,资源没有得到保护,但仍然 - 现在有一个限制。

    就是这个:

    <security-constraint>
    <web-resource-collection>
    <web-resource-name>All areas</web-resource-name>
    <url-pattern>/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
    <role-name>*</role-name>
    </auth-constraint>
    </security-constraint>

    这会诱使 Websphere 在请求中填写用户主体信息。

    感谢@Ralph 对这个问题的评论: request.getUserPrincipal() got null

    关于spring-security - 如何使用 J2eePreAuthenticatedProcessingFilter 和自定义身份验证提供程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9831268/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com