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

Spring security 如何使用J2eePreAuthenticatedProcessingFilter和自定义身份验证提供程序?,spring-security,websphere,Spring Security,Websphere,我希望我的Spring应用程序尝试两种预身份验证方法(Siteminder和JavaEE容器身份验证) 如果这些过滤器中的任何一个找到了用户名-我想根据我的用户数据库检查该用户名,并根据我在数据库中看到的内容分配角色。(我有一个AuthenticationUserDetailsService的实现,它为我实现了这一点。) 如果没有-向用户显示登录页面。根据我的用户数据库检查他们在表单中输入的凭据 Siteminder集成正在运行。登录表单也在工作我的问题是JavaEE预认证。它从不起作用。 My

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

  • 如果这些过滤器中的任何一个找到了用户名-我想根据我的用户数据库检查该用户名,并根据我在数据库中看到的内容分配角色。(我有一个AuthenticationUserDetailsService的实现,它为我实现了这一点。)
  • 如果没有-向用户显示登录页面。根据我的用户数据库检查他们在表单中输入的凭据 Siteminder集成正在运行。登录表单也在工作我的问题是JavaEE预认证。它从不起作用。

    My 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”身份登录。(我的用户数据库中有一个使用此用户名的用户。)但当我访问应用程序时,从未调用“customAuthenticationUserDetailsService”bean来验证用户名。我知道这一点,因为“customAuthenticationUserDetailsService”做了大量的日志记录,清楚地显示了它在做什么。当我使用Siteminder预验证时,“customAuthenticationUserDetailsService”工作正常,我会在日志中获得一些跟踪输出。但不适用于J2EE身份验证

    我猜其中一件事正在发生:

    a) Java EE预身份验证筛选器未定位用户名,因此它从不调用身份验证管理器

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

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


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

    好的,我找到了答案。问题是,尽管我在Websphere中安装了J2EE安全设置并通过了身份验证,但我的web.xml不包含任何安全约束。因此,Websphere没有为我的请求提供主体。这显然是故意的。如果您没有访问受保护的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>
    
    
    所有区域
    /*
    

    J2eePreAuthenticatedProcessingFilter实际上是一个非常简单的类。它只调用
    HttpServletRequest.getUserPrincipal()
    来获取当前用户。例如,当您通过容器登录时,我将通过自己在过滤器中调用该方法来检查websphere是否正确设置了该方法。谢谢您,Luke。明天我会试试,HttpServletRequest.getUserPrincipal()返回null。。。我认为这可能是因为我的web.xml中没有安全约束。这就是我从阅读有关返回null的情况中得到的感觉。这个问题对我非常有用。谢谢我意识到这是5年后的事了,但您是否有机会拥有
    customAuthenticationUserDetailService
    CustomPreAuthenticationDauthenticationProvider
    beans的示例?我遇到了类似的配置需求,但不完全确定如何设置此配置。顺便问一下,有人知道我是否正确地进行了“提及”吗?我以为它会变成一个链接到用户的个人资料。。。