kimchanjung / utterance-comments

github 댓글 저장소
1 stars 0 forks source link

[Spring Security] 스프링시큐리티 커스텀 필터의 구현(3) #4

Open utterances-bot opened 4 years ago

utterances-bot commented 4 years ago

[Spring Security] 스프링시큐리티 커스텀 필터의 구현(3)

스프링시큐리티의 커스텀 필터를 생성하고 적용하는 방법을 예제코드와 함께 알아봅니다.

http://localhost:3000/spring/2020/07/03/spring-security-03.html

hyejungg commented 3 years ago

좋은 글 감사합니다. 이해가 잘되네요! 이런 식으로 필터처리를 하면 훨씬 깔끔할 것 같아 참고합니다. 감사합니다 :D

kimchanjung commented 3 years ago

스프링 시큐리티는 생각 보다 내용이 엄청 방대 합니다 ㅠ 관련 블로그 글 들이 많지만 내용이 단편적이기도 하구요 시간이 되신다면 공식 문서를 한번 읽어보는데 시간을 조금 투자한 후 작업 하시는게 오히려 작업 시간을 줄일 수 있을 듯 합니다 ~

kimchanjung commented 2 years ago

getAuthenticationManager() 는 AuthenticationManager 인터페이의 메소드 즉 AuthenticationManager 객체를 가져오는 메소드 입니다 AuthenticationManager null 은 인증을 처리하는 AuthenticationManager즉 개발자가(사용자가) 별도의 인증로직이 포함된 클래스를 만들어 등록 해야합니다 등록되어 있지않아서 NPE가 발생하는 것입니다 본 포스트 2를 잘살펴보세요

nnenovv commented 2 years ago

감사합니다 ! 혹시 개인적인 질문입니다만 .. 제가 security login시 success handler에서 session을 저장했습니다.

@Override public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { HttpSession session = request.getSession();

    session.setAttribute("login_id", authentication.getPrincipal().toString());

} 이런식으로 세션저장하는 부분을 추가했었습니다.

그런데 로그인하고서 다시 서버를 강제로 재시작했을때 로그아웃이 되지않고 session이 계속 살아있습니다.. 제가 무언가를 또 잘못한걸까요 ..? 그리고 SecurityContextHolder.getContext().. 로 Authentication 값 가져와서 확인해보니 얘도 재시작을 했는데도 계속 값이 존재하더라고요 .. 이부분은 어떻게 해야할까요 ㅜ.ㅜ ?

그리고 중복로그인방지를 구현하고 싶어 config부분에 http.sessionManagement() .maximumSessions(1) .maxSessionsPreventsLogin(false) .expiredUrl("/login"); 도 추가했습니다만 적용이 되지않더라고요 .. 같은 계정 로그인을 각각 두대에 해서 한곳에서는 미리 로그인 했던곳에서 자동으로 로그아웃 되도록 하고싶은데 로그아웃이 안되고 그냥 둘 다 로그인이 됩니다 세션때문에 꼬여서 이런일이 발생하는건지도 궁금하네요 ..

너무 질문이 많아 죄송합니다 제가 열심히 서치를 해봤는데도 못알아내서 .. 제 능력부족으로 여쭈어봅니다 ㅠ.ㅠㅠㅠㅠㅠ

  1. 중복 로그인 방지가 안먹는 이유와 해결방법
  2. 서버 재시작해도 세션과 SecurityContextHolder.getContext() Authentication 값이 계속 살아있는 이유와 해결방법 2-1. 세션을 잘못 저장한건지 ? (사실 저렇게 하면 security session부분에 저장했다 생각했습니다.)

감사합니다 !!

kimchanjung commented 2 years ago
public class CustomAuthenticationManager implements AuthenticationManager {

    @Autowired
    private UserDetailsService userDetailsService;

    @Override
    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
        // 이라인이 아이디, 비번으로 유저정보를 조회합니다(구현하셔야합니다, 디비에 회원정보가 있다면 조회하는 로직이 들어가는 것이죠)
        UserDetails userDetails = userDetailsService.loadUserByUsername(authentication.getPrincipal());
         // 다음에 올바로 조회 되지 았았다면 예외를 발생시키는 로직을 추가합니다
        // 그렇게 되면 CustomAuthenticationFailureHandler 구현하여 등록시키면  이 클래스에 설정된  로그인 오류 안내 페이지로 이동하게 됩니다.
        if (  userDetails == null) throw new 적절한 예외 클래스

        // 세션을 따로 저장하는 것이 아닙니다 UsernamePasswordAuthenticationToken 클래스에 유저정보로 객체를 생성하여 리턴하면 세션에 저장됩니다
        // 아마도 임의 로 세션에 따로 저장을 하였기 때문에 재부팅을 해도 남아 아 있는것으로 추정되네요
        return new UsernamePasswordAuthenticationToken(userDetails.getUsername()
                , userDetails.getPassword()
                , userDetails.getAuthorities()))
    }
}
nnenovv commented 2 years ago

감사합니다 ! 그런데 이미 로그인에서 구현을 해놓은 상태입니다. 로그인이 안되면 SecurityContextHolder에 저장되지 않고 로그인했을때는 저장이 됩니다 그런데 문제는 서버가 재시작을 하고 나서도 로그인 한 정보가 그대로 SecurityContextHolder에 저장되더라구요 .. 이부분은 어떻게 해야할까요ㅠㅠ ? 그리고 SecurityContextHolder에 제가 원하는 정보를 따로 또 저장할 수는 없는건가요 ?