Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/main/java/com/itsu/threedays/config/JasyptConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,5 +20,6 @@ public StringEncryptor stringEncryptor() {
config.setPoolSize("1");
encryptor.setConfig(config);
return encryptor;
//test
}
}
50 changes: 50 additions & 0 deletions src/main/java/com/itsu/threedays/config/jwt/JwtFilter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package com.itsu.threedays.config.jwt;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.util.StringUtils;
import org.springframework.web.filter.OncePerRequestFilter;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@RequiredArgsConstructor
@Slf4j
public class JwtFilter extends OncePerRequestFilter {
private final JwtTokenProvider jwtTokenProvider;


@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
//Request Header에서 토큰 추출
String jwt = jwtTokenProvider.resolveToken(request);
log.info("jwt filter!");
log.info("jwt: {}",jwt);

//Token 유효성 검사
if (StringUtils.hasText(jwt) && jwtTokenProvider.validateToken(jwt)){

//토큰 인증받은 유저인 UsernamePasswordAuthenticiationToken을 리턴
Authentication auth = jwtTokenProvider.getAuthentication(jwt);
log.info("authentication!");

SecurityContextHolder.getContext().setAuthentication(auth); //토큰이 유효한 유저임 -> SecurityContext에 저장
}


filterChain.doFilter(request,response);
}

// private String resolveToken(HttpServletRequest request){
// String bearerToken = request.getHeader("authorization");
// if(StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ")) {
// return bearerToken.substring(7);
// }
// return null;
// }
}
97 changes: 97 additions & 0 deletions src/main/java/com/itsu/threedays/config/jwt/JwtTokenProvider.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
package com.itsu.threedays.config.jwt;

import io.jsonwebtoken.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.User;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import javax.annotation.PostConstruct;
import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
import java.util.Base64;
import java.util.Collection;
import java.util.Date;
import java.util.stream.Collectors;

@Component
@Slf4j
public class JwtTokenProvider {
@Value("${jwt.secret}")
private String secret;

@PostConstruct
private void init() {
secret = Base64.getEncoder().encodeToString(secret.getBytes());
}

public String createToken(Authentication authentication){
Date now = new Date();
Date expiryDate = new Date(now.getTime() + 86400);
// Claims claims = Jwts.claims().setSubject(String.valueOf(authentication.getPrincipal()));
// claims.put("role",authentication.getAuthorities());
String authorities = authentication.getAuthorities().stream()
.map(GrantedAuthority::getAuthority)
.collect(Collectors.joining(","));


return Jwts.builder()
.setSubject(authentication.getName())
.claim("auth",authorities)
.setIssuedAt(now)
.setExpiration(expiryDate)
.signWith(SignatureAlgorithm.HS256,secret)
.compact();
}
//토큰넘버, 만료인증시간(24시간정도),,

public boolean validateToken(String token) {
try {
Jws<Claims> claims = Jwts.parser().setSigningKey(secret).parseClaimsJws(token);
//토큰의 만료 시간이 현재 시간 이전인지를 확인 -> 만료 시간이 현재 시간 이전이라면 유효하지 않은 토큰으로 판단
if (claims.getBody().getExpiration().before(new Date())) {
return false;
}
return true;
} catch (JwtException | IllegalArgumentException e) {
return false;
}
}

// 인증 성공시 SecurityContextHolder에 저장할 Authentication 객체 생성
public Authentication getAuthentication(String token) {

Claims claims = Jwts.parserBuilder()
.setSigningKey(secret)
.build()
.parseClaimsJws(token)
.getBody();

//클레임에서 권한 정보 가져오기
Collection<? extends GrantedAuthority> authorities =
Arrays.stream(claims.get("auth").toString().split(","))
.map(SimpleGrantedAuthority::new)
.collect(Collectors.toList());

//User 객체를 만들어서 Authentication 리턴
User principal = new User(claims.getSubject(), "",authorities);

return new UsernamePasswordAuthenticationToken(principal, token, authorities);
}
public String resolveToken(HttpServletRequest request){
String bearerToken = request.getHeader("Authorization");
log.info("bearerToken: {}",bearerToken);
if(StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ")) { //authorization이 Bearer 인지 확인

log.info("bearerToken.substring(7) :{}",bearerToken.substring(7));
return bearerToken.substring(7);
}

return null;
}
}