• 로그인
  • 장바구니에 상품이 없습니다.

home2 게시판 Spring 게시판 auth 정보 저장이 뭔가 이상합니다 선생님

auth 정보 저장이 뭔가 이상합니다 선생님

4 글 보임 - 1 에서 4 까지 (총 4 중에서)
  • 글쓴이
  • #124883

    leeh
    참가자
    @PostMapping("/login/jwt")
    @ResponseBody
    public String loginJWT(@RequestBody Map<String,String> data, HttpServletResponse response){
      UsernamePasswordAuthenticationToken authToken = new UsernamePasswordAuthenticationToken(
              data.get("username"), data.get("password"));
      Authentication auth = authenticationManagerBuilder.getObject().authenticate(authToken);
      SecurityContextHolder.getContext().setAuthentication(auth);
      String jwt = JwtUtil.createToken(SecurityContextHolder.getContext().getAuthentication());
      System.out.println(jwt);
      System.out.println(auth);
      Cookie cookie =  new Cookie("jwt",jwt);
      cookie.setMaxAge(1000);
      cookie.setHttpOnly(true);
      cookie.setPath("/");
      response.addCookie(cookie);
    return "";
    }가 돌아가면
    스크린샷 2024-06-04 오후 12.30.15
    2번째줄에 토큰뜨고 그 밑에 auth정보는 잘 나오는데
    
    @GetMapping("/my-page/jwt")
    @ResponseBody
    public String myPageJWT(Authentication auth) {
      System.out.println(auth);
      return "마이페이지 데이터";
    }
    로 auth를 뽑으면 null이 튀어나옵니다
    스크린샷 2024-06-04 오후 12.30.25
    
    JwtFilter 파일에서
    System.out.println(authToken.getPrincipal().toString()); 구분 추가해서 돌려봤는데
    com.crud.first.member.CustomUser [Username=test, Password=[PROTECTED], Enabled=true, AccountNonExpired=true, CredentialsNonExpired=true, AccountNonLocked=true, Granted Authorities=[일반유저]]
    요로코롬 정보는 잘 튀어나오더라구요
    
    혹시 SecurityConfig.java 쪽 문제일까요 선생님? 코드는 아래와 같슴다
    
    package com.crud.first;
    import com.crud.first.board.Board;
    import com.crud.first.board.BoardRepository;
    import com.crud.first.member.JwtFilter;
    import lombok.RequiredArgsConstructor;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.security.config.annotation.web.builders.HttpSecurity;
    import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
    import org.springframework.security.config.http.SessionCreationPolicy;
    import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
    import org.springframework.security.crypto.password.PasswordEncoder;
    import org.springframework.security.web.SecurityFilterChain;
    import org.springframework.security.web.access.ExceptionTranslationFilter;
    import java.util.List;
    @Configuration
    @EnableWebSecurity
    @RequiredArgsConstructor
    public class SecurityConfig {
      private final BoardRepository boardRepository;
      public Board getFirstBoardNum() {
        return boardRepository.findAll().getFirst();
      }
      //기존
    //  @Bean
    //  public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    //    http.csrf((csrf) -> csrf.disable());
    //
    //    http.authorizeHttpRequests((authorize) -> authorize.requestMatchers("/**").permitAll());
    //
    //    http.formLogin((formLogin) -> formLogin.loginPage("/login").defaultSuccessUrl("/board/"+getFirstBoardNum().getBoardId()));
    //
    //    http.logout(logout -> logout.logoutUrl("/logout").logoutSuccessUrl("/"));
    //
    //    return http.build();
    //  }
      @Bean
      public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        // CSRF 보호 비활성화
        http.csrf((csrf) -> csrf.disable());
        http.addFilterBefore(new JwtFilter(), ExceptionTranslationFilter.class);
        //로그인시 세션데이터 만들지마셈
        http.sessionManagement((session) -> session
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
        );
        // 요청 권한 설정
        http.authorizeHttpRequests((authorize) -> {
          authorize.requestMatchers("/","/register","/member","/login","/login/jwt","/my-page/jwt").permitAll();
          authorize.requestMatchers("home.css", "/dog.png", "register.css").permitAll();
          authorize.anyRequest().authenticated(); // 위 2줄 외 모든 요청은 인증된 사용자만 접근 가능
        });
    //    // 로그인 설정
    //    http.formLogin((formLogin) ->
    //            formLogin.loginPage("/login")
    //                    .defaultSuccessUrl("/board/"+getFirstBoardNum().getBoardId())
    //                    .permitAll()); // 로그인 페이지는 모든 사용자가 접근 가능해야 함
        // 로그아웃 설정
        http.logout((logout) ->
                logout.logoutUrl("/logout")
                        .logoutSuccessUrl("/")); // 로그아웃 성공 시 "/" 로 리다이렉션
    //    // 세션 관리 설정 (세션 만료 시 "/"로 리다이렉션)
    //    http.sessionManagement((session) ->
    //            session.invalidSessionUrl("/")); // 세션이 유효하지 않을 때 리다이렉트할 URL 설정
        return http.build();
      }
      @Bean
      public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
      }
    }
    
    추가로 공부한 코드들이 많아서 많이 더럽습니다 센세..죄송함다
    
    
    
    #124894

    codingapple
    키 마스터
    JwtFilter 클래스 코드가 뭔가 이상하거나 아니면 유효기간 10초가 지나서 그럴수도요
    #124896

    leeh
    참가자
    유효기간은 이빠이 늘려봤는데 그래도 이상한거 보니까 JwtFilter같은데요..
    
    package com.crud.first.member;
    import io.jsonwebtoken.Claims;
    import jakarta.servlet.FilterChain;
    import jakarta.servlet.ServletException;
    import jakarta.servlet.http.Cookie;
    import jakarta.servlet.http.HttpServletRequest;
    import jakarta.servlet.http.HttpServletResponse;
    import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
    import org.springframework.security.core.authority.SimpleGrantedAuthority;
    import org.springframework.security.core.context.SecurityContextHolder;
    import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
    import org.springframework.web.filter.OncePerRequestFilter;
    import java.io.IOException;
    import java.util.Arrays;
    import java.util.List;
    public class JwtFilter extends OncePerRequestFilter {
      @Override
      protected void doFilterInternal(HttpServletRequest request,
                                      HttpServletResponse response,
                                      FilterChain filterChain)
              throws ServletException, IOException {
        Cookie[] cookies = request.getCookies();
        if (cookies == null){
          filterChain.doFilter(request, response);
          return;
        }
        var jwtCookie ="";
        for (int i = 0; i < cookies.length; i++) {
          if (cookies[i].getName().equals("jwt")){
            jwtCookie = cookies[i].getValue();
            System.out.println("확인 " +jwtCookie);
          }
        }
        Claims claim;
        try {
          claim = JwtUtil.extractToken(jwtCookie);
        }catch (Exception e){
          filterChain.doFilter(request, response);
          return;
        }
        String[] arr = claim.get("authorities").toString().split(",");
        List<SimpleGrantedAuthority> authorities = Arrays.stream(arr).map(a -> new SimpleGrantedAuthority(a)).toList();
        CustomUser customUser = new CustomUser(claim.get("username").toString(),"none",authorities);
        customUser.setDisplayName(claim.get("displayName").toString());
        UsernamePasswordAuthenticationToken authToken = new UsernamePasswordAuthenticationToken(
                customUser,""
        );
        authToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
        SecurityContextHolder.getContext().setAuthentication(authToken);
        System.out.println(authToken.getPrincipal().toString());
        filterChain.doFilter(request, response);
      }
    }
    이건 JwtFilter코드인데 혹시 어디가 문제일까요..? sout찍는건 잘 나오는거같은데..
    • 이 답변은 leeh에 의해 1 년, 2 월 전에 수정됐습니다.
    #124920

    codingapple
    키 마스터
    다른 파일에 /my-page/jwt 이런 API가 또 있을수도요
    아니면  API에서 SecurityContextHolder.getContext().getAuthentication() 이런거 출력해봅시다
4 글 보임 - 1 에서 4 까지 (총 4 중에서)
  • 답변은 로그인 후 가능합니다.

About

현재 월 700명 신규수강중입니다.

  (09:00~20:00) 빠른 상담은 카톡 플러스친구 코딩애플 (링크)
  admin@codingapple.com
  이용약관, 개인정보처리방침
ⓒ Codingapple, 강의 예제, 영상 복제 금지
top

© Codingapple, All rights reserved. 슈퍼로켓 에듀케이션 / 서울특별시 강동구 고덕로 19길 30 / 사업자등록번호 : 212-26-14752 온라인 교육학원업 / 통신판매업신고번호 : 제 2017-서울강동-0002 호 / 개인정보관리자 : 박종흠