2013-01-04 4 views
2

안녕하세요. 스프링 보안으로 처리되는 정적 리소스가 필요하며 계속 의미가 고정되어 있으려면 DispatcherServlet으로 처리하고 싶습니다. 보안되지 않은 리소스 용으로 예약 된 폴더와 보안 리소스 용으로 하나의 폴더가 있습니다. 리소스 처리기에서 /res/secured을 제외 할 때까지이 작업을 수행 할 수 없습니다. 그러나이 작업을 수행하면 보안 리소스가 DispatcherServlet으로 처리됩니다. 내가 옳지 않다고 생각합니다 (아마도 틀렸습니까? -> 설명 또는 링크).스프링 보안이 적용된 정적 리소스 처리

내 구성 : 귀하의 답변

/*--- Directories structure ---*/ 
res 
|-- nonsecured 
|-- secured 
/*--- /Directories structure ---*/ 

/*--- WebApplicationInitializer ---*/ 
Dynamic portalSecurityFilter = servletContext.addFilter("portalSecurityFilter", new PortalSecurityFilter()); 
portalSecurityFilter.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), false, "/*"); 

// Spring Security filtr 
Dynamic securityFilter = servletContext.addFilter("springSecurityFilterChain", DelegatingFilterProxy.class); 
securityFilter.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), false, "/*"); 

CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter(); 
characterEncodingFilter.setEncoding("UTF-8"); 

Dynamic dynamicCharacterEncodingFilter = servletContext.addFilter("characterEncodingFilter", characterEncodingFilter); 
dynamicCharacterEncodingFilter.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), false, "/*"); 

Dynamic ajaxFilter = servletContext.addFilter("ajaxFilter", new AjaxFilter()); 
ajaxFilter.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), false, "/*"); 

// Root context 
AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext(); 
rootContext.register(WebConfig.class); 

// Dispatcher servlet 
ServletRegistration.Dynamic dispatcherServlet = servletContext.addServlet("dispatcherServlet", new DispatcherServlet(rootContext)); 
dispatcherServlet.setLoadOnStartup(1); 
dispatcherServlet.addMapping("/"); 

servletContext.addListener(new ContextLoaderListener(rootContext)); 
/*--- /WebApplicationInitializer ---*/ 

/*--- Web configuration part ---*/ 
@Override 
public void addResourceHandlers(ResourceHandlerRegistry registry) { 
    super.addResourceHandlers(registry); 
    registry.addResourceHandler("/res/**").addResourceLocations("/WEB-INF/res/"); 
} 
/*--- /Web configuration part ---*/ 

/*--- Spring Security confogiration part ---*/ 
<http pattern="/res/unsecured/**" security="none" /> 

<http pattern="/**" use-expressions="true" authentication-manager-ref="myAuthenticationManager"> 

    <intercept-url pattern="/res/secured/**" access="hasRole('ROLE_USER_AUTHENTICATED')" /> 
    <intercept-url pattern="/**" access="permitAll" /> 
</http> 
/*--- /Spring Security confogiration part ---*/ 

감사합니다.

편집

나는 자원 핸들러에서 제공하는 자원이 봄 보안 필터 체인을 통과하지 않기 때문에 보안 구성 <http pattern="/res/unsecured/**" security="none" /> 부분은 무의미 나에게 보인다 주위를 연주한다. 이 없거나 구성이 잘못 되었습니까?

+0

webpat.xml에서 DispatcherServlet 및 Spring 보안 필터 체인 (DelegatingFilterProxy)의 URL 패턴을 게시하십시오. –

+0

안녕하세요 Maksym 저는 web.xml을 덜 구성 스타일로 사용하고 있습니다. 일반적으로 'DelegatingFilterProxy'는 "/ *"에 매핑되고 DispatcherServlet는 "/"에 매핑됩니다. –

+0

addResourceLocations ("/ WEB-INF/res/**") –

답변

2

나는 이것이 내 부끄러운 일인 것 같아. 스프링 보안은 예상대로 작동하며 위의 구성은 잘 작동합니다. 내 문제는 브라우저가 정적 리소스 (즉, PDF 파일)를 캐시하고 난 그 사실을 알지 못했다는 것입니다. 같은 문제가 발생하면 문제를 찾기 위해 시간을 낭비하기 전에 열심히 새로 고침을 시도하십시오.

관련 문제