我爲我的Spring啓動應用程序實現了JWT認證。總體而言,其工作原理如下:智威湯遜認證:如何實現註銷?
- 客戶端向登錄端點發送用戶名,密碼。
- 服務器檢查所提供的憑證是有效的。
- 如果沒有,它會返回一個錯誤
- 如果是的話,它會返回一個令牌,該令牌實際上包括
- 客戶端發送一個令牌與將來每一個請求
的問題是,應該如何我們實施註銷?
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;
class TokenAuthenticationService {
static final long EXPIRATIONTIME = 864_000_000; // 10 days
static final String SECRET = "ThisIsASecret";
static final String TOKEN_PREFIX = "Bearer";
static final String HEADER_STRING = "Authorization";
static void addAuthentication(HttpServletResponse res, String username) {
String JWT = Jwts
.builder()
.setSubject(username)
.setExpiration(
new Date(System.currentTimeMillis() + EXPIRATIONTIME))
.signWith(SignatureAlgorithm.HS512, SECRET).compact();
res.addHeader(HEADER_STRING, TOKEN_PREFIX + " " + JWT);
}
static Authentication getAuthentication(HttpServletRequest request, UserDetailsService customUserDetailsService) {
String token = request.getHeader(HEADER_STRING);
if (token != null) {
// parse the token.
Claims claims = Jwts.parser().setSigningKey(SECRET)
.parseClaimsJws(token.replace(TOKEN_PREFIX, "")).getBody();
String userName = claims.getSubject();
Date expirationTime = claims.getExpiration();
if (expirationTime.compareTo(new Date()) < 0) {
return null;
}
UserDetails user = customUserDetailsService.loadUserByUsername(userName);
return user != null ? new UsernamePasswordAuthenticationToken(user.getUsername(),
user.getPassword(), user.getAuthorities()) : null;
}
return null;
}
}
addAuthentication
使用由JWTLoginFilter
類登錄時發送認證碼,「getAuthentication is used by the
JWTAuthenticationFilter`該過濾器的所有請求的端點。
什麼是最好的做法嗎?
這裏會出現問題。看看如何實現addAuthentication。認證碼取決於兩個因素:1.用戶名2.期望時間。用戶名永不改變,因此驗證碼在到期時間到期之前一直有效。 –
除非在驗證管理器的當前有效令牌集合中可以找到它才被認爲是有效的。這正是我的答案所暗示的。 –
在任何情況下,如果這是什麼讓您感到困擾,請在令牌中再添加一個獨特的術語,如計數器。 –