Skip to content

Commit

Permalink
Updated jjwt 0.11
Browse files Browse the repository at this point in the history
  • Loading branch information
Kudzai P Matizirofa authored and Kudzai P Matizirofa committed Jul 2, 2023
1 parent ada8632 commit 4afb97e
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 55 deletions.
31 changes: 14 additions & 17 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@
<groupId>com.intela</groupId>
<artifactId>dpring-jwt-auth</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dpring-jwt-auth</name>
<description>dpring-jwt-auth</description>
<name>spring-jwt-auth</name>
<description>spring-jwt-auth</description>
<properties>
<java.version>20</java.version>
</properties>
Expand Down Expand Up @@ -40,15 +40,24 @@
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
<artifactId>jjwt-api</artifactId>
<version>0.11.5</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.11.5</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>0.11.5</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>8.0.0.Final</version>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
Expand Down Expand Up @@ -85,18 +94,6 @@
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jetbrains</groupId>
<artifactId>annotations</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.jetbrains</groupId>
<artifactId>annotations</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
</dependency>
</dependencies>

<build>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,12 +36,12 @@ protected void doFilterInternal(@NonNull HttpServletRequest request,
filterChain.doFilter(request, response);
return;
}
jwt = authHeader.substring(7);
jwt = authHeader.split(" ")[1].trim();
userEmail = jwtUtil.extractUsername(jwt);

if(userEmail != null && SecurityContextHolder.getContext().getAuthentication() == null){
UserDetails userDetails = this.userDetailsService.loadUserByUsername(userEmail);
if(jwtUtil.validateToken(jwt, userDetails)){
if(jwtUtil.isTokenValid(jwt, userDetails)){
UsernamePasswordAuthenticationToken authToken = new UsernamePasswordAuthenticationToken(
userDetails,
null,
Expand Down
74 changes: 38 additions & 36 deletions src/main/java/com/intela/springjwtauth/util/JwtUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,71 +3,73 @@
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.lang.NonNull;
import io.jsonwebtoken.security.Keys;
import jakarta.validation.constraints.NotNull;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Service;

import java.security.Key;
import java.util.Base64;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;


@Service
public class JwtUtil {

private final String jwtSigningKey = "secret";
private final String SECRET_KEY = "8d4fed75477d160c393db8a22edce23a5ae7971b4533077d89ac0016dd92c879d21791073310294924cb896443a8214cfdc129baa42af8b3030a397382a93532";

public String extractUsername(String token){
return extractClaim(token, Claims::getSubject);
}

public Date extractExpiration(String token){

return extractClaim(token, Claims::getExpiration);
}

public <T> T extractClaim(String token, Function<Claims, T> claimsResolver){
public <T> T extractClaim(String token, @NotNull Function<Claims, T> claimsResolver){
final Claims claims = extractAllClaims(token);
return claimsResolver.apply(claims);
}

public boolean hasClaim(String token, String claimName){
final Claims claims = extractAllClaims(token);
return claims.get(claimName) != null;
public String generateToken(UserDetails userDetails){
return generateToken(new HashMap<>(), userDetails);
}

public <T> T getClaimFromToken(String token, @NonNull Function<Claims, T> claimsResolver) {
final Claims claims = extractAllClaims(token);
return claimsResolver.apply(claims);
public String generateToken(
Map<String, Object> extractClaims,
UserDetails userDetails
){
return Jwts
.builder()
.setClaims(extractClaims)
.setSubject(userDetails.getUsername())
.setIssuedAt(new Date(System.currentTimeMillis()))
.setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 24))
.signWith(getSigningKey(), SignatureAlgorithm.HS256)
.compact();
}

private Claims extractAllClaims(String token){
return Jwts.parser().setSigningKey(jwtSigningKey).parseClaimsJws(token).getBody();
public boolean isTokenValid(String token, UserDetails userDetails){
final String username = extractUsername(token);
return(username.equals(userDetails.getUsername())) && !isTokenExpired(token);
}

@NonNull
private Boolean isTokenExpired(@NonNull String token){
final Date expiration = extractExpiration(token);
return expiration.before(new Date());
private boolean isTokenExpired(String token) {
return extractExpiration(token).before(new Date());
}

public String generateToken(@NonNull UserDetails user){
Map<String, Object> claims = new HashMap<>();
return createToken(claims, user);
private Date extractExpiration(String token) {
return extractClaim(token, Claims::getExpiration);
}

private String createToken(Map<String, Object> claims, UserDetails user){
return Jwts.builder()
.setClaims(claims)
.setSubject(user.getUsername())
.claim("authorities", user.getAuthorities())
.setIssuedAt(new Date(System.currentTimeMillis()))
.setExpiration(new Date(System.currentTimeMillis() + TimeUnit.HOURS.toMillis(24)))
.signWith(SignatureAlgorithm.HS256, jwtSigningKey).compact();
private Claims extractAllClaims(String token){
return Jwts.parserBuilder()
.setSigningKey(getSigningKey())
.build()
.parseClaimsJws(token)
.getBody();
}

public Boolean validateToken(@NonNull String token, UserDetails user){
final String username = extractUsername(token);
return(username.equals(user.getUsername()) && !isTokenExpired(token));
private Key getSigningKey() {
byte[] keyBytes = Base64.getDecoder().decode(SECRET_KEY);
return Keys.hmacShaKeyFor(keyBytes);
}
}

0 comments on commit 4afb97e

Please sign in to comment.