Tag Archives: SpringSecurity

Error: SpringSecurity CustomFilter 추가시 @Bean 사용 주의

Message

는 없고

원인

Bean생성하면 자동으로 filterchain에 등록이 되어 버리는데

별 생각없이 쓰면 그냥 Bean생성을 해 버린다.

그리고 오류없이 동작할 때도 있다.

해결

Filter 상속받는 애들을 Security에 사용하려면 @Bean 생성을 하지 않는다.

SpringSecurityFilterChain에만 등록되야 하는데 Servlet Filter에 등록 돼 버리니

SecurityFilterChain이 한개만 있는경우는 슬쩍 넘어갈 때도 있는데 두개이상 쓰는 경우 상위에서 이 필터가 동작 해 버리면 확실히 오류가 난다.
@Bean말고 그냥 new 해서 쓴다.

Spring Security 정리

SecurityFilter와 ServletFilter

이름은 똑같이 Filter이지만 Servlet에서 관리되는 Filter와 구조가 다르다.

여기서는 ServletFilter와 SecurityFilter로 구분하겠다.

 

https://docs.spring.io/spring-security/site/docs/3.0.x/reference/security-filter-chain.html

<filter>
  <filter-name>myFilter</filter-name>
  <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
  <filter-name>myFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

DelegateFilterProxy만 ServletFilter이다.

다른 SecurityFilter는 이 하위에서 동작한다.

 

ex) API와 웹화면이 별도의 체인 사용

<bean id="filterChainProxy" class="org.springframework.security.web.FilterChainProxy">
  <sec:filter-chain-map path-type="ant">
     <sec:filter-chain pattern="/webServices/**" filters="
           securityContextPersistenceFilterWithASCFalse,
           basicAuthenticationFilter,
           exceptionTranslationFilter,
           filterSecurityInterceptor" />
     <sec:filter-chain pattern="/**" filters="
           securityContextPersistenceFilterWithASCTrue,
           formLoginFilter,
           exceptionTranslationFilter,
           filterSecurityInterceptor" />
  </sec:filter-chain-map>
</bean>

SecurityFilter중 하나인 LogoutFilter의 선언부

public class LogoutFilter extends GenericFilterBean {
}

public abstract class GenericFilterBean implements Filter, BeanNameAware, EnvironmentAware,
		EnvironmentCapable, ServletContextAware, InitializingBean, DisposableBean {
}

SecurityFilter도 javax.servlet.Filter를 상속받지만 아예 다른 형태로 만드는게 혼란이 없지 않았을까 하는 생각이 든다.

 

Cors필터나 기타 인증필터를 추가해서 Security인증을 하고싶다면 ServetFilter가 아닌 SecurityFilterChain에 추가를 해야한다.

Security의 핵심인 FilterChain

https://stackoverflow.com/questions/41480102/how-spring-security-filter-chain-works

SpringSecurity JavaConfig 기본설정부분의 일부

@Configuration
@EnableWebSecurity
class SecurityConfig : WebSecurityConfigurerAdapter() {
	override fun configure(http: HttpSecurity?) {
		http!!.csrf().disable()
				.cors().and()
				.authorizeRequests()
				.anyRequest().authenticated()
				.and()
	}
}

기본적으로 셋팅되는 필터들

서로간에 강한 의존성을 가지며 순서가 중요하다.

FilterChainProxy

1 WebAsyncManagerIntegrationFilter
2 SecurityContextPersistenceFilter
3 HeaderWriterFilter
4 CorsFilter --optional
5 LogoutFilter
6 UsernamePasswordAuthenticationFilter
7 RequestCacheAwareFilter
8 SecurityContextHolderAwareRequestFilter
9 AnonymousAuthenticationFilter
0 SessionManagementFilter
1 ExceptionTranslationFilter
2 FilterSecurityInterceptor

 

FilterChain을 구동시키는 Filter만

JWT나 CORS 필터 적용이 필요하다면 Security에 올리는게 좋다.

 

RoleVoter

 

 

issue,bug: SpringSecurity Redirect to favicon.ico When after login action.

http://blog.naver.com/PostView.nhn?blogId=jadin1&logNo=70127130610

이유는 위 블로그에 영문,한글 다 잘 설명되어 있다.
제목을 영어로 쓴 것은 영어를 잘 해서가 아니라… 어차피 이런 종류 문서 검색은 다 영어로 할테니까…

내 경우에는 시큐리티 설정을 이런식으로 해놧었다.

/user/login 으로 로그인 주소를 잡아놓은 경우에는 /user/resources/…/favico.ico으로 redirect된다.
/~~~check 기본주소로 로그인 주소를 잡아놓고 돌리면 /favicon.ico 로 redirect된다.

키워드:
리다이렉트,스프링시큐리티,버그