최프 - security 관련

갓김치·2021년 2월 10일
1

최종프로젝트

목록 보기
13/19

global-method-security

1조

  • 인가처리, 보호자원 db 에 등록해놓고 쓰는데 global-method-security 가 왜필요하냐, preauthorized 어노테이션때메 servlet-context.xml 에 등록해놓은것

나머지팀들

  • 보호자원을 db에 등록하고 쓰지 않고 @PreAuthorized를 쓰고있기때문에 servlet-context.xml 에 <global-method-security> 옵션이 필요
    • 원래는 인가처리를 하기위해 수업시간에securedResource.propeties에 자원을 등록하여 관리했던 것 처럼 db 에서 관리해줘야되는데 1조 외에 안하고 있음
  • @PreAuthorized : AOP방식으로 프록시 만들어서 사용하는구조
    • 프록시 생성하려면 인터페이스가 필요함 -> 그래서 <global-method-security> 을 넣은 것

advice 를 이용한 에러 제어

  • 로그인 하지 않으면 글 작성 안되는 정책
  • 로그인하지않은 상태에서 접근제어페이지로 감
    • ExceptionHandlerControllerAdvice.java 어드바이스 활용
    • 주석처리한다면 로그인페이지로 갈것임

AuthenticationPricipal

  • 로그인 하지 않은 상태에서 글등록 클릭시?
    • realMember를 String 에서 찾을 수 없다는 오류가 뜸
    • form으로 가는 핸들러에서 AuthenticationPrincipal을 매개변수로 받고 있음
    • 여기서 오류가 나는것
  • <anonymous enabled=“true” username=“anonymous”/>
    • 이 설정이 AnonymousAuthentication 이 만들어져서 거기서 realMember 를 꺼내려고하니 오류가터진거
    • 로그인을 안해도 AuthenticationPrincipal이 annonymous 라는 String으로 존재, 그래서 realMember 를 String에서 찾을수업사는 오류가 뜬다는 것

@PreAuthorized 와 타겟의 메서드 진행 순서

  • 핸들러어댑터가 핸들러호출시 타겟 메서드의 파라미터를 먼저준비함
  • @PreAuthorized는 프록시구조 호출, 타겟 호출 전 위빙 할거
  • 정리: 파라미터 준비 -> 위빙후 -> 타겟호출됨
    • AuthenticationPrincipal 먼저 처리되고 @PreAuthorized가 작동함

annonymous 쓰고싶으면?

@RequestMapping
public String form(Autentication authentication) {
  Object principal = authentication.getPrincipal();
  if(principal instance MemberWrapper) {
      // 로그인되어있다
  }else {
      // 어나니머스다
  }
	return "board/form"
}

매개변수로 받지 않고도 authentication 객체 꺼내는 방법

  • SecurityContextHolder 를 쓰면 authentication 객체를 꺼낼 수 있음
  • SecurityContextHolder 는 현재 돌고있는스레드 기반으로 리퀘스트찾아내서 세션건드려서 authentication 꺼내는 코드를 가지고있음
  • 스레드기반이라면 어디서든쓸수있음
    • 강제로 새로 스레드를 만들었을때는 사용할 수 없음
    • 컨테이너 내의 스레드에서는 언제든 쓸 수 있음
    • 컨테이너가아니고 내가 라이프사이클을 관리하는 객체나 스레드에서는 동작하지않음
profile
갈 길이 멀다

0개의 댓글