Merge pull request #2508 from guusdk/KEYCLOAK-2731

KEYCLOAK-2731: Improve thread safety of TokenManager
This commit is contained in:
Stian Thorgersen 2016-04-07 07:36:22 +02:00
commit 6dc1194247

View file

@ -53,7 +53,7 @@ public class TokenManager {
return getAccessToken().getToken(); return getAccessToken().getToken();
} }
public AccessTokenResponse getAccessToken(){ public synchronized AccessTokenResponse getAccessToken(){
if(currentToken == null){ if(currentToken == null){
grantToken(); grantToken();
}else if(tokenExpired()){ }else if(tokenExpired()){
@ -73,9 +73,10 @@ public class TokenManager {
} }
int requestTime = Time.currentTime(); int requestTime = Time.currentTime();
currentToken = tokenService.grantToken(config.getRealm(), form.asMap()); synchronized (this) {
expirationTime = requestTime + currentToken.getExpiresIn(); currentToken = tokenService.grantToken( config.getRealm(), form.asMap() );
expirationTime = requestTime + currentToken.getExpiresIn();
}
return currentToken; return currentToken;
} }
@ -90,20 +91,22 @@ public class TokenManager {
try { try {
int requestTime = Time.currentTime(); int requestTime = Time.currentTime();
currentToken = tokenService.refreshToken(config.getRealm(), form.asMap());
expirationTime = requestTime + currentToken.getExpiresIn();
synchronized (this) {
currentToken = tokenService.refreshToken( config.getRealm(), form.asMap() );
expirationTime = requestTime + currentToken.getExpiresIn();
}
return currentToken; return currentToken;
} catch (BadRequestException e) { } catch (BadRequestException e) {
return grantToken(); return grantToken();
} }
} }
public void setMinTokenValidity(long minTokenValidity) { public synchronized void setMinTokenValidity(long minTokenValidity) {
this.minTokenValidity = minTokenValidity; this.minTokenValidity = minTokenValidity;
} }
private boolean tokenExpired() { private synchronized boolean tokenExpired() {
return (Time.currentTime() + minTokenValidity) >= expirationTime; return (Time.currentTime() + minTokenValidity) >= expirationTime;
} }