add spring security and token management

This commit is contained in:
dirgantarasiahaan
2023-05-23 19:42:51 +07:00
parent 597d4062c7
commit c76c01a174
35 changed files with 1095 additions and 53 deletions

View File

@@ -0,0 +1,91 @@
package com.iconplus.smartproc.configuration;
import com.iconplus.smartproc.model.token.TokenContent;
import io.jsonwebtoken.*;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Component;
import java.io.Serializable;
import java.security.KeyPair;
import java.util.*;
import java.util.function.Function;
@Component
public class JwtTokenUtil implements Serializable {
private static final long serialVersionUID = -2550185165626007488L;
@Autowired
private KeyPair keyPair;
//retrieve expiration date from jwt token
public Date getExpirationDateFromToken(String token) {
return getClaimFromToken(token, Claims::getExpiration);
}
public <T> T getClaimFromToken(String token, Function<Claims, T> claimsResolver) {
final Claims claims = getAllClaimsFromToken(token);
return claimsResolver.apply(claims);
}
//for retrieveing any information from token we will need the secret key
public Claims getAllClaimsFromToken(String token) {
return Jwts.parser().setSigningKey(keyPair.getPublic()).parseClaimsJws(token).getBody();
}
private Boolean isTokenExpired(String token) {
final Date expiration = getExpirationDateFromToken(token);
return expiration.before(new Date());
}
public String generateToken(String username, TokenContent tokenContent, Integer expirationInMs, String channel, String scopeType) {
Map<String, Object> claims = new HashMap<>();
claims.put("authorities", tokenContent.getAccessMenu());
claims.put("fullname", tokenContent.getFullname());
claims.put("username", tokenContent.getUsername());
claims.put("user_id", tokenContent.getUserId());
claims.put("role", tokenContent.getRole());
return doGenerateToken(claims, username, expirationInMs);
}
public String doGenerateToken(Map<String, Object> claims, String subject, Integer expirationInMs) {
return Jwts.builder().setClaims(claims).setSubject(subject).setIssuedAt(new Date(System.currentTimeMillis()))
.setExpiration(new Date(System.currentTimeMillis() + expirationInMs))
.signWith(SignatureAlgorithm.RS256, keyPair.getPrivate()).compact();
}
public Boolean validateToken(String token, UserDetails userDetails) {
final String username = getUsernameFromToken(token);
return (username.equals(userDetails.getUsername()) && !isTokenExpired(token));
}
public boolean validateTokenOnly(String authToken) {
try {
Jwts.parser().setSigningKey(keyPair.getPublic()).parseClaimsJws(authToken);
return true;
} catch (SignatureException | MalformedJwtException | UnsupportedJwtException | IllegalArgumentException ex) {
throw new BadCredentialsException("INVALID_CREDENTIALS", ex);
} catch (ExpiredJwtException ex) {
throw ex;
}
}
public String getUsernameFromToken(String token) {
Claims claims = Jwts.parser().setSigningKey(keyPair.getPublic()).parseClaimsJws(token).getBody();
return claims.getSubject();
}
@SuppressWarnings("squid:S4834")
public List<SimpleGrantedAuthority> getRolesFromToken(String token) {
Claims claims = Jwts.parser().setSigningKey(keyPair.getPublic()).parseClaimsJws(token).getBody();
List<SimpleGrantedAuthority> authorityList = new ArrayList<>();
ArrayList<String> authorities = claims.get("authorities", ArrayList.class);
authorities.forEach(c-> authorityList.add(new SimpleGrantedAuthority(c)));
return authorityList;
}
}