5

저는이 문제에 대해 지금 당분간 고민하고 있습니다. 그것에 대해 여러 게시물을 찾았지만 아무도 내 문제를 해결하지 못했습니다. 그것은 아마 SecurityContext에 특정 스레드에 boud하지만 그렇다하더라도 내가 그것을 해결하는 방법을 모른다는 사실과 함께 할 수있는 뭔가가됩니다스프링 보안 - taglib 및 jsp에서는 SecurityContext.authentication null이지만 컨트롤러에서는 okock

에 로그온 한 사용자가 검색하는 코드를 다음 고려 :

SecurityContextHolder.getContext().getAuthentication().getPrincipal() 

컨트롤러에서이 코드를 실행하면 로그인 한 사용자가 올바르게 반환됩니다. taglib 또는 jsp에서이 코드를 실행하면 NPE (인증 = null)가 throw됩니다. 스프링 태그 도 작동하지 않습니다 (아마도 같은 이유로). web.xml 파일에서

추출 :

<bean id="filterChainProxy" class="org.springframework.security.util.FilterChainProxy"> 
    <property name="filterInvocationDefinitionSource"> 
     <value> 
      CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON 
      PATTERN_TYPE_APACHE_ANT 
      /**=httpSessionIntegrationFilter,authenticationProcessingFilter,exceptionTranslationFilter,filterSecurityInterceptor 
     </value> 
    </property> 
</bean> 
    <bean id="filterSecurityInterceptor" 
    class="org.springframework.security.intercept.web.FilterSecurityInterceptor"> 
    <property name="authenticationManager" ref="authenticationManager" /> 
    <property name="accessDecisionManager" ref="accessDecisionManager" /> 
    <property name="alwaysReauthenticate" value="true" /> 
    <property name="objectDefinitionSource"> 
     <value> 
      CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON 
      PATTERN_TYPE_APACHE_ANT 
      /myaccount.htm=ROLE_CUSTOMER 
     </value> 
    </property> 
</bean> 
+0

이 조건을 생성하는 샘플 JSP를 볼 수 있습니까? 페이지 헤더에 Spring Security taglib을 가져오고 있습니까? – Gandalf

답변

5

필터 서열에서 일어났다. PageFilter (sitemesh)는 스프링 보안 필터 전에 호출 되었기 때문에 보안 컨텍스트를 JSP에서 아직 사용할 수 없었습니다. web.xml에서 필터의 순서를 변경하면 보안 필터가 먼저 문제를 해결할 수 있습니다.

0

이것은 명백한 질문처럼 보이지만, 당신이 로그인하는 사용자를 강제 할 수 있습니다 (예 : 봄 보안 설정 파일에서

<filter> 
    <filter-name>AcegiFilter</filter-name> 
    <filter-class>org.acegisecurity.util.FilterToBeanProxy</filter-class> 
    <init-param> 
     <param-name>targetClass</param-name> 
     <param-value>org.acegisecurity.util.FilterChainProxy</param-value> 
    </init-param> 
</filter> 

<filter-mapping> 
    <filter-name>AcegiFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

추출 인증하기) 전에 /myaccount.htm 페이지에 액세스하기 전에? 나는 물어 보는 이유 인 객체 정의 소스에서 익명 액세스를 요구하는 로그인 페이지에 대한 매핑을 보지 못했습니다. 사용자가 인증하지 않고 /myaccount.htm에 액세스 할 수 있으면 페이지에 액세스 할 때 보안 컨텍스트에 교장이 작성되지 않으므로 NullPointerException이 발생합니다. 또한 폼 기반 인증을 사용하고 있습니까? HTTP 기본 인증? Acegi가 지원하는 다른 유형은 무엇입니까?

문제를 해결