JWT單點(diǎn)登錄實(shí)戰(zhàn):從原理到企業(yè)級(jí)安全認(rèn)證方案
如果你正在開(kāi)發(fā)多系統(tǒng)集成的企業(yè)應(yīng)用或者維護(hù)一個(gè)包含多個(gè)子站點(diǎn)的平臺(tái)那么單點(diǎn)登錄SSO一定是你繞不開(kāi)的技術(shù)話題。而 JWTJSON Web Token作為現(xiàn)代認(rèn)證方案的核心組件其重要性不言而喻。但很多開(kāi)發(fā)者對(duì) JWT 的理解停留在“生成 token、驗(yàn)證 token”的層面真正在單點(diǎn)登錄場(chǎng)景下部署時(shí)卻頻頻踩坑。這篇文章不會(huì)重復(fù)那些隨處可見(jiàn)的 JWT 概念介紹而是聚焦于一個(gè)核心問(wèn)題在真實(shí)的單點(diǎn)登錄系統(tǒng)中JWT 的認(rèn)證流程到底應(yīng)該如何設(shè)計(jì)才能兼顧安全、性能和可維護(hù)性我們將從單點(diǎn)登錄的業(yè)務(wù)場(chǎng)景出發(fā)拆解 JWT 在其中的關(guān)鍵作用并通過(guò)完整的代碼示例展示從登錄到鑒權(quán)的全流程。無(wú)論你是正在選型的技術(shù)負(fù)責(zé)人還是需要落地實(shí)現(xiàn)的開(kāi)發(fā)工程師都能從中獲得可直接復(fù)用的實(shí)踐方案。1. 這篇文章真正要解決的問(wèn)題單點(diǎn)登錄的本質(zhì)是一次登錄多處通行。想象一下你的公司有 OA 系統(tǒng)、CRM 系統(tǒng)、財(cái)務(wù)系統(tǒng)如果每個(gè)系統(tǒng)都需要單獨(dú)登錄員工每天要重復(fù)輸入多次賬號(hào)密碼體驗(yàn)極差。單點(diǎn)登錄解決了這個(gè)問(wèn)題但隨之而來(lái)的是認(rèn)證架構(gòu)的復(fù)雜性。JWT 在單點(diǎn)登錄中扮演著安全憑證的角色。它不像傳統(tǒng)的 Session 方案需要在服務(wù)端存儲(chǔ)登錄狀態(tài)而是通過(guò)加密的 Token 自包含用戶信息。這種無(wú)狀態(tài)特性非常適合分布式系統(tǒng)但也帶來(lái)了新的挑戰(zhàn)Token 安全性如何防止 Token 被竊取后濫用權(quán)限動(dòng)態(tài)更新用戶權(quán)限變更后如何讓已簽發(fā)的 Token 及時(shí)失效跨域認(rèn)證多個(gè)不同域名的系統(tǒng)間如何安全傳遞 Token性能與存儲(chǔ)如何在減少服務(wù)端存儲(chǔ)壓力的同時(shí)保證認(rèn)證效率本文將圍繞這些實(shí)際問(wèn)題給出基于 JWT 的單點(diǎn)登錄完整解決方案。如果你面臨以下場(chǎng)景這篇文章會(huì)特別有用正在從單體應(yīng)用向微服務(wù)架構(gòu)遷移需要統(tǒng)一的認(rèn)證方案現(xiàn)有系統(tǒng)認(rèn)證混亂希望引入標(biāo)準(zhǔn)的單點(diǎn)登錄機(jī)制對(duì) JWT 有基礎(chǔ)了解但在實(shí)際項(xiàng)目中遇到具體技術(shù)問(wèn)題2. 基礎(chǔ)概念與核心原理2.1 單點(diǎn)登錄SSO的本質(zhì)單點(diǎn)登錄不是一項(xiàng)具體的技術(shù)而是一種認(rèn)證架構(gòu)模式。其核心思想是集中認(rèn)證分布式授權(quán)。所有子系統(tǒng)共享同一個(gè)認(rèn)證中心用戶只需在認(rèn)證中心登錄一次即可訪問(wèn)所有相互信任的系統(tǒng)。傳統(tǒng) Session 方案的問(wèn)題在于每個(gè)子系統(tǒng)都需要維護(hù)自己的 Session 存儲(chǔ)跨域 Session 共享實(shí)現(xiàn)復(fù)雜服務(wù)端存儲(chǔ)壓力隨用戶量線性增長(zhǎng)而基于 Token 的 SSO 方案通過(guò)無(wú)狀態(tài)的認(rèn)證令牌解決了這些問(wèn)題。2.2 JWT 的結(jié)構(gòu)與工作原理JWT 由三部分組成用點(diǎn)號(hào)分隔Header.Payload.SignatureHeader頭部指定令牌類型和簽名算法{ alg: HS256, typ: JWT }Payload負(fù)載包含聲明用戶信息和其他元數(shù)據(jù){ sub: 1234567890, name: John Doe, iat: 1516239022, exp: 1516242622 }Signature簽名用于驗(yàn)證令牌完整性// 偽代碼示例 signature HMACSHA256( base64UrlEncode(header) . base64UrlEncode(payload), secret )JWT 的關(guān)鍵特性自包含所有必要信息都在 Token 中減少數(shù)據(jù)庫(kù)查詢可驗(yàn)證通過(guò)簽名確保內(nèi)容未被篡改無(wú)狀態(tài)服務(wù)端不需要存儲(chǔ)會(huì)話信息2.3 JWT 在 SSO 中的角色定位在單點(diǎn)登錄架構(gòu)中JWT 通常作為訪問(wèn)令牌Access Token使用。認(rèn)證中心負(fù)責(zé)簽發(fā) JWT各個(gè)子系統(tǒng)通過(guò)驗(yàn)證 JWT 簽名來(lái)確認(rèn)用戶身份。這種設(shè)計(jì)實(shí)現(xiàn)了認(rèn)證與業(yè)務(wù)的解耦。3. 環(huán)境準(zhǔn)備與前置條件3.1 技術(shù)棧選擇本文示例基于以下技術(shù)棧但核心思路適用于任何語(yǔ)言認(rèn)證中心Spring Boot 2.7 作為 SSO 服務(wù)器子系統(tǒng)Spring Boot 作為業(yè)務(wù)系統(tǒng)示例JWT 庫(kù)jjwt 0.11.5Java JWT 實(shí)現(xiàn)數(shù)據(jù)庫(kù)MySQL 8.0 用于用戶存儲(chǔ)可選演示用3.2 項(xiàng)目結(jié)構(gòu)規(guī)劃建議采用多模塊 Maven 項(xiàng)目sso-demo/ ├── sso-server/ # 認(rèn)證中心 ├── sso-client-a/ # 子系統(tǒng)A ├── sso-client-b/ # 子系統(tǒng)B └── common-jwt/ # JWT 工具類共享模塊3.3 依賴配置認(rèn)證中心 pom.xml 關(guān)鍵依賴dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdio.jsonwebtoken/groupId artifactIdjjwt-api/artifactId version0.11.5/version /dependency dependency groupIdio.jsonwebtoken/groupId artifactIdjjwt-impl/artifactId version0.11.5/version scoperuntime/scope /dependency dependency groupIdio.jsonwebtoken/groupId artifactIdjjwt-jackson/artifactId version0.11.5/version scoperuntime/scope /dependency /dependencies4. 核心流程拆解4.1 單點(diǎn)登錄的完整認(rèn)證流程基于 JWT 的單點(diǎn)登錄包含以下關(guān)鍵步驟未登錄訪問(wèn)用戶訪問(wèn)子系統(tǒng)A被重定向到認(rèn)證中心統(tǒng)一認(rèn)證用戶在認(rèn)證中心登錄生成 JWT令牌傳遞認(rèn)證中心重定向回子系統(tǒng)A攜帶 JWT令牌驗(yàn)證子系統(tǒng)A驗(yàn)證 JWT 簽名和有效期跨系統(tǒng)訪問(wèn)用戶訪問(wèn)子系統(tǒng)B攜帶 JWT 直接認(rèn)證4.2 JWT 的生命周期管理每個(gè) JWT 都有明確的生命周期生成用戶成功登錄后認(rèn)證中心簽發(fā)傳遞通過(guò) URL 參數(shù)、Cookie 或 Header 在系統(tǒng)間傳遞驗(yàn)證業(yè)務(wù)系統(tǒng)驗(yàn)證簽名、有效期和業(yè)務(wù)規(guī)則刷新接近過(guò)期時(shí)通過(guò)刷新令牌獲取新 Token失效過(guò)期或被加入黑名單后失效5. 完整示例與代碼實(shí)現(xiàn)5.1 JWT 工具類封裝首先創(chuàng)建通用的 JWT 工具類供認(rèn)證中心和子系統(tǒng)共用// 文件路徑common-jwt/src/main/java/com/example/sso/jwt/JwtUtil.java Component public class JwtUtil { private static final String SECRET_KEY your-256-bit-secret-change-in-production; private static final long EXPIRATION_TIME 3600000; // 1小時(shí) /** * 生成 JWT */ public String generateToken(UserDetails userDetails) { MapString, Object claims new HashMap(); claims.put(username, userDetails.getUsername()); claims.put(roles, userDetails.getAuthorities()); return Jwts.builder() .setClaims(claims) .setSubject(userDetails.getUsername()) .setIssuedAt(new Date(System.currentTimeMillis())) .setExpiration(new Date(System.currentTimeMillis() EXPIRATION_TIME)) .signWith(SignatureAlgorithm.HS256, SECRET_KEY) .compact(); } /** * 驗(yàn)證 JWT 并解析用戶信息 */ public UserDetails parseToken(String token) { try { Claims claims Jwts.parser() .setSigningKey(SECRET_KEY) .parseClaimsJws(token) .getBody(); String username claims.getSubject(); ListString roles (ListString) claims.get(roles); return new User(username, , roles.stream() .map(SimpleGrantedAuthority::new) .collect(Collectors.toList())); } catch (Exception e) { throw new RuntimeException(JWT 驗(yàn)證失敗, e); } } /** * 驗(yàn)證 Token 是否有效 */ public boolean validateToken(String token) { try { Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token); return true; } catch (Exception e) { return false; } } }5.2 認(rèn)證中心登錄接口認(rèn)證中心負(fù)責(zé)用戶認(rèn)證和 JWT 簽發(fā)// 文件路徑sso-server/src/main/java/com/example/sso/controller/AuthController.java RestController RequestMapping(/auth) public class AuthController { Autowired private JwtUtil jwtUtil; Autowired private UserService userService; /** * 用戶登錄接口 */ PostMapping(/login) public ResponseEntityLoginResponse login(RequestBody LoginRequest request) { // 1. 驗(yàn)證用戶名密碼 UserDetails userDetails userService.authenticate(request.getUsername(), request.getPassword()); // 2. 生成 JWT String token jwtUtil.generateToken(userDetails); // 3. 返回登錄結(jié)果 LoginResponse response new LoginResponse(); response.setToken(token); response.setExpiresIn(3600); response.setTokenType(Bearer); return ResponseEntity.ok(response); } /** * JWT 驗(yàn)證接口供子系統(tǒng)調(diào)用 */ PostMapping(/validate) public ResponseEntityValidationResponse validateToken(RequestParam String token) { boolean isValid jwtUtil.validateToken(token); ValidationResponse response new ValidationResponse(); response.setValid(isValid); if (isValid) { response.setUserDetails(jwtUtil.parseToken(token)); } return ResponseEntity.ok(response); } } // 登錄請(qǐng)求DTO Data class LoginRequest { private String username; private String password; } // 登錄響應(yīng)DTO Data class LoginResponse { private String token; private String tokenType; private Integer expiresIn; } // 驗(yàn)證響應(yīng)DTO Data class ValidationResponse { private boolean valid; private UserDetails userDetails; }5.3 子系統(tǒng) JWT 攔截器子系統(tǒng)需要攔截請(qǐng)求并驗(yàn)證 JWT// 文件路徑sso-client-a/src/main/java/com/example/client/config/JwtInterceptor.java Component public class JwtInterceptor implements HandlerInterceptor { Autowired private JwtUtil jwtUtil; Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 1. 從請(qǐng)求中獲取 Token String token getTokenFromRequest(request); if (token null) { // 重定向到認(rèn)證中心登錄頁(yè) redirectToSsoLogin(request, response); return false; } // 2. 驗(yàn)證 Token 有效性 if (!jwtUtil.validateToken(token)) { // Token 無(wú)效重新登錄 redirectToSsoLogin(request, response); return false; } // 3. 將用戶信息設(shè)置到請(qǐng)求上下文中 UserDetails userDetails jwtUtil.parseToken(token); request.setAttribute(currentUser, userDetails); return true; } private String getTokenFromRequest(HttpServletRequest request) { // 從 Header 獲取 String authHeader request.getHeader(Authorization); if (authHeader ! null authHeader.startsWith(Bearer )) { return authHeader.substring(7); } // 從 URL 參數(shù)獲取適用于重定向場(chǎng)景 String tokenParam request.getParameter(token); if (tokenParam ! null) { return tokenParam; } // 從 Cookie 獲取 Cookie[] cookies request.getCookies(); if (cookies ! null) { for (Cookie cookie : cookies) { if (jwt_token.equals(cookie.getName())) { return cookie.getValue(); } } } return null; } private void redirectToSsoLogin(HttpServletRequest request, HttpServletResponse response) throws IOException { String redirectUrl request.getRequestURL().toString(); String ssoLoginUrl http://sso-server:8080/auth/login?redirect URLEncoder.encode(redirectUrl, UTF-8); response.sendRedirect(ssoLoginUrl); } }5.4 攔截器配置注冊(cè)攔截器到 Spring MVC// 文件路徑sso-client-a/src/main/java/com/example/client/config/WebMvcConfig.java Configuration public class WebMvcConfig implements WebMvcConfigurer { Autowired private JwtInterceptor jwtInterceptor; Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(jwtInterceptor) .addPathPatterns(/**) .excludePathPatterns(/auth/callback, /static/**, /error); } }6. 運(yùn)行結(jié)果與效果驗(yàn)證6.1 啟動(dòng)服務(wù)驗(yàn)證啟動(dòng)認(rèn)證中心cd sso-server mvn spring-boot:run啟動(dòng)子系統(tǒng)Acd sso-client-a mvn spring-boot:run -Dserver.port8081訪問(wèn)子系統(tǒng) 在瀏覽器訪問(wèn)http://localhost:8081/dashboard應(yīng)該被重定向到認(rèn)證中心登錄頁(yè)。6.2 登錄流程驗(yàn)證提交登錄表單curl -X POST http://localhost:8080/auth/login \ -H Content-Type: application/json \ -d {username:admin,password:password}預(yù)期響應(yīng){ token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..., tokenType: Bearer, expiresIn: 3600 }使用 Token 訪問(wèn)受保護(hù)接口curl -X GET http://localhost:8081/api/user/profile \ -H Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...預(yù)期響應(yīng)用戶信息證明 JWT 驗(yàn)證成功。6.3 跨系統(tǒng)訪問(wèn)驗(yàn)證啟動(dòng)子系統(tǒng)Bcd sso-client-b mvn spring-boot:run -Dserver.port8082使用同一 Token 訪問(wèn)子系統(tǒng)Bcurl -X GET http://localhost:8082/api/orders \ -H Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...應(yīng)該能正常獲取訂單數(shù)據(jù)證明單點(diǎn)登錄生效。7. 常見(jiàn)問(wèn)題與排查思路問(wèn)題現(xiàn)象可能原因排查方式解決方案Token 驗(yàn)證失敗1. 密鑰不匹配2. Token 過(guò)期3. 簽名算法不一致1. 檢查認(rèn)證中心和子系統(tǒng)密鑰配置2. 查看 Token 過(guò)期時(shí)間3. 驗(yàn)證簽名算法配置1. 統(tǒng)一密鑰配置2. 調(diào)整 Token 有效期3. 固定使用相同算法重定向循環(huán)1. 攔截器配置錯(cuò)誤2. Token 獲取邏輯問(wèn)題1. 檢查排除路徑配置2. 調(diào)試 Token 提取邏輯1. 正確配置排除路徑2. 確?;卣{(diào)接口不被攔截跨域問(wèn)題1. 子系統(tǒng)域名不同2. CORS 配置缺失1. 檢查瀏覽器控制臺(tái)錯(cuò)誤2. 驗(yàn)證 CORS 配置1. 配置正確的 CORS 規(guī)則2. 使用代理或同域名部署Token 被盜用1. Token 傳輸未加密2. 缺乏刷新機(jī)制1. 檢查網(wǎng)絡(luò)傳輸安全2. 分析 Token 使用模式1. 強(qiáng)制使用 HTTPS2. 實(shí)現(xiàn) Token 刷新和黑名單7.1 典型錯(cuò)誤示例錯(cuò)誤在 Filter 中直接重定向// 錯(cuò)誤寫法 - 在 Filter 中重定向會(huì)導(dǎo)致問(wèn)題 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { if (!validateToken(token)) { ((HttpServletResponse) response).sendRedirect(/login); // 可能引發(fā)異常 return; } chain.doFilter(request, response); }正確使用異常處理重定向// 正確寫法 - 通過(guò)異常統(tǒng)一處理 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { try { if (!validateToken(token)) { throw new AuthenticationException(Token 驗(yàn)證失敗); } chain.doFilter(request, response); } catch (AuthenticationException e) { // 統(tǒng)一異常處理中處理重定向 handleAuthenticationFailure(request, response, e); } }8. 最佳實(shí)踐與工程建議8.1 安全增強(qiáng)措施1. 使用非對(duì)稱加密算法生產(chǎn)環(huán)境建議使用 RS256 等非對(duì)稱加密// 使用 RSA 非對(duì)稱加密 private static final PrivateKey privateKey // 從證書加載私鑰 private static final PublicKey publicKey // 從證書加載公鑰 public String generateToken(UserDetails userDetails) { return Jwts.builder() .setClaims(claims) .signWith(SignatureAlgorithm.RS256, privateKey) // 私鑰簽名 .compact(); } public boolean validateToken(String token) { return Jwts.parser() .setSigningKey(publicKey) // 公鑰驗(yàn)證 .parseClaimsJws(token); }2. 實(shí)現(xiàn) Token 刷新機(jī)制避免頻繁重新登錄// 刷新 Token 接口 PostMapping(/refresh) public ResponseEntityLoginResponse refreshToken(RequestParam String refreshToken) { // 驗(yàn)證刷新令牌有效性 if (!refreshTokenService.validate(refreshToken)) { throw new RuntimeException(刷新令牌無(wú)效); } // 生成新的訪問(wèn)令牌 String newAccessToken jwtUtil.generateToken(...); return ResponseEntity.ok(new LoginResponse(newAccessToken)); }8.2 性能優(yōu)化建議1. 減少 JWT 體積只存儲(chǔ)必要信息避免過(guò)度負(fù)載// 好的實(shí)踐 - 只存用戶ID和角色 claims.put(userId, user.getId()); claims.put(roles, user.getRoleCodes()); // 不是完整角色對(duì)象 // 避免的做法 - 存儲(chǔ)過(guò)多信息 claims.put(user, user); // 整個(gè)用戶對(duì)象序列化2. 實(shí)現(xiàn)本地驗(yàn)證緩存減少重復(fù)的簽名驗(yàn)證開(kāi)銷Component public class JwtCacheService { private final CacheString, UserDetails tokenCache Caffeine.newBuilder() .expireAfterWrite(10, TimeUnit.MINUTES) .maximumSize(10000) .build(); public UserDetails getCachedUser(String token) { return tokenCache.getIfPresent(token); } public void cacheUser(String token, UserDetails user) { tokenCache.put(token, user); } }8.3 生產(chǎn)環(huán)境配置1. 密鑰管理絕對(duì)不要將密鑰硬編碼在代碼中# application-prod.properties jwt.secret${JWT_SECRET_KEY:default-secret-change-in-production} jwt.expiration36002. 監(jiān)控與日志添加詳細(xì)的認(rèn)證日志Slf4j Component public class JwtUtil { public boolean validateToken(String token) { try { Jwts.parser().setSigningKey(secret).parseClaimsJws(token); log.info(JWT驗(yàn)證成功: {}, extractUsername(token)); return true; } catch (ExpiredJwtException e) { log.warn(JWT已過(guò)期: {}, e.getClaims().getSubject()); return false; } catch (Exception e) { log.error(JWT驗(yàn)證失敗: {}, e.getMessage()); return false; } } }9. 總結(jié)與后續(xù)學(xué)習(xí)方向本文詳細(xì)拆解了 JWT 在單點(diǎn)登錄系統(tǒng)中的完整認(rèn)證流程。關(guān)鍵要點(diǎn)總結(jié)架構(gòu)清晰認(rèn)證中心負(fù)責(zé)簽發(fā)子系統(tǒng)負(fù)責(zé)驗(yàn)證職責(zé)分離安全優(yōu)先使用合適的簽名算法管理好密鑰安全性能平衡在無(wú)狀態(tài)和緩存之間找到平衡點(diǎn)異常完備完善的錯(cuò)誤處理和日志記錄在實(shí)際項(xiàng)目中你還需要進(jìn)一步考慮擴(kuò)展學(xué)習(xí)方向OAuth 2.0 集成如何將 JWT SSO 與第三方登錄整合微服務(wù)架構(gòu)在 Spring Cloud Gateway 中統(tǒng)一處理 JWT 認(rèn)證權(quán)限細(xì)化基于 JWT 聲明實(shí)現(xiàn)更精細(xì)的權(quán)限控制安全加固防范 JWT 重放攻擊、注入攻擊等安全威脅實(shí)踐建議先從簡(jiǎn)單的內(nèi)部系統(tǒng)開(kāi)始實(shí)踐逐步擴(kuò)展到生產(chǎn)環(huán)境建立完善的 Token 監(jiān)控和告警機(jī)制定期進(jìn)行安全審計(jì)和密鑰輪換JWT 單點(diǎn)登錄是一個(gè)看似簡(jiǎn)單實(shí)則充滿細(xì)節(jié)的技術(shù)主題。希望本文的實(shí)踐方案能幫助你在實(shí)際項(xiàng)目中少走彎路構(gòu)建安全可靠的認(rèn)證系統(tǒng)。建議收藏本文在具體實(shí)施過(guò)程中參考對(duì)應(yīng)的代碼示例和排查指南。

相關(guān)新聞

電子煙霧化原理、健康風(fēng)險(xiǎn)與使用建議

電子煙霧化原理、健康風(fēng)險(xiǎn)與使用建議

1. 電子煙霧化原理與成分解析 電子煙通過(guò)電池供電加熱煙油產(chǎn)生氣溶膠,這個(gè)過(guò)程中涉及復(fù)雜的物理化學(xué)變化。與傳統(tǒng)燃燒型香煙不同,電子煙采用霧化技術(shù),將煙油轉(zhuǎn)化為可吸入的微小顆粒。但"水蒸氣"這個(gè)說(shuō)法具有嚴(yán)重誤導(dǎo)性,…

2026/8/1 17:41:48 閱讀更多
AI 寫的代碼 bug 都是批量的,我們用五道關(guān)口穩(wěn)住了交易核心系統(tǒng)

AI 寫的代碼 bug 都是批量的,我們用五道關(guān)口穩(wěn)住了交易核心系統(tǒng)

一次故障歸因會(huì)后,所有人都沉默了 上個(gè)月我們做了一件事,把過(guò)去半年的線上故障拉出來(lái)做了個(gè)完整歸因。 結(jié)果出來(lái)的那天,會(huì)議室里安靜了好幾秒。 不是故障數(shù)量有多嚇人。說(shuō)實(shí)話,故障數(shù)跟去年同期比差不多,甚至還略少一點(diǎn)…

2026/8/1 17:41:48 閱讀更多
LangChain4j權(quán)限管理實(shí)戰(zhàn):Java AI框架訪問(wèn)控制設(shè)計(jì)

LangChain4j權(quán)限管理實(shí)戰(zhàn):Java AI框架訪問(wèn)控制設(shè)計(jì)

1. 項(xiàng)目概述 今天我們來(lái)聊聊Java開(kāi)發(fā)中一個(gè)經(jīng)典面試題:如何在LangChain4j框架中實(shí)現(xiàn)訪問(wèn)控制和權(quán)限管理。這個(gè)問(wèn)題看似基礎(chǔ),實(shí)則涵蓋了現(xiàn)代分布式系統(tǒng)開(kāi)發(fā)中的核心安全機(jī)制設(shè)計(jì)。 LangChain4j作為Java生態(tài)中新興的AI應(yīng)用框架,其權(quán)限管理方案…

2026/8/1 17:41:48 閱讀更多
終極暗黑破壞神2存檔編輯器:5分鐘打造完美角色攻略

終極暗黑破壞神2存檔編輯器:5分鐘打造完美角色攻略

終極暗黑破壞神2存檔編輯器:5分鐘打造完美角色攻略 【免費(fèi)下載鏈接】d2s-editor 項(xiàng)目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 你是否曾經(jīng)為暗黑破壞神2中反復(fù)刷裝備而感到疲憊?是否希望自定義角色的屬性來(lái)體驗(yàn)不同的游戲玩法&#…

2026/8/1 18:31:50 閱讀更多
僅幾MB!Rust 開(kāi)源 Markdown 神器,專為 AI 設(shè)計(jì)

僅幾MB!Rust 開(kāi)源 Markdown 神器,專為 AI 設(shè)計(jì)

大家好,我是java1234_小鋒老師。 寫在前面 如果你經(jīng)常用 Claude、ChatGPT、Gemini 或者本地 AI 助手寫東西,大概率遇到過(guò)這種場(chǎng)景:項(xiàng)目里散落著一堆 .md 筆記,要發(fā)給 AI 時(shí)得一個(gè)個(gè)打開(kāi)、復(fù)制、粘貼,文件名和路徑還亂…

2026/8/1 18:31:50 閱讀更多
Joplin開(kāi)源筆記應(yīng)用:5步搭建完整跨平臺(tái)開(kāi)發(fā)環(huán)境實(shí)戰(zhàn)指南

Joplin開(kāi)源筆記應(yīng)用:5步搭建完整跨平臺(tái)開(kāi)發(fā)環(huán)境實(shí)戰(zhàn)指南

Joplin開(kāi)源筆記應(yīng)用:5步搭建完整跨平臺(tái)開(kāi)發(fā)環(huán)境實(shí)戰(zhàn)指南 【免費(fèi)下載鏈接】joplin Joplin - the privacy-focused note taking app with sync capabilities for Windows, macOS, Linux, Android and iOS. 項(xiàng)目地址: https://gitcode.com/GitHub_Trending/jo/joplin…

2026/8/1 18:31:50 閱讀更多
AI副業(yè)者90%毀于“隱形品牌破產(chǎn)”:3個(gè)信號(hào)自查+48小時(shí)內(nèi)可落地的品牌信用修復(fù)協(xié)議

AI副業(yè)者90%毀于“隱形品牌破產(chǎn)”:3個(gè)信號(hào)自查+48小時(shí)內(nèi)可落地的品牌信用修復(fù)協(xié)議

更多請(qǐng)點(diǎn)擊: https://kaifayun.com 第一章:AI副業(yè)者品牌建設(shè)的底層邏輯與危機(jī)本質(zhì) AI副業(yè)者并非技術(shù)能力的簡(jiǎn)單延伸,而是認(rèn)知杠桿、信任資產(chǎn)與價(jià)值交付三重系統(tǒng)的動(dòng)態(tài)耦合。當(dāng)個(gè)體將模型調(diào)用、提示工程或自動(dòng)化腳本作為服務(wù)入口時(shí)&#xff0…

2026/8/1 18:31:50 閱讀更多
海山數(shù)據(jù)庫(kù)(HaishanDB)面向醫(yī)保影像云場(chǎng)景技術(shù)方案

海山數(shù)據(jù)庫(kù)(HaishanDB)面向醫(yī)保影像云場(chǎng)景技術(shù)方案

一、場(chǎng)景總覽匹配定位醫(yī)保影像云數(shù)據(jù)庫(kù)核心壓力:DICOM 四級(jí)元數(shù)據(jù) OLTP 寫入、醫(yī)生實(shí)時(shí)閱片高并發(fā)查詢、醫(yī)?;伺?OLAP 分析混合負(fù)載、多醫(yī)療機(jī)構(gòu)租戶隔離、15~30 年長(zhǎng)周期冷熱數(shù)據(jù)治理、醫(yī)療敏感數(shù)據(jù)強(qiáng)合規(guī)。 HaishanDB 基于 PG 內(nèi)核深度自研,100% …

2026/8/1 18:21:49 閱讀更多
AMAT 0100-02186 I/O 分配 PCB

AMAT 0100-02186 I/O 分配 PCB

AMAT 0100-02186 I/O分配PCB板是應(yīng)用材料(Applied Materials)公司生產(chǎn)的一款用于半導(dǎo)體設(shè)備的I/O信號(hào)分配電路板。該型號(hào)(0100-02186)的核心特點(diǎn)如下:專用于Endura等半導(dǎo)體工藝腔室。集成信號(hào)路由與分配功能。連接控制…

2026/8/1 0:09:33 閱讀更多
Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動(dòng)機(jī)

Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動(dòng)機(jī)

Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動(dòng)機(jī)是日本日清(Nissei)品牌的一款工業(yè)用三相異步電機(jī),適用于自動(dòng)化設(shè)備及通用機(jī)械驅(qū)動(dòng)。該型號(hào)(FFMN-32L-10-T0 40AX)的核心特點(diǎn)如下:三相交流異步電動(dòng)機(jī)。額定…

2026/8/1 0:09:33 閱讀更多
AMAT 0100-02186 I/O 分配 PCB

AMAT 0100-02186 I/O 分配 PCB

AMAT 0100-02186 I/O分配PCB板是應(yīng)用材料(Applied Materials)公司生產(chǎn)的一款用于半導(dǎo)體設(shè)備的I/O信號(hào)分配電路板。該型號(hào)(0100-02186)的核心特點(diǎn)如下:專用于Endura等半導(dǎo)體工藝腔室。集成信號(hào)路由與分配功能。連接控制…

2026/8/1 0:09:33 閱讀更多
Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動(dòng)機(jī)

Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動(dòng)機(jī)

Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動(dòng)機(jī)是日本日清(Nissei)品牌的一款工業(yè)用三相異步電機(jī),適用于自動(dòng)化設(shè)備及通用機(jī)械驅(qū)動(dòng)。該型號(hào)(FFMN-32L-10-T0 40AX)的核心特點(diǎn)如下:三相交流異步電動(dòng)機(jī)。額定…

2026/8/1 0:09:33 閱讀更多