JWT的Java身份驗證和授權
JWT 是一種用於安全傳輸信息的開放標準,在Java 中可通過JJWT 庫實現認證與授權,1. 添加JJWT 的API、Impl 和Jackson 依賴;2. 創建JwtUtil 工具類生成、解析和驗證Token;3. 編寫JwtFilter 攔截請求併校驗Authorization 頭中的Bearer Token;4. 在Spring Boot 中註冊Filter 保護指定路徑;5. 提供登錄接口在驗證用戶後返回JWT;6. 受保護接口通過解析Token 獲取用戶身份和角色進行訪問控制,最終實現無狀態、可擴展的安全機制,適合分佈式系統應用,且需注意密鑰安全、Token 過期與HTTPS 傳輸等安全建議。
在現代Web 應用開發中,使用Java 實現用戶認證(Authentication)和授權(Authorization)是一個常見需求。 JWT(JSON Web Token)因其無狀態、可擴展和跨域支持良好,成為實現安全認證的主流方案之一。下面介紹如何在Java 應用中使用JWT 完成認證與授權。

什麼是JWT?
JWT 是一種開放標準(RFC 7519),用於在各方之間安全地傳輸信息作為JSON 對象。它通常用於身份驗證和信息交換。一個JWT 由三部分組成:
- Header :包含令牌類型和簽名算法(如HMAC SHA256)
- Payload :包含聲明(claims),比如用戶ID、角色、過期時間等
- Signature :對前兩部分的簽名,確保數據未被篡改
格式為: xxxxx.yyyyy.zzzzz

基本流程
- 用戶登錄,提交用戶名和密碼
- 服務端驗證憑據,生成JWT 返回給客戶端
- 客戶端在後續請求中攜帶JWT(通常在
Authorization
頭中) - 服務端驗證JWT 的有效性,並根據其中的聲明決定是否授權訪問資源
使用Java JWT 實現認證與授權
1. 添加依賴(以Maven 為例)
使用JJWT庫來處理JWT:
<dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-api</artifactId> <version>0.11.5</version> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-impl</artifactId> <version>0.11.5</version> <scope>runtime</scope> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-jackson</artifactId> <version>0.11.5</version> <scope>runtime</scope> </dependency>
注意:JJWT 0.11 支持模塊化,需要同時引入API、Impl 和Jackson 支持。
2. 創建JWT 工具類
import io.jsonwebtoken.*; import io.jsonwebtoken.security.Keys; import javax.crypto.SecretKey; import java.util.Date; public class JwtUtil { private static final SecretKey SECRET_KEY = Keys.secretKeyFor(SignatureAlgorithm.HS256); private static final long EXPIRATION_TIME = 86400000; // 24 hours // 生成JWT public static String generateToken(String username, String role) { return Jwts.builder() .setSubject(username) .claim("role", role) .setIssuedAt(new Date()) .setExpiration(new Date(System.currentTimeMillis() EXPIRATION_TIME)) .signWith(SECRET_KEY) .compact(); } // 解析並驗證JWT public static Claims parseToken(String token) { try { return Jwts.parserBuilder() .setSigningKey(SECRET_KEY) .build() .parseClaimsJws(token) .getBody(); } catch (ExpiredJwtException e) { System.out.println("Token 已過期"); return null; } catch (MalformedJwtException | SignatureException e) { System.out.println("無效的Token"); return null; } } // 獲取用戶名public static String getUsernameFromToken(String token) { Claims claims = parseToken(token); return claims != null ? claims.getSubject() : null; } // 獲取角色public static String getRoleFromToken(String token) { Claims claims = parseToken(token); return (String) claims.get("role"); } // 驗證Token 是否有效public static boolean isTokenValid(String token, String username) { String tokenUsername = getUsernameFromToken(token); return (tokenUsername != null && tokenUsername.equals(username) && parseToken(token) != null); } }
3. 攔截請求:實現過濾器(Filter)
創建一個JwtFilter
來攔截請求並驗證JWT。
import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class JwtFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; HttpServletResponse httpResponse = (HttpServletResponse) response; String token = httpRequest.getHeader("Authorization"); if (token != null && token.startsWith("Bearer ")) { token = token.substring(7); // 去掉"Bearer " String username = JwtUtil.getUsernameFromToken(token); if (username != null && JwtUtil.isTokenValid(token, username)) { // 可以將用戶信息存入request 屬性或Security Context httpRequest.setAttribute("currentUser", username); httpRequest.setAttribute("role", JwtUtil.getRoleFromToken(token)); chain.doFilter(request, response); } else { httpResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED); httpResponse.getWriter().write("無效或過期的Token"); } } else { httpResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED); httpResponse.getWriter().write("缺少Token"); } } }
4. 配置Filter(以Spring Boot 為例)
如果你使用的是Spring Boot,可以在配置類中註冊Filter:
@Bean public FilterRegistrationBean<JwtFilter> jwtFilter() { FilterRegistrationBean<JwtFilter> registrationBean = new FilterRegistrationBean<>(); registrationBean.setFilter(new JwtFilter()); registrationBean.addUrlPatterns("/api/secure/*"); // 保護的路徑return registrationBean; }
5. 登錄接口示例
@PostMapping("/login") public ResponseEntity<?> login(@RequestBody UserLoginRequest request) { // 簡化:實際應查數據庫密碼加密校驗if ("admin".equals(request.getUsername()) && "password".equals(request.getPassword())) { String token = JwtUtil.generateToken(request.getUsername(), "ADMIN"); return ResponseEntity.ok().body(Map.of("token", token)); } return ResponseEntity.status(401).body("用戶名或密碼錯誤"); }
6. 受保護的接口示例
@GetMapping("/secure/data") public ResponseEntity<?> getSecureData(HttpServletRequest request) { String user = (String) request.getAttribute("currentUser"); String role = (String) request.getAttribute("role"); if ("ADMIN".equals(role)) { return ResponseEntity.ok("Hello " user ", you have admin access!"); } else { return ResponseEntity.status(403).body("權限不足"); } }
安全建議
- 密鑰管理:不要在代碼中硬編碼密鑰,應使用環境變量或配置中心
- Token 過期時間:合理設置過期時間,敏感操作建議使用短時效Token
- 刷新Token :可配合refresh token 機制提升用戶體驗
- HTTPS :確保傳輸層安全,防止Token 被竊取
- 避免敏感信息:不要在JWT payload 中存放密碼等敏感數據
總結
使用JWT 在Java 中實現認證和授權並不復雜,核心是:
- 登錄成功後生成Token
- 客戶端攜帶Token 請求
- 服務端通過Filter 驗證Token 並提取用戶信息
- 根據角色實現授權控制
這套機制適合分佈式、微服務架構,避免了服務端存儲session 的開銷。
基本上就這些,不復雜但容易忽略細節,比如異常處理和密鑰安全。
以上是JWT的Java身份驗證和授權的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undress AI Tool
免費脫衣圖片

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)
![您目前尚未使用附上的顯示器[固定]](https://img.php.cn/upload/article/001/431/639/175553352135306.jpg?x-oss-process=image/resize,m_fill,h_207,w_330)
Ifyousee"YouarenotusingadisplayattachedtoanNVIDIAGPU,"ensureyourmonitorisconnectedtotheNVIDIAGPUport,configuredisplaysettingsinNVIDIAControlPanel,updatedriversusingDDUandcleaninstall,andsettheprimaryGPUtodiscreteinBIOS/UEFI.Restartaftereach

Java設計模式是解決常見軟件設計問題的可複用方案。 1.Singleton模式確保一個類只有一個實例,適用於數據庫連接池或配置管理;2.Factory模式解耦對象創建,通過工廠類統一生成對像如支付方式;3.Observer模式實現自動通知依賴對象,適合事件驅動系統如天氣更新;4.Strategy模式動態切換算法如排序策略,提升代碼靈活性。這些模式提高代碼可維護性與擴展性但應避免過度使用。

AdeadlockinJavaoccurswhentwoormorethreadsareblockedforever,eachwaitingforaresourceheldbytheother,typicallyduetocircularwaitcausedbyinconsistentlockordering;thiscanbepreventedbybreakingoneofthefournecessaryconditions—mutualexclusion,holdandwait,nopree

TheOilPaintfilterinPhotoshopisgreyedoutusuallybecauseofincompatibledocumentmodeorlayertype;ensureyou'reusingPhotoshopCS6orlaterinthefulldesktopversion,confirmtheimageisin8-bitperchannelandRGBcolormodebycheckingImage>Mode,andmakesureapixel-basedlay

Micronautisidealforbuildingcloud-nativeJavaapplicationsduetoitslowmemoryfootprint,faststartuptimes,andcompile-timedependencyinjection,makingitsuperiortotraditionalframeworkslikeSpringBootformicroservices,containers,andserverlessenvironments.1.Microna

runtheapplicationorcommandasadministratorByright-clickingandSelecting“ runasAdministrator” toensureeleeleeleeleviledprivilegesareAreDranted.2.checkuseracccountcontontrol(uac)uac)

理解JCA核心組件如MessageDigest、Cipher、KeyGenerator、SecureRandom、Signature、KeyStore等,它們通過提供者機制實現算法;2.使用SHA-256/SHA-512、AES(256位密鑰,GCM模式)、RSA(2048位以上)和SecureRandom等強算法與參數;3.避免硬編碼密鑰,使用KeyStore管理密鑰,並通過PBKDF2等安全派生密碼生成密鑰;4.禁用ECB模式,採用GCM等認證加密模式,每次加密使用唯一隨機IV,並及時清除敏
