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();
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();
public SecretKey getKey(String secretKey) {
return Keys.hmacShaKeyFor(secretKey.getBytes(StandardCharsets.UTF_8));
}
바이트배열을 받아 UTF_8로 인코딩 하여 SecretKey타입으로 반환하는 함수를 만듦
기존 - localStorage에 nickname을 담아 사용
- localStorage에서 다른 사용자의 닉네임으로 바꾼다면 글을 수정할 수 있음 ..... (문제가 많음..)
- Spring Security에서 인증할때 사용하는 사용자의 정보를 담은 UserDetails 객체를 구현한
CustomUserDetails에 nickname을 추가함
1️⃣ 게시글의 세부사항 (Board Details)를 확인할 때 작성자인지?(수정할 수 있는지?)를 판단하기위해
DTO에 canEdit (boolean) 변수를 선언
2️⃣ 인증객체 UserDeatils 인터페이스를 구현한 CustomUserDetails에 id, 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변수에 따라 수정, 삭제, 업데이트를 할 수 있는 기능을 사용할 수 있도록 한다.
--> 이에 따라 로그인할 때 닉네임 정보를 백엔드에서 제공하지않아도 된다.
'
'
'
'
'
'
이외에도 게시물을 올릴 때 사용자가 연락수단을 게시글에 작성하는 것이 아닌
채팅기능을 구현하여 사용할 수 있도록 변경해볼 예정이다..
🥲