New Bulls 프로젝트 3

chaean·2024년 6월 19일

프로젝트 - Bulls

목록 보기
10/11

2024.06.19

1. 자동로그인을 위해 refresh Token도 발급.

  • 기존에는 String 타입으로 Access Token만 반환해주었다
  • TokenDTO에 refresh Token을 추가하여 TokenDTO 타입으로 반환으로 변경
        String refreshToken = Jwts.builder()
                .setExpiration(new Date(System.currentTimeMillis() + expiration_refresh))
//                .signWith(SignatureAlgorithm.HS256, secretKey) // 지원 중단
                .signWith(getKey(secretKey), SignatureAlgorithm.HS256)
                .compact();

        return TokenDTO.builder()
                .access(accessToken)
                .refresh(refreshToken)
                .build();

2. JWT를 발급할 때 암호화 하는 함수 signWith() 함수가 변경되고 이전 것이 지원 중단되어 변경

        String accessToken = Jwts.builder()
                .setSubject(authentication.getName())
                .claim("roles", authorities)
                .setIssuedAt(new Date(System.currentTimeMillis())) // 토큰 발행 시간 정보
                .setExpiration(new Date(System.currentTimeMillis() + expiration_access)) // 유효시간 저장 -> ms단위
//                .signWith(SignatureAlgorithm.HS256, secretKey) // 사용할 암호화 알고리즘
                .signWith(key, SignatureAlgorithm.HS256)
                .setIssuer(issuer)
                .compact();
  • secretKey는 JWT발급 이외에도 인증, 검증 등 다양하게 사용하기 때문에
    public SecretKey getKey(String secretKey) {
        return Keys.hmacShaKeyFor(secretKey.getBytes(StandardCharsets.UTF_8));
    }

바이트배열을 받아 UTF_8로 인코딩 하여 SecretKey타입으로 반환하는 함수를 만듦

3. 글을 작성한 사용자가 본인인지 확인

  • 기존 - localStorage에 nickname을 담아 사용

    		- localStorage에서 다른 사용자의 닉네임으로 바꾼다면 글을 수정할 수 있음 ..... (문제가 많음..)
      
    		- Spring Security에서 인증할때 사용하는 사용자의 정보를 담은 UserDetails 객체를 구현한 
      			CustomUserDetails에 nickname을 추가함
      

2024.06.25

  • 변경 - UserDeatils 인터페이스를 구현한 CustomUserDetails를 SecurityHolder에 저장

1️⃣ 게시글의 세부사항 (Board Details)를 확인할 때 작성자인지?(수정할 수 있는지?)를 판단하기위해
DTO에 canEdit (boolean) 변수를 선언

2️⃣ 인증객체 UserDeatils 인터페이스를 구현한 CustomUserDetailsid, password, 권한. 추가로 nickname 정보를 저장하도록 수정

package com.example.bulls.Config;

import lombok.Getter;
import lombok.ToString;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

import java.util.Collection;


@ToString
public class CustomUserDetails implements UserDetails {

    private final String uid;
    private final String password;
    @Getter
    private final String nickName;
    private final Collection<? extends GrantedAuthority> authorities;

    public CustomUserDetails(String uid, String password, String nickName, Collection<? extends GrantedAuthority> authorities) {
        this.uid = uid;
        this.password = password;
        this.nickName = nickName;
        this.authorities = authorities;
    }

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return this.authorities;
    }

    @Override
    public String getPassword() {
        return this.password;
    }

    @Override
    public String getUsername() {
        return this.uid;
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {
        return true;
    }
}

3️⃣ 로그인할 때 SecurityContextHolder에 인증 객체를 저장하기 위한 코드를 추가

// 인증 객체 생성
CustomUserDetails customUserDetails = new CustomUserDetails(uId, pas, nickname, Arrays.asList(new SimpleGrantedAuthority(optionalUser.get().getRoles())));
Authentication authentication = new UsernamePasswordAuthenticationToken(customUserDetails, customUserDetails.getPassword(), customUserDetails.getAuthorities());

// SecurityContextHolder에 인증 객체 저장
SecurityContextHolder.getContext().setAuthentication(authentication);

4️⃣ Service단에서 SecurityContextHolder를 통해 현재 로그인한 User의 정보를 담고있는 CustomUserDetails에 저장 되어있는 닉네임과 Match(게시글)을 등록한 User의 닉네임을 비교하고 canEdit변수를 셋팅해준다.

5️⃣ 이후 프론트에서 canEdit변수에 따라 수정, 삭제, 업데이트를 할 수 있는 기능을 사용할 수 있도록 한다.

--> 이에 따라 로그인할 때 닉네임 정보를 백엔드에서 제공하지않아도 된다.

'
'
'
'
'
'

이외에도 게시물을 올릴 때 사용자가 연락수단을 게시글에 작성하는 것이 아닌
채팅기능을 구현하여 사용할 수 있도록 변경해볼 예정이다..

🥲

profile
백엔드 개발자

0개의 댓글