|
|
|
@ -53,11 +53,91 @@ public final class CsrfAuthenticationStrategy implements |
|
|
|
throws SessionAuthenticationException { |
|
|
|
throws SessionAuthenticationException { |
|
|
|
boolean containsToken = this.csrfTokenRepository.loadToken(request) != null; |
|
|
|
boolean containsToken = this.csrfTokenRepository.loadToken(request) != null; |
|
|
|
if(containsToken) { |
|
|
|
if(containsToken) { |
|
|
|
CsrfToken newToken = this.csrfTokenRepository.generateToken(request); |
|
|
|
|
|
|
|
this.csrfTokenRepository.saveToken(null, request, response); |
|
|
|
this.csrfTokenRepository.saveToken(null, request, response); |
|
|
|
this.csrfTokenRepository.saveToken(newToken, request, response); |
|
|
|
|
|
|
|
request.setAttribute(CsrfToken.class.getName(), newToken); |
|
|
|
CsrfToken newToken = this.csrfTokenRepository.generateToken(request); |
|
|
|
request.setAttribute(newToken.getParameterName(), newToken); |
|
|
|
CsrfToken tokenForRequest = new SaveOnAccessCsrfToken(csrfTokenRepository, request, response, newToken); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
request.setAttribute(CsrfToken.class.getName(), tokenForRequest); |
|
|
|
|
|
|
|
request.setAttribute(newToken.getParameterName(), tokenForRequest); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private static final class SaveOnAccessCsrfToken implements CsrfToken { |
|
|
|
|
|
|
|
private transient CsrfTokenRepository tokenRepository; |
|
|
|
|
|
|
|
private transient HttpServletRequest request; |
|
|
|
|
|
|
|
private transient HttpServletResponse response; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private final CsrfToken delegate; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public SaveOnAccessCsrfToken(CsrfTokenRepository tokenRepository, |
|
|
|
|
|
|
|
HttpServletRequest request, HttpServletResponse response, |
|
|
|
|
|
|
|
CsrfToken delegate) { |
|
|
|
|
|
|
|
super(); |
|
|
|
|
|
|
|
this.tokenRepository = tokenRepository; |
|
|
|
|
|
|
|
this.request = request; |
|
|
|
|
|
|
|
this.response = response; |
|
|
|
|
|
|
|
this.delegate = delegate; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public String getHeaderName() { |
|
|
|
|
|
|
|
return delegate.getHeaderName(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public String getParameterName() { |
|
|
|
|
|
|
|
return delegate.getParameterName(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public String getToken() { |
|
|
|
|
|
|
|
saveTokenIfNecessary(); |
|
|
|
|
|
|
|
return delegate.getToken(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
|
|
|
public String toString() { |
|
|
|
|
|
|
|
return "SaveOnAccessCsrfToken [delegate=" + delegate + "]"; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
|
|
|
public int hashCode() { |
|
|
|
|
|
|
|
final int prime = 31; |
|
|
|
|
|
|
|
int result = 1; |
|
|
|
|
|
|
|
result = prime * result |
|
|
|
|
|
|
|
+ ((delegate == null) ? 0 : delegate.hashCode()); |
|
|
|
|
|
|
|
return result; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
|
|
|
public boolean equals(Object obj) { |
|
|
|
|
|
|
|
if (this == obj) |
|
|
|
|
|
|
|
return true; |
|
|
|
|
|
|
|
if (obj == null) |
|
|
|
|
|
|
|
return false; |
|
|
|
|
|
|
|
if (getClass() != obj.getClass()) |
|
|
|
|
|
|
|
return false; |
|
|
|
|
|
|
|
SaveOnAccessCsrfToken other = (SaveOnAccessCsrfToken) obj; |
|
|
|
|
|
|
|
if (delegate == null) { |
|
|
|
|
|
|
|
if (other.delegate != null) |
|
|
|
|
|
|
|
return false; |
|
|
|
|
|
|
|
} else if (!delegate.equals(other.delegate)) |
|
|
|
|
|
|
|
return false; |
|
|
|
|
|
|
|
return true; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void saveTokenIfNecessary() { |
|
|
|
|
|
|
|
if(this.tokenRepository == null) { |
|
|
|
|
|
|
|
return; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
synchronized(this) { |
|
|
|
|
|
|
|
if(tokenRepository != null) { |
|
|
|
|
|
|
|
this.tokenRepository.saveToken(delegate, request, response); |
|
|
|
|
|
|
|
this.tokenRepository = null; |
|
|
|
|
|
|
|
this.request = null; |
|
|
|
|
|
|
|
this.response = null; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|