2012-05-16 4 views
0

이상한 것,스프링 보안 Preauth "filters = none"이 작동하지 않습니다.

저는 siteminder와 함께 봄 보안을 사용하고 있습니다. 그러나 나는 보호되지 않는 하나의 URL을 원합니다 - 우리 loadBalancer는 앱 자체 내에 "healthCheck"URL이 필요합니다. 내가 로컬 (필터 ​​제외) 다음 작품을 config (설정) 간단한 폼 기반 보안을 사용하여 실행하는 경우이 URL은 ..

를 SiteMinder에 의해 차단하지만, 봄 보안 어쨌든 그것은에 preauth을 적용 할 것 같다되지 않습니다

이 경우 인증 문제없이 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> 

나는 탐색 할 때 : 서버/MyApp를/자원/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) 

나는 이것이 SM_USER없이 인스턴스화 된 UserDetailsService 때문에 발생한다고 생각합니다. 그러나 filters = none이 있습니다 .. 폼 인증을 사용할 때 작동합니다. 어떤 문제가 발생했는지, 아니면 더 나은 해결 방법이 무엇인지 생각해보십시오.

이 도움이된다면 내가 false로 exceptionIfHeaderMissing을 설정 한 예
<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> 

는 ..

답변

0

좋아, 버그 것 같다 : 다음과 같은 방법으로

내 된 UserDetails 서비스 구성 내가 볼 수있는 한 봄 보안. 나는 있습니다 .. UserDetailsService도에서 loadUserByName 방법의 시작 더미 수익을 추가하여 주위에 가지고

그것은 내가 가지고있는 설정과 같은 것 같다

이의 된 UserDetails 검사가 전혀 트리거하기해서는 안

@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 
(양식 그대로 ..). 누구든지 구성 기반 해결 방법을 사용하면 다음과 같이 플러스를 줄 것입니다 .--

+1

질문에있는 정보에서 일치하지 않는 경로를 사용하고있는 것처럼 보입니다. 버그가 있다는 증거는 없습니다. 많은 사람들이이 구조를 사용하기 때문에 이전에 그렇게 명백한 것이 발견되지 않았을 가능성은 거의 없습니다. –

2

내가 볼 수있는 가장 확실한 것은 이 /html/healthCheck.html과 일치하지 않는다는 것입니다. 어딘가에서 URL을 다시 작성하는 경우 아마 설명해야합니다.

디버그 로깅을 사용하도록 설정하면 무엇과 일치하는지 자세히 설명해야합니다.

나는 또한 auto-config을 남겨두고 싶습니다. 그것이 가치가있는 것보다 더 혼란을 야기합니다. 그리고 범용 개미 패턴 일치에 /* 대신 /**을 사용해야합니다.

빈 필터 체인을 정의하는 데 Spring Security 3.1 has a better approach을 언급하고 <http> 구문을 사용하여 둘 이상의 필터 체인을 정의 할 수도 있습니다.

관련 문제