본문 바로가기
프로젝트/SpringSecurity

[Spring Security] 15. JWT를 이용하기 위해 강제로그인

by dantriss 2023. 7. 19.

유튜브에서 스프링시큐리티를 심화교육하면서 조금더 레벨업 하고자 한다.

IDE : IntelliJ

언어 : Java 8

스프링부트 버전 : 2.7.13

DB : MySQL

빌드관리 도구 : Maven

OS : iOS

참고유튜브 : 메타코딩


저번글에 이어서 권한을 위해서 정보를 세션에 저장하기 위해서 강제로 로그인하는 기능을 작성해보자.

권한마다 접근가능한 주소가 다르기 때문에 해당 기능을 위해서 세션에 유저의 정보를 토큰에서 받아서 저장해보자.

 

JwtAuthenticationFilter로 이동해서 body값에서 넘어오는 값을 한 번 받아보자.

@Override
    public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
        System.out.println("로그인 시도중");

        try {
            BufferedReader br = request.getReader();
            String input = null;
            while ((input=br.readLine()) != null){
                System.out.println("attemptAuthentication input : "+input);
            }
            
        } catch (IOException e) {
            throw  new RuntimeException();
        }

        return null;
    }

 

값을 넣어주면 body에서 넘겨준 값들이 잘 넘어오는걸 확인 할 수 있다.

이제 해당 값들을 기준으로 db에서 유저정보를 select를 해서 세션에 저장해주면 된다.

 

username 과 password를 좀 더 간단하게 받아 주기 위해서 ObjectMapper를 이용해서 받아온 데이터를 파싱해주면 된다.

ObjectMapper objectMapper = new ObjectMapper();
User user = objectMapper.readValue(request.getInputStream(), User.class);
System.out.println("user test : "+ user);

 

콘솔에서 확인을 해보면 받아온 데이터를 user에 저장이 된 걸 확인할 수 있다.

이제 해당 정보를 가지고 db에서 회원의 정보를 불러와보자.

 

user에 저장된 username 과 password를 이용해

PrincipalDetailsService에 loadUserByUsername의 함수가 실행이 되어서 정상적인 회원의 정보라면 authentication을 리턴해준다.

정상적으로 세션에 정보가 저장되었는지 확인해보기 위해서 PrincipalDetails로 형변환을 한 후 값을 출력해보면 db에 있던 유저의 정보가 출력되는걸 확인할 수 있다.

UsernamePasswordAuthenticationToken authenticationToken =
        new UsernamePasswordAuthenticationToken(user.getUsername(),user.getPassword());
Authentication authentication = authenticationManager.authenticate(authenticationToken);

PrincipalDetails principalDetails = (PrincipalDetails) authentication.getPrincipal();

System.out.println("principalDetails test(login check) : "+principalDetails.getUser());

return authentication;

 

select 함수가 실행이 되면서 변수명 principalDeatails에 해당 유저의 정보가 저장된걸 확인할 수 있다.

즉 세션에 해당유저의 정보가 저장이 되었고 roles에서 일반유저인것도 확인할 수 있다.

이제 세션에 저장된 유저의 정보에서 roles에 따라서 접근할 수 있는 주소를 다르게 할 수 있다.

 

@RequiredArgsConstructor
public class JwtAuthenticationFilter extends UsernamePasswordAuthenticationFilter {
    private final AuthenticationManager authenticationManager;


    @Override
    public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
        System.out.println("로그인 시도중");

        try {

            ObjectMapper objectMapper = new ObjectMapper();
            User user = objectMapper.readValue(request.getInputStream(), User.class);
            System.out.println("user test : "+ user);

            UsernamePasswordAuthenticationToken authenticationToken =
                    new UsernamePasswordAuthenticationToken(user.getUsername(),user.getPassword());
            Authentication authentication = authenticationManager.authenticate(authenticationToken);

            PrincipalDetails principalDetails = (PrincipalDetails) authentication.getPrincipal();

            System.out.println("principalDetails test(login check) : "+principalDetails.getUser());

            return authentication;
        } catch (IOException e) {
            e.printStackTrace();
        }

        return null;
    }
}

댓글