【问题标题】:Spring Security Preauth "filters=none" not workingSpring Security Preauth“过滤器=无”不起作用
【发布时间】:2012-05-24 07:47:56
【问题描述】:

奇怪的,

我正在将 spring security 与 siteminder 一起使用,它工作正常。但是我想要一个不受保护的 url - 我们的 loadBalancer 需要在应用程序本身内有一个“healthCheck” url。这个 url 没有被 siteminder 拦截,但是 spring security 似乎无论如何都对其应用了 preauth ..

如果我使用简单的基于表单的安全配置在本地运行它,则以下工作(不包括过滤器):

<http auto-config="true" use-expressions="true">
    <intercept-url pattern="/html/healthCheck.html" filters="none" />   
    <intercept-url pattern="/css/**" filters="none" />
    <intercept-url pattern="/images/**" filters="none" />
    <intercept-url pattern="/js/**" filters="none" />
    <intercept-url pattern="/login" filters="none" />
    <intercept-url pattern="/favicon.ico" filters="none" />
    <intercept-url pattern="/*" access="hasAnyRole('ROLE_USER')" />
    <form-login login-page="/login" default-target-url="/" authentication-failure-url="/loginfailed" />
    <logout logout-success-url="/logout" />
</http>

在这种情况下,我可以浏览到 localhost/myApp/resources/html/healthCheck.html 而不会遇到授权问题,但任何其他 url 都会显示登录表单。到目前为止一切都很好!

但是,当我部署到服务器时,我使用的是以下配置:

<http auto-config="true" use-expressions="true">
    <intercept-url pattern="/html/healthCheck.html" filters="none" />   
    <intercept-url pattern="/css/**" filters="none" />
    <intercept-url pattern="/images/**" filters="none" />
    <intercept-url pattern="/js/**" filters="none" />
    <intercept-url pattern="/login" filters="none" />
    <intercept-url pattern="/favicon.ico" filters="none" />
    <intercept-url pattern="/*" access="hasAnyRole('ROLE_USER')" />
    <custom-filter position="PRE_AUTH_FILTER" ref="siteminderFilter" />
</http>

当我浏览到:server/myapp/resources/html/healthCheck.html 我收到以下错误:

java.lang.IllegalArgumentException: Cannot pass null or empty values to constructor
    org.springframework.security.core.userdetails.User.<init>(User.java:94)
    com.myApp.security.SecuritySBSUserDetailsService.loadUserByUsername(SecuritySBSUserDetailsService.java:119)
    org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper.loadUserDetails(UserDetailsByNameServiceWrapper.java:53)

我认为这是因为 UserDetailsS​​ervice 在没有任何 SM_USER 的情况下被实例化。然而,filters=none 已经就位......并且在使用表单身份验证时工作......知道什么可能导致这种情况,或者更好的解决方法吗?

顺便说一下,我的userdetails服务配置如下:

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

即如果有帮助,我已将 exceptionIfHeaderMissing 设置为 false..

【问题讨论】:

    标签: spring-security siteminder pre-authentication


    【解决方案1】:

    我能看到的最明显的事情是/resources/html/healthCheck.html 不会被/html/healthCheck.html 匹配。如果您在某处重写 URL,您可能应该对此进行解释。

    如果您启用调试日志记录,它应该详细说明匹配的内容。

    我也会省略auto-config。它引起的混乱多于其价值。你应该使用/** 而不是/* 来进行通用的蚂蚁模式匹配。

    这里可能还值得一提的是Spring Security 3.1 has a better approach 用于定义空过滤器链,并且还允许您使用&lt;http&gt; 语法定义多个过滤器链。

    【讨论】:

      【解决方案2】:

      好的,据我所知,这似乎是 Spring Security 中的一个错误。我通过在 UserDetailsS​​ervice 中的 loadUserByName 方法的开头添加一个虚拟返回来解决它..

      @Override
      public UserDetails loadUserByUsername(String userName)
              throws UsernameNotFoundException, DataAccessException {
          logger.trace(">> loadUserByUsername()");
          logger.info("-- loadUserByUsername(): username : {}", userName);
      
          List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();             
          if(userName==null || userName.trim().equals("")) {
              return(new User("ANONYMOUS", "", true, true, true, true, authorities));
              }
      // rest of auth checks
      

      在我的配置中,UserDetails 检查根本不应该被触发(就像表单一样..)。如果有人有基于配置的解决方法,我会给你一个加分:-)

      【讨论】:

      • 从您问题中的信息来看,您似乎使用的是不匹配的路径。没有证据表明存在错误。很多人都使用这种结构,所以以前也不太可能没有检测到如此明显的东西。
      猜你喜欢
      • 2016-11-10
      • 2018-09-20
      • 2013-05-03
      • 2018-02-14
      • 2015-07-17
      • 1970-01-01
      • 1970-01-01
      • 2020-09-11
      相关资源
      最近更新 更多