jwt settings service instead jwt settings data object
This commit is contained in:
		
							parent
							
								
									7c8db6cac7
								
							
						
					
					
						commit
						5ea3c9ff6a
					
				@ -24,7 +24,6 @@ import org.thingsboard.server.common.data.security.model.JwtToken;
 | 
			
		||||
@ConfigurationProperties(prefix = "security.jwt")
 | 
			
		||||
@Data
 | 
			
		||||
public class JwtSettings {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * {@link JwtToken} will expire after this time.
 | 
			
		||||
     */
 | 
			
		||||
 | 
			
		||||
@ -88,7 +88,6 @@ public class ThingsboardInstallService {
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private ConditionValidatorUpgradeService conditionValidatorUpgradeService;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    public void performInstall() {
 | 
			
		||||
        try {
 | 
			
		||||
            if (isUpgrade) {
 | 
			
		||||
 | 
			
		||||
@ -25,7 +25,7 @@ import org.thingsboard.server.common.data.CacheConstants;
 | 
			
		||||
import org.thingsboard.server.common.data.id.UserId;
 | 
			
		||||
import org.thingsboard.server.common.data.security.event.UserAuthDataChangedEvent;
 | 
			
		||||
import org.thingsboard.server.common.data.security.model.JwtToken;
 | 
			
		||||
import org.thingsboard.server.config.JwtSettings;
 | 
			
		||||
import org.thingsboard.server.config.JwtSettingsService;
 | 
			
		||||
import org.thingsboard.server.service.security.model.token.JwtTokenFactory;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.PostConstruct;
 | 
			
		||||
@ -39,7 +39,7 @@ import static java.util.concurrent.TimeUnit.SECONDS;
 | 
			
		||||
public class TokenOutdatingService {
 | 
			
		||||
    private final CacheManager cacheManager;
 | 
			
		||||
    private final JwtTokenFactory tokenFactory;
 | 
			
		||||
    private final JwtSettings jwtSettings;
 | 
			
		||||
    private final JwtSettingsService jwtSettingsService;
 | 
			
		||||
    private Cache usersUpdateTimeCache;
 | 
			
		||||
 | 
			
		||||
    @PostConstruct
 | 
			
		||||
@ -58,7 +58,7 @@ public class TokenOutdatingService {
 | 
			
		||||
 | 
			
		||||
        return Optional.ofNullable(usersUpdateTimeCache.get(toKey(userId), Long.class))
 | 
			
		||||
                .map(outdatageTime -> {
 | 
			
		||||
                    if (System.currentTimeMillis() - outdatageTime <= SECONDS.toMillis(jwtSettings.getRefreshTokenExpTime())) {
 | 
			
		||||
                    if (System.currentTimeMillis() - outdatageTime <= SECONDS.toMillis(jwtSettingsService.getJwtSettings().getRefreshTokenExpTime())) {
 | 
			
		||||
                        return MILLISECONDS.toSeconds(issueTime) < MILLISECONDS.toSeconds(outdatageTime);
 | 
			
		||||
                    } else {
 | 
			
		||||
                        /*
 | 
			
		||||
 | 
			
		||||
@ -24,9 +24,9 @@ import io.jsonwebtoken.MalformedJwtException;
 | 
			
		||||
import io.jsonwebtoken.SignatureAlgorithm;
 | 
			
		||||
import io.jsonwebtoken.SignatureException;
 | 
			
		||||
import io.jsonwebtoken.UnsupportedJwtException;
 | 
			
		||||
import lombok.RequiredArgsConstructor;
 | 
			
		||||
import lombok.extern.slf4j.Slf4j;
 | 
			
		||||
import org.apache.commons.lang3.StringUtils;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.springframework.security.authentication.BadCredentialsException;
 | 
			
		||||
import org.springframework.security.core.GrantedAuthority;
 | 
			
		||||
import org.springframework.stereotype.Component;
 | 
			
		||||
@ -35,7 +35,7 @@ import org.thingsboard.server.common.data.id.TenantId;
 | 
			
		||||
import org.thingsboard.server.common.data.id.UserId;
 | 
			
		||||
import org.thingsboard.server.common.data.security.Authority;
 | 
			
		||||
import org.thingsboard.server.common.data.security.model.JwtToken;
 | 
			
		||||
import org.thingsboard.server.config.JwtSettings;
 | 
			
		||||
import org.thingsboard.server.config.JwtSettingsService;
 | 
			
		||||
import org.thingsboard.server.service.security.exception.JwtExpiredTokenException;
 | 
			
		||||
import org.thingsboard.server.service.security.model.JwtTokenPair;
 | 
			
		||||
import org.thingsboard.server.service.security.model.SecurityUser;
 | 
			
		||||
@ -49,6 +49,7 @@ import java.util.UUID;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
 | 
			
		||||
@Component
 | 
			
		||||
@RequiredArgsConstructor
 | 
			
		||||
@Slf4j
 | 
			
		||||
public class JwtTokenFactory {
 | 
			
		||||
 | 
			
		||||
@ -61,12 +62,7 @@ public class JwtTokenFactory {
 | 
			
		||||
    private static final String TENANT_ID = "tenantId";
 | 
			
		||||
    private static final String CUSTOMER_ID = "customerId";
 | 
			
		||||
 | 
			
		||||
    private final JwtSettings settings;
 | 
			
		||||
 | 
			
		||||
    @Autowired
 | 
			
		||||
    public JwtTokenFactory(JwtSettings settings) {
 | 
			
		||||
        this.settings = settings;
 | 
			
		||||
    }
 | 
			
		||||
    private final JwtSettingsService jwtSettingsService;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Factory method for issuing new JWT Tokens.
 | 
			
		||||
@ -79,7 +75,7 @@ public class JwtTokenFactory {
 | 
			
		||||
        UserPrincipal principal = securityUser.getUserPrincipal();
 | 
			
		||||
 | 
			
		||||
        JwtBuilder jwtBuilder = setUpToken(securityUser, securityUser.getAuthorities().stream()
 | 
			
		||||
                .map(GrantedAuthority::getAuthority).collect(Collectors.toList()), settings.getTokenExpirationTime());
 | 
			
		||||
                .map(GrantedAuthority::getAuthority).collect(Collectors.toList()), jwtSettingsService.getJwtSettings().getTokenExpirationTime());
 | 
			
		||||
        jwtBuilder.claim(FIRST_NAME, securityUser.getFirstName())
 | 
			
		||||
                .claim(LAST_NAME, securityUser.getLastName())
 | 
			
		||||
                .claim(ENABLED, securityUser.isEnabled())
 | 
			
		||||
@ -138,7 +134,7 @@ public class JwtTokenFactory {
 | 
			
		||||
    public JwtToken createRefreshToken(SecurityUser securityUser) {
 | 
			
		||||
        UserPrincipal principal = securityUser.getUserPrincipal();
 | 
			
		||||
 | 
			
		||||
        String token = setUpToken(securityUser, Collections.singletonList(Authority.REFRESH_TOKEN.name()), settings.getRefreshTokenExpTime())
 | 
			
		||||
        String token = setUpToken(securityUser, Collections.singletonList(Authority.REFRESH_TOKEN.name()), jwtSettingsService.getJwtSettings().getRefreshTokenExpTime())
 | 
			
		||||
                .claim(IS_PUBLIC, principal.getType() == UserPrincipal.Type.PUBLIC_ID)
 | 
			
		||||
                .setId(UUID.randomUUID().toString()).compact();
 | 
			
		||||
 | 
			
		||||
@ -188,16 +184,16 @@ public class JwtTokenFactory {
 | 
			
		||||
 | 
			
		||||
        return Jwts.builder()
 | 
			
		||||
                .setClaims(claims)
 | 
			
		||||
                .setIssuer(settings.getTokenIssuer())
 | 
			
		||||
                .setIssuer(jwtSettingsService.getJwtSettings().getTokenIssuer())
 | 
			
		||||
                .setIssuedAt(Date.from(currentTime.toInstant()))
 | 
			
		||||
                .setExpiration(Date.from(currentTime.plusSeconds(expirationTime).toInstant()))
 | 
			
		||||
                .signWith(SignatureAlgorithm.HS512, settings.getTokenSigningKey());
 | 
			
		||||
                .signWith(SignatureAlgorithm.HS512, jwtSettingsService.getJwtSettings().getTokenSigningKey());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public Jws<Claims> parseTokenClaims(JwtToken token) {
 | 
			
		||||
        try {
 | 
			
		||||
            return Jwts.parser()
 | 
			
		||||
                    .setSigningKey(settings.getTokenSigningKey())
 | 
			
		||||
                    .setSigningKey(jwtSettingsService.getJwtSettings().getTokenSigningKey())
 | 
			
		||||
                    .parseClaimsJws(token.getToken());
 | 
			
		||||
        } catch (UnsupportedJwtException | MalformedJwtException | IllegalArgumentException | SignatureException ex) {
 | 
			
		||||
            log.debug("Invalid JWT Token", ex);
 | 
			
		||||
 | 
			
		||||
@ -24,6 +24,7 @@ import org.thingsboard.server.common.data.id.UserId;
 | 
			
		||||
import org.thingsboard.server.common.data.security.Authority;
 | 
			
		||||
import org.thingsboard.server.common.data.security.model.JwtToken;
 | 
			
		||||
import org.thingsboard.server.config.JwtSettings;
 | 
			
		||||
import org.thingsboard.server.config.JwtSettingsService;
 | 
			
		||||
import org.thingsboard.server.service.security.model.SecurityUser;
 | 
			
		||||
import org.thingsboard.server.service.security.model.UserPrincipal;
 | 
			
		||||
import org.thingsboard.server.service.security.model.token.AccessJwtToken;
 | 
			
		||||
@ -36,6 +37,8 @@ import java.util.UUID;
 | 
			
		||||
import java.util.concurrent.TimeUnit;
 | 
			
		||||
 | 
			
		||||
import static org.assertj.core.api.Assertions.assertThat;
 | 
			
		||||
import static org.mockito.BDDMockito.willReturn;
 | 
			
		||||
import static org.mockito.Mockito.mock;
 | 
			
		||||
 | 
			
		||||
public class JwtTokenFactoryTest {
 | 
			
		||||
 | 
			
		||||
@ -50,7 +53,10 @@ public class JwtTokenFactoryTest {
 | 
			
		||||
        jwtSettings.setTokenExpirationTime((int) TimeUnit.HOURS.toSeconds(2));
 | 
			
		||||
        jwtSettings.setRefreshTokenExpTime((int) TimeUnit.DAYS.toSeconds(7));
 | 
			
		||||
 | 
			
		||||
        tokenFactory = new JwtTokenFactory(jwtSettings);
 | 
			
		||||
        JwtSettingsService jwtSettingsService = mock(JwtSettingsService.class);
 | 
			
		||||
        willReturn(jwtSettings).given(jwtSettingsService).getJwtSettings();
 | 
			
		||||
 | 
			
		||||
        tokenFactory = new JwtTokenFactory(jwtSettingsService);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
 | 
			
		||||
@ -27,6 +27,7 @@ import org.thingsboard.server.common.data.security.UserCredentials;
 | 
			
		||||
import org.thingsboard.server.common.data.security.event.UserAuthDataChangedEvent;
 | 
			
		||||
import org.thingsboard.server.common.data.security.model.JwtToken;
 | 
			
		||||
import org.thingsboard.server.config.JwtSettings;
 | 
			
		||||
import org.thingsboard.server.config.JwtSettingsService;
 | 
			
		||||
import org.thingsboard.server.dao.customer.CustomerService;
 | 
			
		||||
import org.thingsboard.server.dao.user.UserService;
 | 
			
		||||
import org.thingsboard.server.service.security.auth.jwt.JwtAuthenticationProvider;
 | 
			
		||||
@ -50,6 +51,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows;
 | 
			
		||||
import static org.junit.jupiter.api.Assertions.assertTrue;
 | 
			
		||||
import static org.mockito.ArgumentMatchers.any;
 | 
			
		||||
import static org.mockito.ArgumentMatchers.eq;
 | 
			
		||||
import static org.mockito.BDDMockito.willReturn;
 | 
			
		||||
import static org.mockito.Mockito.mock;
 | 
			
		||||
import static org.mockito.Mockito.when;
 | 
			
		||||
 | 
			
		||||
@ -71,10 +73,14 @@ public class TokenOutdatingTest {
 | 
			
		||||
        jwtSettings.setTokenExpirationTime((int) MINUTES.toSeconds(10));
 | 
			
		||||
        jwtSettings.setRefreshTokenExpTime((int) DAYS.toSeconds(7));
 | 
			
		||||
        jwtSettings.setTokenSigningKey("secret");
 | 
			
		||||
        tokenFactory = new JwtTokenFactory(jwtSettings);
 | 
			
		||||
 | 
			
		||||
        JwtSettingsService jwtSettingsService = mock(JwtSettingsService.class);
 | 
			
		||||
        willReturn(jwtSettings).given(jwtSettingsService).getJwtSettings();
 | 
			
		||||
 | 
			
		||||
        tokenFactory = new JwtTokenFactory(jwtSettingsService);
 | 
			
		||||
 | 
			
		||||
        cacheManager = new ConcurrentMapCacheManager();
 | 
			
		||||
        tokenOutdatingService = new TokenOutdatingService(cacheManager, tokenFactory, jwtSettings);
 | 
			
		||||
        tokenOutdatingService = new TokenOutdatingService(cacheManager, tokenFactory, jwtSettingsService);
 | 
			
		||||
        tokenOutdatingService.initCache();
 | 
			
		||||
 | 
			
		||||
        userId = new UserId(UUID.randomUUID());
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user