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