DevEnjoy

One Step Closer

Spring

Spring Security 동일 session 제어

2018년 4월 25일 by YongPwi Leave a Comment

spring security를 사용하여 로그인 관리를 할때 동일 session에 대한 제어 처리 부분 삽질,,,

동일 session을 허락하지 않게 설정을하는데 설정은 잘 먹는다.

하지만 설정 이후에 logout을 해도 session이 삭제되지 않는다.

머지,,, 찾아보니 spring security 3.2.4 버전에서 문제가 있었다고 한다.

나도 하도 짜증나서 디버깅으로 찍어보니 AbstractAuthenticationProcessingFilter의 doFilter(ServletRequest req, ServletResponse res, FilterChain chain) method 실행중 sessionStrategy.onAuthentication(authResult, request, response); 부분에서 에러가 발생하였다.

해당 method는 CompositeSessionAuthenticationStrategy의 onAuthentication method에서 session 체크시 로그아웃한 session이 삭제되지 않아서 발생한 문제이다.

1
2
3
4
5
6
7
8
9
10
public void onAuthentication(Authentication authentication,
            HttpServletRequest request, HttpServletResponse response)
                    throws SessionAuthenticationException {
        for (SessionAuthenticationStrategy delegate : this.delegateStrategies) {
            if (this.logger.isDebugEnabled()) {
                this.logger.debug("Delegating to " + delegate);
            }
            delegate.onAuthentication(authentication, request, response);
        }
    }

왜 이런 문제가 발생하나 엄청나게 구글링을 했지만 딱히 방법이 없었다.

국내 블로거분께서는 spring security 3.2.7 이상을 사용시 해결되었다고 했는데 우리 환경은 4버전 이상이여서 해당 문제는 아닌것 같았다.

물론 방법은 찾았다.

spring boot에서 HttpSessionListener 관련 설정 내용에 대한 언급이 없어서 해외 개발자가 이슈로 등록했는데 받아들여지지 않은것 같다.

1
2
3
4
5
6
7
8
9
10
11
12
// web.xml에 하위 리스너를 선언하고 사용하는 방식
<listener>
    <listener-class>session.destory.servlet.SessionManagerListener</listener-class>
</listener>

// spring boot에서 bean annotation으로 선언하고 사용하는 방식
// 해당 bean 내용을 spring WebSecurityConfigurerAdapter를 extends한 class(WebSecurityConfiguration)
에 등록하고 사용하였다.
@Bean
public ServletListenerRegistrationBean<HttpSessionEventPublisher> httpSessionEventPublisher() {
    return new ServletListenerRegistrationBean<HttpSessionEventPublisher>(new HttpSessionEventPublisher());
}

상위 처럼 설정하면 logout시 spring security 내부적으로 session을 삭제처리 된다.

참고링크

https://github.com/spring-projects/spring-boot/issues/2518

http://zgundam.tistory.com/62

Posted in: Java, Programing, Spring Tagged: Spring, Spring boot, Spring Security

Spring @Mock, @Mockbean, @InjectMock

2018년 4월 17일 by YongPwi Leave a Comment

@Mock : (org.mockito.Mock)
import org.mockito.Mockito;
…
MyService myservice = Mockito.mock(MyService.class);

mockito에 포함

Mock 객체를 생성한다.

@Mockbean : (org.springframework.boot.test.mock.mockito.MockBean)

Spring boot test에 포함

Spirng ApplicationContext에 Mockito mock 객체를 추가 할 수 있다. Mock은 type이나 bean 이름별로 등록 할 수 있다. ApplicationContext에 정의 된 동일한 type의 bean이 존재하면 Mockito mock으로 선언한 mock bean으로 대체된다. 존재하지 않는 경우는 새 bean이 추가된다.

@InjectMock
class의 instance를 생성하고 @Mock(도는 @Spy) annotation으로 생성된 mock instance를 class의 instance에 주입한다. 이 mock instance를 초기화하고 주입하려면 @RunWith (MockitoJUnitRunner.class) 또는 Mockito.initMocks (this)를 사용해야한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@RunWith(SpringRunner.class)
public class UserServiceTest {

    @InjectMocks
    UserService userService;

    @Mock
    UserRepository userRepository;

    // userRepository는 userService에 주입된다.
    // 하위 코드 같은 관계를 가지고 있다.

    private UserRepository userRepository

    public UserService(UserRepository userRepository){
        this.userRepository = userRepository;
    }

}
Posted in: Java, Programing, Spring Tagged: InjectMock, Mock, Mockbean, Spring, Spring boot

Spring Singleton

2015년 7월 8일 by YongPwi 1 Comment
  • Spring 인스턴스 생성시 Default로 Singleton으로 관리
  • Singleton으로 선언된 SpringBean의 경우 해당 Bean이 속한 Spring Container 안에서만 하나의 인스턴스가 생성/사용되는 것을 보장
  • Spring은 Singleton Registry를 만들어 직접 Singleton 형태의 오브젝트를 만들고 관리
  • Servlet은 대부분 멀티스레드 환경에서 Singleton으로 동작
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class UserDaoTest {
    public static void main(String args[]) throws ClassNotFoundException, SQLException {
        ApplicationContext context = new AnnotationConfigApplicationContext(DaoFactory.class);

        UserDao dao = new DaoFactory().userDao();

        UserDao dao3 = context.getBean("userDao", UserDao.class);
        UserDao dao4 = context.getBean("userDao", UserDao.class);

        System.out.println(dao3);
        System.out.println(dao4);
    }
}

// 동일한 인스턴스 결과
springbook.user.dao.UserDao@2c039ac6
springbook.user.dao.UserDao@2c039ac6

Singleton 패턴 구현 방식 문제점

  • private 생성자를 갖고 있기 때문에 상속 불가
    • 객체지향의 상속과 다형성 적용 불가
  • 테스트 하기 어렵다
    • Singleton은 만들어지는 방식이 제한적이므로 테스트에서 Mock Object로 대체하기 어려움
  • 서버환경에서 싱글톤이 하나만 만들어지는지 보장 불가
    • 서버에서 class loader 구성하는 방법에 따라서 하나 이상의 오브젝트가 만들어 질 수 있음
  • Singleton 사용은 전역 상태를 만들수 있다.


Spring Singleton

  • Sington Registry 덕분에 Singleton으로 사용될 클래스라도 public 생성자를 가질 수 있다.
  • Spring Sington Bean으로 사용되는 클래스를 만들때 개별적으로 바뀌는 정보는 필히 로컬변수로 선언해서 사용해야 한다.


Spring Bean 범위

  • Singleton
    • Container 한개에 한개만 생성되며 강제로 제거하지 않는 한 Container가 존재하는 동안 계속 유지된다.
  • Prototype
    • Container에 Bean을 요청할 때마다 매번 새로운 오브젝트 생성
  • Request
    • HTTP 요청시마다 생성, 웹 친화적인 Spring ApplicationContext의 컨텍스트에서만 유효
  • Session
    • 웹의 세션과 유사

참고

Spring의 Singleton과 Java static기반 Singleton 패턴의 차이
나는 싱글턴이 싫어요
[Spring 레퍼런스] 4장 IoC 컨테이너 #6

Posted in: Java, Programing Tagged: Singleton, Spring

Calendar

6월 2025
일 월 화 수 목 금 토
« 4월    
1234567
891011121314
15161718192021
22232425262728
2930  

Recent Posts

  • ubuntu bastion 설정
  • Spring Boot properties 암호화
  • Git Repository Bitbucket과 Issue Tracker Redmine 연동 설정
  • Spring Security 동일 session 제어
  • Spring @Mock, @Mockbean, @InjectMock

Recent Comments

  • pzotov (Ubuntu 14.04에서 Sonarqube 6.7.1 service 등록)
  • cours de theatre paris (AWS ELB와 Auto Scaling 연동, nginx)
  • bayern munich (IntelliJ EAP Font rendering)
  • camiseta del chelsea (OS X에서 APP 아이콘 변경)
  • cheap football shirts replica (jQuery Ajax에서 json Array 직렬화)

Copyright © [the-year] [site-link].

Powered by [wp-link] and [theme-link].