111. Database 연동을 위한
Custom Tag 제공
authentication-manager
authentication-provider
!--user-service !-- 인메모리 부분 제거 --
user name=member password=test authorities=member /
user name=user password=user authorities=user /
/user-service--
jdbc-user-service data-source-ref=datasource객체
users-by-username-query=username으로 사용자 정보를 가져오는 쿼리
authorities-by-username-query=username으로 사용자 권한 정보를 가져
오는 쿼리/
/authentication-provider
/authentication-manager
17
338. 페이스북 인증 Filter
public class 페이스북인증Filter extends AbstractAuthenticationProcessingFilter{
public 페이스북인증Filter() {
// 중략
public 페이스북인증Filter() {
super(/facebook_login);
super(/facebook_login);
//
447. 커스텀 권한 Filter를 추가
해보자 1
1. 추가할 Filter를 생성
bean id=jdbcFilterSecurityInterceptor
class=org.springframework.security.web.access.intercept
.FilterSecurityInterceptor /
2. URL권한 정보를 관리하는 Class를 Customizing
여기서 예제는 expression 을 사용하는 SecurityMetadataSource
클래스를 이용
42
462. DB SecurityMetadataSource Flow
FilterInvocationSecurityMetadataSource
Spring Security
내부에서 사용 하는 인터
페이스 전환 후 전달
URL 권한 객체 요청
AuthorizationMetaService
DB 쿼리
URL 권한 데이터 전송
DB
44
463. public class JdbcExpressionFilterInvocationDefinitionSourceFactoryBean implements
FactoryBeanExpressionBasedFilterInvocationSecurityMetadataSource {
private AuthorizationMetaService authorizationMetaService;
...
public ExpressionBasedFilterInvocationSecurityMetadataSource getObject() {
private 권한메타Service 권한메타MetaService;
return new ExpressionBasedFilterInvocationSecurityMetadataSource(
//
중략 ...this.executeResourceMap(),
newString resourceMap = // DB에서 가져오기
MapString, DefaultWebSecurityExpressionHandler());
}
authorizationMetaService.findAllAuthMetaData();
protected LinkedHashMapRequestMatcher, CollectionConfigAttribute
executeResourceMap() {
LinkedHashMapRequestMatcher, CollectionConfigAttribute
MapString, String resourceMap = authorizationMetaService.findAllAuthMetaData();
LinkedHashMapRequestMatcher, CollectionConfigAttribute requestMap =
requestMap =
//... 중략
//... 중략
for (Map.EntryString, String entry : resourceMap.entrySet()) {
for (Map.EntryString, String entry : resourceMap.entrySet()) {
// 중략 ... ( Spring Security에서 사용하는 포멧으로 변경 )
// 중략 ... ( Spring Security 내부 인터페이스로 Converting )
requestMap.put(matcher, attrList);
requestMap.put(matcher, attrList);
}
}
return requestMap;
}
return requestMap;
...
45
538. Spring Security
주요 Filter order list
1. SecurityContextPersistenceFilter
- SecurityContext 즉 사용자 인증 및 권한 정보를 저장할 위치를 지정
(기본 설정: HttpSession )
- http 태그의 ”security-context-repository-ref” 속성으로 확장 가능
2. ConcurrentSessionFilter
- 현재 Session이 유효여부를 파악하여 유효하지 않는 세션에 대한 후처리
- 유효하지 않은 경우는 보통 동시접속자가 발생하여 해당 세션이 무효화 및
Session 유효시간 지나는 등의 문제가 발생할 때 무효화 처리
- SessionManagementFilter와 연동 처리
3. LogoutFilter
- 특정 URI(기본:/j_spring_security_logout)를 체크하여 Logout을 실행
- Logout을 할 때 처리(LogoutHandler)
- Logout 성공 후 처리(LogoutSuccessHandler)
53
539. Spring Security
주요 Filter order list
4. UsernamePasswordAuthenticationFilter
- 특정 URI(기본: /j_spring_security_check)에서 Username (보통ID),
Password를 통한 인증 프로세스를 진행
- 인증(Login)프로세스 관련 부분은 AuthenticationManager에게 위임
- 인증 성공(SuccessHandler) 및 실패(FailureHandler) 후처리 등을 진행
- SpringSecurity에서 가장 핵심적이면서 많은 확장 포인트가 존재
5. RequestCacheAwareFilter
- 인증 성공 후 기존 요청을 찾아가기 위해 기존 요청을 저장하기 위해 사용
- 기본 적으로 Session을 사용한다.
54
540. Spring Security
주요 Filter order list
6. SecurityContextHolderAwareRequestFilter
- Servlet Api에서 HttpServletRequest 의 “getRemoteUser”,
“getUserPrincipal”, “isUserInRole”, ”isGranted” 메소드를 Spring
Security 인증, 및 권한된 정보에 맞도록 Overriding
- http 태그의 “servlet-api-provision” 속성이 true일때 활성화
(기본값: true)
7. RememberMeAuthenticationFilter
- RememberMe란? 보통 한번 인증 후 다시 해당 조건에 만족 되면 인증 정보가 필요
없이 자동으로 로그인
- 이 Filter는 해당 요청이 RememberMe 조건에 맞으면 자동으로 인증 (기본값은 특
정cookie값이 존재할 때)
- RememberMe 프로세스 순서
(1) UsernamePasswordAuthenticationFilter에서 인증 후 해당 인증값 바탕으로
암호화 된 Cookie기록
(2) RememberMe 요청 조건에 맞는 요청시 해당 조건(기본 Cookie)를 기초로 인증
(3) Logout시 해당 쿠키를 제거
55
541. Spring Security
주요 Filter order list
8. AnonymousAuthenticationFilter
- 이 Filter의 순서가 될때까지 인증이 되지 않았다면 익명의 사용자를 추가
- 기본적으로 인증을 받지않은 사용자도 내부적으로 기본“익명의”사용자로 판단
- 기본값 username: “anonymousUser”, role: “ROLE_ANONYMOUS”
- http 태그 안의 anonymous 태그와 관련
9. SessionManagementFilter
- Session 정보의 보안 및 동시 접속 등 전반적인 Session 추적 및 정보 관리
- 로그인시 기존 Session 존재할 시 기존 세션을 무효화 하고 새롭게 생성할 것
인지 무조건 새로운 세션 추가 할 것인지 등 처리
- 동시 접속자를 허용할지, 몇 명까지 허용할 것인지 여부, 허용하지 않거나 허용된
Session의 수가 넘었을 때 처리 ( Session 무효화 처리 )
- http의 “create-session” 속성 및 내부 session-management 태그
와 관련
56
542. Spring Security
주요 Filter order list
10. ExceptionTranslationFilter
- 이 Filter는 현재 이 Filter 이후의 모든 Process 내부에서 발생한
”AuthenticationException”(인증 Exception),
“AccessDeniedException”(권한 Exception) 찾아내어 처리
- http의 “entry-point-ref”, “access-denied-page”와 내부 accessdenied-handler 태그와 관련
11. FilterSecurityInterceptor
- 권한 프로세스를 처리하는 Filter부분으로 실질적인 처리는 부모 Class인
“AbstractSecurityInterceptor” 에서 대부분을 처리
- 내부 권한처리는 AccessDecisionManager Class를 통해 진행
- 권한 관련 메타 정보는 FilterInvocationSecurityMetadataSource 인터페이
스 기반 Class에서 관리
- 기본은 http 내부의 intercept-url 태그의 내용을 기준으로 권한을 처리
- http의 “access-decision-manager-ref”, “once-per-request“ 속성과
내부의 intercept-url 태그와 관련
57