亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

深耕商務建站與企業(yè)官網(wǎng)運營的一線實戰(zhàn)洞察。

企業(yè)級登錄全流程設計:認證授權、會話管理與安全防護實踐

企業(yè)級登錄全流程設計:認證授權、會話管理與安全防護實踐 1. 從零搭建企業(yè)級登錄先搞清楚我們在解決什么問題登錄這個功能單看好像就是“輸入賬號密碼、點一下按鈕”這么簡單但一旦放到企業(yè)級場景里它立刻變成整個系統(tǒng)中最敏感、最容易出事故、也最容易被攻擊者盯上的模塊。我見過太多項目在聯(lián)調階段才發(fā)現(xiàn)登錄流程設計得支離破碎有的把會話狀態(tài)塞進本地存儲被腳本一鍋端有的密碼校驗邏輯寫得比業(yè)務代碼還隨意還有的登錄接口被刷到數(shù)據(jù)庫連接池直接打滿。這些問題如果能在動手寫代碼之前把整體流程想清楚大部分都能提前規(guī)避。先說清楚一個概念企業(yè)級用戶登錄指的是面向企業(yè)內部員工、外部合作方、或者大規(guī)模C端用戶的統(tǒng)一身份認證入口。它和“小網(wǎng)站搞個session存一下用戶ID”最大的區(qū)別在于企業(yè)級登錄要考慮的不只是“怎么驗證密碼”還要考慮多端兼容、會話安全、單點登錄SSO、權限隔離、審計追蹤、防暴力破解、高可用部署這樣一整套體系。換句話說登錄不是一個“功能點”而是一條完整的安全鏈路。這篇文章我會從方案選型、核心代碼實現(xiàn)、踩坑記錄、到線上排查技巧完整走一遍企業(yè)級登錄流程的設計與落地。如果你正在做企業(yè)內部系統(tǒng)、SaaS平臺、或者任何對安全要求比較高的Web應用這篇文章應該能幫你少走不少彎路。我會盡量把原理講透代碼部分也會給到可以直接改改就用的程度。2. 整體方案設計為什么我選擇了這套登錄架構2.1 核心需求拆解登錄不只是校驗密碼動手設計之前我習慣先把需求拆成四個維度認證Authentication、授權Authorization、會話管理Session Management、審計Audit。這四個詞聽起來很像但實際是四件完全不同的事。認證解決的是“你是誰”的問題常見手段就是賬號密碼、短信驗證碼、掃碼登錄、OAuth第三方授權授權解決的是“你能干什么”的問題比如登錄之后能訪問哪些菜單、哪些接口會話管理解決的是“怎么維持登錄狀態(tài)”的問題包括Token怎么發(fā)、怎么存、怎么續(xù)期、怎么失效審計解決的是“出了問題怎么追溯”的問題包括登錄日志、操作日志、異常行為記錄。很多項目的登錄模塊做得不好根本原因就是把這四個維度混在了一起。比如有的團隊把用戶的權限列表直接塞進JWT里美其名曰“無狀態(tài)設計”結果權限一改Token還得等過期才生效有的團隊把會話存在內存里服務一重啟全部用戶掉線。所以我做方案設計的第一步就是先把這四個維度分開畫清楚再決定每部分用什么技術承載。2.2 方案選型從Session到JWT再到混合方案登錄會話方案的主流選項大致有三類傳統(tǒng)Session、純JWT、以及Session JWT混合。我分別說下它們的適用場景和坑。傳統(tǒng)Session方案服務端把會話ID種在Cookie里用戶信息存服務端內存或Redis。優(yōu)點是實現(xiàn)簡單、服務端可控性強、想踢誰踢誰缺點是分布式環(huán)境下要解決Session共享問題而且Cookie在跨域場景下比較麻煩。這個方案適合傳統(tǒng)服務端渲染的Web應用比如企業(yè)內部管理后臺。純JWT方案服務端把用戶信息簽進Token里客戶端保存Token每次請求帶上來。優(yōu)點是天然適合前后端分離和移動端服務端不需要存會話狀態(tài)擴展性好缺點是Token沒法主動失效除非引入黑名單機制而且如果往Token里塞太多東西請求頭會變得很大。這個方案適合開放API平臺、多端共用的服務。我實際項目里用得最多的是第三種混合方案。登錄成功后簽發(fā)短期JWT作為訪問憑證同時把刷新令牌Refresh Token存在Redis里有效期設置得長一些。短期Token過期后客戶端用刷新令牌換新Token。這樣既保留了JWT適合多端、擴展性好的優(yōu)點又通過刷新令牌的Redis存儲實現(xiàn)了“可控的登錄狀態(tài)”——管理員可以刪除Redis里的刷新令牌達到強制下線效果。提示純JWT不是說不能用但它在企業(yè)級場景里有一個很尷尬的問題你沒辦法在服務端把已經(jīng)發(fā)出的Token作廢。如果遇到安全事件需要緊急踢掉所有在線用戶純JWT方案得靠改密鑰才能實現(xiàn)那代價就太大了。2.3 為什么企業(yè)級登錄必須做“多因子”設計我說的多因子不是指一定要上短信或者掃碼而是說至少要有兩層驗證邏輯。第一層是“你知道什么”也就是賬號密碼第二層我建議至少做到“你擁有什么”比如手機驗證碼、或者已經(jīng)綁定過的設備信息。對于后臺管理類系統(tǒng)這一步幾乎是必須的。有一次我負責給一個內部運營平臺加登錄功能一開始只做了賬號密碼上線第二天就有同事反饋說自己密碼被改了。查日志發(fā)現(xiàn)是有人拿弱口令字典在掃登錄接口剛好掃中了幾個用生日當密碼的賬號。后來我上了登錄失敗次數(shù)限制、密碼復雜度策略、以及二次驗證才把這個口子堵住。這里的教訓是企業(yè)級系統(tǒng)的登錄入口永遠默認被攻擊者盯著安全設計不是“要不要做”的問題而是“怎么做才不拖累體驗”的問題。3. 核心代碼實現(xiàn)一套可以落地的登錄流程3.1 技術棧說明我用Java技術棧做示例原因很簡單企業(yè)級后端項目Java的占比依然很高Spring Boot Spring Security Redis這套組合在業(yè)界非常成熟。但本文講的流程設計思路是完全語言無關的你用Node.js、Python、Go也能對應落地。Spring Boot 2.7.xSpring SecurityJWTjjwt 0.11.5RedisSpring Data RedisMyBatis-Plus用于查詢用戶信息可替換成任何ORM密碼加密BCrypt3.2 表結構設計用戶的密碼不該出現(xiàn)在用戶表里先看表結構。很多新手會直接把密碼字段放在用戶表里這在企業(yè)級設計里是不推薦的。我習慣把“賬號信息”和“身份憑證”分開存儲這樣后續(xù)如果需要支持多種登錄方式——密碼登錄、短信登錄、企業(yè)微信掃碼登錄——擴展起來不會動用戶主表。-- 用戶基礎表 CREATE TABLE sys_user ( id BIGINT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(64) NOT NULL UNIQUE, real_name VARCHAR(64), status TINYINT NOT NULL DEFAULT 1 COMMENT 1:啟用 0:禁用, create_time DATETIME DEFAULT CURRENT_TIMESTAMP, update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ); -- 用戶憑據(jù)表存密碼、上次修改時間等信息 CREATE TABLE sys_user_credential ( id BIGINT PRIMARY KEY AUTO_INCREMENT, user_id BIGINT NOT NULL, credential_type VARCHAR(16) NOT NULL DEFAULT PASSWORD, password_hash VARCHAR(256) NOT NULL, last_reset_time DATETIME, failed_attempts INT DEFAULT 0, lock_until DATETIME, create_time DATETIME DEFAULT CURRENT_TIMESTAMP, update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, UNIQUE KEY uk_user_type (user_id, credential_type) );這兩個表的關系是一對多一個用戶可以有多種類型的憑證。密碼只存BCrypt加過密的哈希值不存明文這一點沒有任何商量余地。BCrypt是自適應哈希算法可以調節(jié)計算成本暴力破解的代價非常高比MD5、SHA-256這類純哈希方案安全很多。3.3 登錄接口實現(xiàn)從校驗到發(fā)Token的完整鏈路登錄接口的核心邏輯分六步我一個個拆開講。第一步參數(shù)校驗。接收用戶名、密碼、驗證碼如果有先做基礎格式校驗比如用戶名不能含特殊字符、密碼不能為空、驗證碼是否正確。驗證碼的校驗要放在密碼校驗之前這樣可以把大部分自動化攻擊擋在密碼校驗之外減少密碼哈希的計算消耗。第二步查詢用戶。根據(jù)用戶名查用戶主表查不到就直接返回“用戶名或密碼錯誤”——這里注意千萬不能提示“用戶不存在”否則攻擊者就能通過接口批量探測哪些賬號是真實存在的。第三步校驗用戶狀態(tài)。用戶狀態(tài)為禁用、已鎖定、已刪除都直接拒絕登錄。這一步要在密碼校驗之前做因為密碼校驗更昂貴而且對已禁用用戶做密碼校驗也沒有意義。第四步校驗密碼。用BCrypt的matches方法比對明文密碼和哈希值。失敗則記錄失敗次數(shù)連續(xù)失敗達到閾值就鎖定賬號一段時間。第五步簽發(fā)Token。密碼校驗通過后生成訪問Token和刷新Token。第六步記錄登錄日志返回Token給前端。核心代碼我用Spring Security的Filter鏈來實現(xiàn)但為了展示完整邏輯先寫出最直白的Controller版本方便理解每一步。RestController public class AuthController { Autowired private UserService userService; Autowired private TokenService tokenService; Autowired private LoginLogService loginLogService; PostMapping(/api/auth/login) public ResponseEntityLoginResponse login(RequestBody Valid LoginRequest request) { // 第一步基礎校驗由 Valid 注解完成這里省略 // 第二步查詢用戶 User user userService.findByUsername(request.getUsername()); if (user null) { throw new BusinessException(用戶名或密碼錯誤); } // 第三步用戶狀態(tài)校驗 if (user.getStatus() 0) { throw new BusinessException(賬號已被禁用請聯(lián)系管理員); } // 第四步密碼校驗 Credential credential userService.findCredential(user.getId()); if (credential null || !PasswordUtil.matches(request.getPassword(), credential.getPasswordHash())) { handleLoginFailure(request.getUsername()); throw new BusinessException(用戶名或密碼錯誤); } // 檢查是否鎖定 if (credential.getLockUntil() ! null credential.getLockUntil().isAfter(LocalDateTime.now())) { throw new BusinessException(賬號已鎖定請稍后再試); } // 第五步簽發(fā)Token TokenPair tokenPair tokenService.createTokenPair(user.getId(), request.getLoginDevice()); // 第六步記錄日志 loginLogService.recordLogin(user.getId(), request.getUsername(), LoginResult.SUCCESS, RequestUtil.getClientIp()); return ResponseEntity.ok(new LoginResponse( tokenPair.getAccessToken(), tokenPair.getRefreshToken(), tokenPair.getExpiresIn())); } }這里有個非常重要的細節(jié)密碼錯誤和用戶不存在時返回給前端的提示文案要完全一樣統(tǒng)一為“用戶名或密碼錯誤”。這是登錄接口防用戶枚舉的標準做法。你可以自己建個測試賬號故意輸錯密碼和故意輸錯用戶名看返回信息是否一致如果一致說明這個接口在信息泄露層面是安全的。BCrypt匹配的代碼很簡單但我想特別說下它內部做了什么。BCrypt匹配過程不只是簡單地做一次哈希比較它會從存儲的哈希串里解析出鹽值和代價因子然后用相同的鹽值重新計算輸入的密碼最后再比較結果。代價因子越高單次計算耗時越長暴力破解的成本就越高。我給內部系統(tǒng)配置的代價因子是10大約耗時100毫秒左右如果是面向用戶的C端系統(tǒng)建議配到12雖然登錄會慢一點點但安全性提升明顯。3.4 令牌發(fā)放與刷新JWT Redis的混合會話方案接下來是令牌部分這也是整個登錄流程里我最想重點講的環(huán)節(jié)。訪問Token我習慣設置15分鐘有效期刷新Token設置7天有效期刷新Token存在Redis里Key的格式是refresh:token:{userId}:{jti}Value存的是刷新Token本身的哈希值同時設置過期時間。這樣做有三個好處。第一訪問Token短命即使被竊取攻擊者能利用的時間窗口很短第二刷新Token存在服務端管理員可以刪除Redis中的Key來實現(xiàn)強制下線第三刷新Token用jtiJWT ID作為標識每次刷新可以旋轉令牌舊令牌直接失效能有效防止Token重放。TokenService的核心代碼如下Service public class TokenService { Value(${jwt.access-token-expire}) private long accessTokenExpire; // 毫秒默認 90000015分鐘 Value(${jwt.refresh-token-expire}) private long refreshTokenExpire; // 毫秒默認 6048000007天 Autowired private StringRedisTemplate redisTemplate; private static final String REFRESH_KEY_PREFIX refresh:token:; public TokenPair createTokenPair(Long userId, String device) { // 生成訪問Token String accessToken createAccessToken(userId, device); // 生成刷新Token String refreshToken createRefreshToken(userId, device); return new TokenPair(accessToken, refreshToken, accessTokenExpire); } private String createAccessToken(Long userId, String device) { long now System.currentTimeMillis(); return Jwts.builder() .setSubject(String.valueOf(userId)) .claim(device, device) .setIssuer(your-system) .setIssuedAt(new Date(now)) .setExpiration(new Date(now accessTokenExpire)) .signWith(SignatureAlgorithm.HS256, secretKey) .compact(); } private String createRefreshToken(Long userId, String device) { String jti UUID.randomUUID().toString().replace(-, ); long now System.currentTimeMillis(); String refreshToken Jwts.builder() .setSubject(String.valueOf(userId)) .setId(jti) .claim(device, device) .setIssuer(your-system) .setIssuedAt(new Date(now)) .setExpiration(new Date(now refreshTokenExpire)) .signWith(SignatureAlgorithm.HS256, secretKey) .compact(); // 刷新Token存入Redis String redisKey REFRESH_KEY_PREFIX userId : jti; // 只存哈希值不存完整Token減少Redis內存占用 redisTemplate.opsForValue().set(redisKey, DigestUtils.sha256Hex(refreshToken), refreshTokenExpire, TimeUnit.MILLISECONDS); return refreshToken; } public RefreshResult refreshAccessToken(String oldRefreshToken) { // 解析舊刷新Token Claims claims; try { claims Jwts.parserBuilder() .setSigningKey(secretKey) .build() .parseClaimsJws(oldRefreshToken) .getBody(); } catch (JwtException e) { throw new BusinessException(登錄狀態(tài)已過期請重新登錄); } String userId claims.getSubject(); String jti claims.getId(); String device claims.get(device, String.class); // 校驗Redis中的刷新Token是否匹配 String redisKey REFRESH_KEY_PREFIX userId : jti; String storedHash redisTemplate.opsForValue().get(redisKey); if (storedHash null || !storedHash.equals(DigestUtils.sha256Hex(oldRefreshToken))) { throw new BusinessException(登錄狀態(tài)已過期請重新登錄); } // 旋轉刷新Token刪除舊Key生成新Token對 redisTemplate.delete(redisKey); TokenPair newTokenPair createTokenPair(Long.parseLong(userId), device); return new RefreshResult(newTokenPair.getAccessToken(), newTokenPair.getRefreshToken(), newTokenPair.getAccessExpiresIn()); } public void revokeByUserId(Long userId) { // 管理員強制下線刪除該用戶所有刷新Token SetString keys redisTemplate.keys(REFRESH_KEY_PREFIX userId :*); if (keys ! null !keys.isEmpty()) { redisTemplate.delete(keys); } } }刷新接口的邏輯很簡單前端拿到401響應后帶上刷新Token請求/api/auth/refresh服務端驗證刷新Token有效且Redis中有對應記錄然后刪除舊刷新Token生成新的一對Token返回。這里有一個細節(jié)刷新接口本身也要做防盜用處理我要求前端必須在每次刷新時把舊刷新Token從本地移除并立即替換為新Token。如果檢測到同一個刷新Token被使用了兩次說明可能存在Token被竊取的風險我會把該用戶名下所有的刷新Token全部作廢并要求重新登錄。注意生產(chǎn)環(huán)境里令牌接口必須走HTTPS否則Token在傳輸過程中被截獲前面做的一切安全工作都等于零。這一點不需要討論是強制要求。3.5 密碼加密與校驗BCrypt為什么是默認選擇密碼存儲方式在企業(yè)級登錄里是一個永恒的話題。我見過有人用MD5加鹽來存儲也見過直接明文存儲的“事故現(xiàn)場”——那種系統(tǒng)的審計報告我甚至不敢仔細看。這里我直接給結論新系統(tǒng)一律用BCrypt舊系統(tǒng)從MD5遷移到BCrypt的方案我也在下面的坑點里詳細說明。BCrypt的核心特點有三個。第一內置鹽值。每次加密都生成隨機鹽值同樣的密碼兩次加密的結果不一樣所以攻擊者無法通過彩虹表直接破解。第二計算成本可調。通過代價因子cost factor控制哈希計算次數(shù)代價因子每加1計算時間大約翻倍。第三自帶格式。BCrypt的哈希字符串形如$2a$10$7EqJtq8hPqXfYvLbI5Xh0u...其中$2a是算法標識10是代價因子后面是鹽值和哈希值。BCrypt的使用代碼public class PasswordUtil { // 加密 public static String encode(String rawPassword) { return BCrypt.hashpw(rawPassword, BCrypt.gensalt(10)); } // 校驗 public static boolean matches(String rawPassword, String encodedPassword) { return BCrypt.checkpw(rawPassword, encodedPassword); } }使用時的注意點BCrypt有輸入長度限制超過72字節(jié)的密碼會被截斷所以業(yè)務上要限制密碼最大長度。另外如果你的系統(tǒng)需要從MD5或SHA-256遷移到BCrypt不能簡單地把舊哈希直接換成BCrypt——用戶下次登錄時需要能校驗舊密碼同時又能無縫升級。我常用的方案是給用戶憑據(jù)表加一個credential_version字段舊用戶是V1用MD5校驗首次用V1版本密碼成功登錄后立刻把密碼重新用BCrypt加密同時把版本改為V2后續(xù)登錄走V2校驗。這樣用戶無感知地完成了密碼存儲升級不需要讓所有人都重置密碼。4. 登錄鏈路中的安全防護細節(jié)那些看不見的攻防4.1 暴力破解防護不只是限制失敗次數(shù)暴力破解防護只做“失敗次數(shù)鎖定”是遠遠不夠的。攻擊者如果控制了一批代理IP或者借用分布式節(jié)點來攻擊單純按IP限流很容易被繞過。更靠譜的做法是分層防護。第一層驗證碼。登錄頁的圖形驗證碼或滑塊驗證碼在前端發(fā)起登錄請求時必須攜帶。服務端校驗驗證碼通過后才繼續(xù)走賬號密碼校驗。驗證碼可以放在Redis里5分鐘有效一次性使用。第二層賬號維度限制。同一賬號連續(xù)失敗5次鎖定15分鐘鎖定時間隨失敗次數(shù)遞增比如第6到第10次失敗鎖30分鐘超過10次鎖24小時。這個策略要把攻擊者的成本抬得足夠高又不至于影響正常用戶。第三層IP維度的頻率限制。同一IP在單位時間內的登錄請求次數(shù)超過閾值就拒絕比如每分鐘不超過30次每小時不超過100次。具體閾值要根據(jù)你系統(tǒng)的實際用戶量調整核心是防止集中的自動化請求。防暴力破解的核心代碼Aspect Component public class LoginAttemptAspect { Autowired private StringRedisTemplate redisTemplate; // 賬號失敗鎖定Key private static final String ACCOUNT_FAIL_KEY login:fail:account:; // IP失敗鎖定Key private static final String IP_FAIL_KEY login:fail:ip:; public void recordFailure(String username, String ip) { // 賬號維度 String accountKey ACCOUNT_FAIL_KEY username; Long accountCount redisTemplate.opsForValue().increment(accountKey); if (accountCount ! null accountCount 1) { redisTemplate.expire(accountKey, 15, TimeUnit.MINUTES); } if (accountCount 5) { // 鎖定賬號15分鐘 String lockKey login:lock:account: username; redisTemplate.opsForValue().set(lockKey, 1, 15, TimeUnit.MINUTES); } // IP維度 String ipKey IP_FAIL_KEY ip; Long ipCount redisTemplate.opsForValue().increment(ipKey); if (ipCount ! null ipCount 1) { redisTemplate.expire(ipKey, 1, TimeUnit.MINUTES); } if (ipCount 30) { // 該IP臨時拒絕登錄 String ipBlockKey login:block:ip: ip; redisTemplate.opsForValue().set(ipBlockKey, 1, 5, TimeUnit.MINUTES); } } }這套方案在我維護過的系統(tǒng)里跑了兩三年效果很穩(wěn)定。有個值得注意的細節(jié)失敗次數(shù)計數(shù)器在Redis里要設置過期時間不能全程累計。否則正常用戶可能在連續(xù)幾天內偶爾輸錯幾次密碼就被累計到鎖定閾值體驗很差。4.2 登錄態(tài)安全防固定會話攻擊與Token泄露登錄態(tài)安全還有一個容易忽略的點固定會話攻擊。攻擊者可以先在自己瀏覽器里登錄一個合法賬號拿到一個有效的會話ID然后誘導受害者使用這個會話ID去登錄。如果系統(tǒng)在登錄成功后沒有更換會話ID攻擊者就能用同一個會話ID冒充受害者。JWT方案同樣存在這個問題所以我在登錄成功后簽發(fā)的Token里會帶一個隨機字符串jti并確保每次登錄都重新生成不同設備、不同會話之間互相獨立。還有一個和業(yè)務強相關的細節(jié)賬號同時多端登錄怎么處理。有的系統(tǒng)要求一個人只能同時在一個設備上登錄新的登錄會踢掉舊的有的系統(tǒng)允許多端共存但要做設備管理列表。我建議做設備管理查登錄日志時能清晰看到“哪個用戶、什么時間、用什么設備登錄”這在安全審計時非常重要。我的實現(xiàn)是在刷新Token里加入設備標識登錄時前端傳入設備編號不傳則根據(jù)User-Agent生成唯一標識。記錄設備信息不是為了炫技而是為了讓用戶能在“賬號安全中心”里看到自己的登錄設備列表一旦發(fā)現(xiàn)陌生設備可以直接踢下線。4.3 登錄日志與審計出了事拿得出數(shù)據(jù)登錄日志這塊很多團隊會拖到出安全事故后才想起來補。但企業(yè)級系統(tǒng)的登錄入口我一定會在設計階段就把審計日志做進去。登錄日志至少需要包含這些字段用戶ID、用戶名、登錄時間、登錄IP、設備信息、登錄結果成功/失敗、失敗原因。我的日志表設計如下CREATE TABLE sys_login_log ( id BIGINT PRIMARY KEY AUTO_INCREMENT, user_id BIGINT, username VARCHAR(64), login_ip VARCHAR(64), device_info VARCHAR(256), user_agent VARCHAR(512), login_result TINYINT COMMENT 1:成功 2:密碼錯誤 3:賬號鎖定 4:驗證碼錯誤, fail_reason VARCHAR(128), login_time DATETIME, INDEX idx_user_time (user_id, login_time), INDEX idx_ip_time (login_ip, login_time) );寫日志的時機要選好成功日志在Token簽發(fā)后記錄失敗日志在每一步失敗分支里記錄。日志的數(shù)據(jù)量會增長很快我建議按天做分區(qū)保留最近90天超過時間的歸檔到冷存儲。審計日志絕對不能只存在應用服務器本地磁盤要統(tǒng)一匯總到日志中心否則服務器一旦重新部署數(shù)據(jù)就丟了。我個人在實際排查問題時發(fā)現(xiàn)用戶忘記密碼是最常見的工單類型。有了登錄日志客服可以直接看到用戶是不是被鎖定、鎖定時間到什么時候能很快判斷是攻擊導致的鎖定還是用戶自己輸錯太多次。這個價值在實際運維中非常明顯。5. 實操過程記錄從零搭建到線上穩(wěn)定運行5.1 環(huán)境準備我這邊使用的環(huán)境是一臺4核8G的開發(fā)機安裝CentOS 7系統(tǒng)、Docker、MySQL 8.0、Redis 6.0。企業(yè)級登錄模塊的開發(fā)和部署我建議至少把MySQL和Redis用Docker單獨跑起來方便重置環(huán)境。簡單貼一下啟動命令# 啟動MySQL docker run -d --name mysql8 \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORDyourpassword \ -e MYSQL_DATABASEenterprise_auth \ mysql:8.0 # 啟動Redis docker run -d --name redis6 \ -p 6379:6379 \ redis:6.0 --requirepass yourredispassword表結構按照上面的SQL建好之后插入一個測試賬號INSERT INTO sys_user (username, real_name) VALUES (tester, 測試用戶); INSERT INTO sys_user_credential (user_id, credential_type, password_hash) VALUES (1, PASSWORD, $2a$10$...); -- 用BCrypt加密后的值5.2 登錄接口調試過程我習慣用Postman做初步調試。登錄接口的請求體{ username: tester, password: Test123456, captcha: 8F2A }調試時重點關注三個響應登錄成功的200響應、密碼錯誤的401響應、賬號鎖定的403響應。響應體里的錯誤碼要設計清楚前端才能根據(jù)不同錯誤類型給出不同提示。我常用的錯誤碼定義是1001驗證碼錯誤1002用戶名或密碼錯誤1003賬號已鎖定1004賬號已禁用1005登錄狀態(tài)已過期前端根據(jù)錯誤碼提示相應文案而不是直接把后端的錯誤信息透出。這里有一個細節(jié)后端的錯誤信息盡量別給前端展示統(tǒng)一轉成錯誤碼否則會存在信息泄露風險也容易被攻擊者利用細節(jié)來枚舉用戶狀態(tài)。5.3 配置Spring Security放行登錄接口Spring Security默認會攔截所有請求登錄接口本身要放行但刷新接口不能直接放行——刷新接口要單獨走一套校驗邏輯。我的配置思路是Configuration EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable() .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and() .authorizeRequests() .antMatchers(/api/auth/login).permitAll() // 登錄接口放行 .antMatchers(/api/auth/captcha).permitAll() // 驗證碼接口放行 .anyRequest().authenticated() .and() .addFilterBefore(jwtAuthFilter, UsernamePasswordAuthenticationFilter.class); } }JWT過濾器的邏輯是從請求頭Authorization里取Token解析成功就向SecurityContext寫入認證信息解析失敗則返回401。過濾器的代碼不復雜但有一個細節(jié)Token過期返回的401和未攜帶Token返回的401響應體的錯誤碼要一致不能給攻擊者區(qū)分“這個接口需要登錄”和“這個Token剛好過期”的機會。5.4 前端登錄流程對接前端拿到Token后的存儲位置我這里直接給出結論訪問Token只能放在內存里刷新Token放在HttpOnly Cookie里。如果前端把兩個Token都放進localStorage一旦出現(xiàn)跨站腳本漏洞Token會整個被偷走。放在HttpOnly Cookie里的刷新Token腳本拿不到安全級別高很多。我設計的前端登錄對接邏輯是頁面加載時先嘗試用刷新Token靜默換取訪問Token換不到就跳轉登錄頁登錄頁成功后拿到訪問Token刷新Token通過Set-Cookie種入。每次請求時攜帶訪問Token收到401時嘗試刷新刷新成功則重放原請求刷新失敗則跳回登錄頁。這套流程跑起來很順滑用戶基本感覺不到會話快過期這件事。6. 常見問題與排查技巧實錄6.1 用戶登錄后頻繁掉線這是我自己排查過最多的問題類型之一?,F(xiàn)象是用戶登錄成功但沒過多久就收到401。排查步驟我建議按下面順序走第一步看訪問Token過期時間是否太短。如果你把訪問Token設成了5分鐘甚至更短那用戶操作稍微磨蹭一點Token就過期了。我建議至少15分鐘配合刷新機制使用。第二步看前端是否正確處理了401刷新邏輯。很多前端代碼只在攔截器里做了“彈回登錄頁”沒有做“先用刷新Token靜默換新Token”。這種實現(xiàn)下Token一過期用戶就得重新登錄。正確做法是先嘗試靜默刷新刷新失敗再跳登錄頁。第三步看服務端時鐘是否同步。如果應用服務器的時間比認證授權服務器快或者慢Token的exp和iat字段就會出現(xiàn)偏差導致明明沒過期卻被判為過期。用NTP確保服務器時間同步這步常被忽略。6.2 Redis里刷新Token明明存在但刷新一直失敗我遇到過一次很詭異的場景刷新Token發(fā)過去了Redis里也能查到Key但服務端一直報“登錄狀態(tài)已過期”。查了很久最后發(fā)現(xiàn)是解析JWT的密鑰配置不一致——簽發(fā)Refresh Token用的密鑰和應用啟動時加載的密鑰不是同一個。如果你把密鑰放在配置中心務必確認各環(huán)境配置的一致性。另一個可能原因是Redis的Key過期策略。我在前面代碼里給刷新Token設置了7天過期但如果用戶在7天內頻繁活躍我一直建議在每次刷新時順帶延長刷新Token的過期時間也就是“滑動過期”。如果沒做滑動過期用戶哪怕天天在用系統(tǒng)登錄狀態(tài)也會在第7天準時失效。這個體驗很糟糕。我的做法是每次刷新成功后重新設置刷新Token的過期時間為7天。6.3 驗證碼明明對了卻總是提示錯誤驗證碼問題的高發(fā)原因有兩個。第一驗證碼使用一次后沒有刪除Redis中的緩存導致同一個驗證碼可以重復使用前端又每次提交同一個驗證碼后端一刪就再也對不上了所以會“明明對了但提示錯誤”。第二驗證碼的存儲Key生成的邏輯不一致。比如生成時用captcha:{uuid}校驗時用captcha:uuid大小寫或分隔符不一致自然匹配不上。寫代碼時我強烈建議統(tǒng)一封裝一個驗證碼服務生成和校驗都走同一套Key拼接邏輯不要一個地方手寫一個Key。6.4 跨域場景下的Cookie和Token問題前后端分離的項目前端部署在app.example.com后端部署在api.example.com這是最常見的跨域場景??缬虮旧聿浑y但有一個坑刷新Token放在HttpOnly Cookie里跨域請求時默認不會攜帶Cookie。需要在后端配置CORS時設置allowCredentials(true)同時前端請求要帶上withCredentials。如果前端和后端的主域名不同比如前端是example.com后端是auth.anotherdomain.comCookie跨域攜帶就要設置Domain屬性。但Cookie的Domain不能跨完全不同的頂級域名這種場景下要么做代理轉發(fā)要么改用其它會話方案。我在實際項目里更推薦的做法是前端Nginx把/api路徑反向代理到后端服務這樣瀏覽器看到的請求是同源的Cookie方案能用CORS也不用額外開放。簡單直接問題最少。6.5 密碼升級遷移踩坑記錄最后分享一個舊系統(tǒng)改造的案例很有代表性。某系統(tǒng)原來用MD5存儲密碼用戶量好幾萬不可能讓所有人重置密碼。我接手后做了兩步改造第一步新增credential_version字段默認V1。登錄接口邏輯改成根據(jù)用戶當前版本走對應的校驗邏輯。V1的走MD5校驗校驗成功后立即用BCrypt重算密碼哈希把版本升到V2。這樣所有用戶在自己下次登錄時完成無感升級。第二步在系統(tǒng)中加入密碼強度校驗。新注冊或修改密碼時強制要求密碼長度不少于8位且包含大小寫字母、數(shù)字、特殊字符中至少三類。歷史不良密碼在升級時也要求用戶重置一次。整個遷移過程平穩(wěn)落地沒有產(chǎn)生一條“密碼失效”的工單。7. 最后的幾點心得登錄功能寫到這里我覺得最有價值的反而不是代碼而是對整個系統(tǒng)的安全邊界意識。企業(yè)級登錄流程涉及的東西非常多——Token策略、密碼存儲、暴力破解防護、審計日志、跨域處理、密碼升級——每一項單拎出來都不算難但組合在一起任何一個環(huán)節(jié)的疏忽都會成為攻擊者的突破口。我個人的體會是設計登錄模塊時永遠要問自己三個問題如果數(shù)據(jù)庫泄露用戶的密碼安全嗎如果Token被截獲攻擊者能獲取哪些數(shù)據(jù)如果登錄接口被刷系統(tǒng)能支撐住嗎這三個問題全部能給出清晰答案你的登錄模塊才算真正達到了企業(yè)級要求。還有一點想強調登錄這個模塊改起來牽扯面很大上線前一定要做完整的回歸測試尤其是Token刷新、賬號鎖定、強制下線這幾個場景。我踩過最痛的一次坑就是上線時只測了“登錄成功”這條快樂路徑完全沒有覆蓋“Token過期后續(xù)期”的場景結果線上第一個小時就收到一堆“系統(tǒng)自動退出”的反饋灰溜溜地回滾版本。從那以后我給自己立了個規(guī)矩登錄模塊的功能清單里永遠把異常場景放到和正常場景同等重要的位置去測試。這篇文章里的代碼和方案我都實際用過可以直接作為你項目里的初始版本去改造。如果你的場景和我的有些差異比如用了別的后端語言或者需要考慮更復雜的權限模型核心的流程設計和安全思路依然可以復用。登錄是系統(tǒng)的門面值得你多花些心思去打磨。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
欧美黄片免费在线观看视频| 一区二区不卡| JIZZJIZZ亚洲女人被躁| 亚洲综合 欧美| 五月香婷婷| 可以在线观看的黄色网址| 亚洲自拍青操视频| 97爱b| 3p国产色噜噜一区| 91操人视频| 青青草丝袜在线视频| 九九九九一区| 蜜桃精品一区二区三区久在线| 久久婷婷五月天| 激情国产乱伦Av| 欧美极品| 91这里只有精品| 人人操人人操人妻人| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 日日夜夜精品视频| 男人的天堂 在线一区| 超碰97首页| 国产专区路线| 在线天堂999| 欧美色图天堂在线| 五月天色综合| 亚洲欧美精品福利在线| 五月丁香社区婷婷日韩欧美精品影院 | 色爱亚洲| 精品久久97观看在线视频| 亚洲自拍欧美色综合| 97色诱| 日韩女优中文字幕| www鬼畜国产男人的天堂| 五月天色综合| 亚洲色图20p| 久久免费老司机精品| 91无码中出人妻视频| 91在线免费观看处女| 九九色精品| 九色婷婷| 天天影视网综合少妇| 五月色综合| 亚洲成?V人片在线观看福利| 久久精精区一区二区一蜜桃一区二区| 伊人影院中文字幕| 一直超碰| 香蕉人欧美综合| 大JI巴好深好爽又大又粗视频| 97干97色| 国产亚洲精品玖玖玖在线观看| 少妇人妻好深太紧了vr91| 无套内射人妻在线播放| 妺妺跟我一起洗澡没忍住| 日韩中文9| 欧美黑人性猛交91| 成人精品视频一区二区| 蜜桃狠狠色伊人亚洲综合 | 97干在线视频| 中日韩久久久| 色噜噜狠狠色综无码久久合欧美| 啊啊啊不要啊啊受不了了视频在线 | 日本黄色天堂| 一区二区三区看视频| 青草地一本线一区二区三区| 99精品国产户外露出| 日本色色视频网站| 自拍偷拍2025在线观看| 一道本东京热加勒比一区二区三区| 极品粉嫩一区二区| 大香蕉视频啪啪啪啪| 天天噜| 成人无遮挡毛片免费看| AV一二区| 国产97在线播放| 精品人妻av区天天看片| 91精品黄在线观看| 欧美精品 - 91爱爱| 一卡二卡三卡| 伊人丁香五月婷婷| 青女在线| 99999精品| 欧美偷拍区| 男人的天堂亚洲| 啊操爽品善一区二区三区| 操少妞在线视频| 天天做天天爱| 在线看免费无码AV天堂的| ,国产乱人伦精品一区二区三区| 91黑丝美女| 26uuu性| 啊啊啊啊嗯嗯嗯用力好爽 | 97伦乱| w w w.久久精品| 亚洲古典另类欧美在线| 久久国99999| 国产在线激情| 亚洲Av无码成人精品国产| 97香蕉人人乳| 亚洲码在线中文在线观看| 亚洲av无码成人精品国产| 暖暖精品二区三区观看| 天天拍夜夜| 亚洲黄网在哪免费看| 中 文字幕一区二区三四 五 区日 日 骚 | 成人午夜小视频手机在线看| 免费成人在线熟妇网| 女性喷水高潮在线观看| 日韩三四五区| 综合网天天| 亚洲日产专区| 欧美特黄视频网站| 日韩性爱网址| 91情色在线| 欧美强奸乱| 丰满人妻一区| 中文字幕91页| 中文字幕乱亚洲美女精品一区| 亚洲码专区| 久久久性爱视频| 中文字幕-区二区三区四区视频中国 | 美女天天干| 26UUU欧美激情一区二区| A久久| 久久久久久无码人妻中文字幕| 日韩乱伦影音先锋| 91bbb| 好淫网一二三视区| 四虎国产精品永久在线囯在线| 亚洲人妻一区二区三区| 日韩高清黄片| 亚洲图片在线| 久久精品国产72国产精品福利 | 操逼逼福利视频| 中文字幕78| 中文字幕奈奈美被公侵犯| 美女久久久久久久| 久久av一级av少妇av高潮| 亚洲免费97免费| 亚洲第一成人影院色播| 99re黄 | 新91视频.cmp| 97色在线观看| 色黄色美女大长腿午夜视频| 日本在线观看网址| 韩国嫰模上门援交视频| 大香樵伊人网| 国产特级毛片AAAAAA高潮流水| 亚洲区限制级| 激情九月婷婷| 尤物视频一区| 天天干夜夜操一区二区| 91蜜臀在线久久久久| 久久亚洲中文字幕视频| 久久精品高清无码一区| 五月天激情网站| 人人操 欧美| 校园春色中文字幕AV| 1024人妻熟女一区二区三区| 久久精品店| 一区中文字幕二区日韩| 日本福利二区视频| 草草草视频在线免费看| 视频在线中文字幕| 四月丁香婷婷| 欧美日韩性爱操大逼| 激情在线青青操| 国产嫩草精品A88AV在线| 欧美成人黄网色网站| 亚洲九九九| 亚洲性猛交| 嗯啊不要在线观看嗯啊| 精品一区二区成人| 国产内射爽爽大片| 插入逼91| 九九五月天| 欧亚揄拍偷拍精品视频 | 成人国产二区三区在线,男女精品。| 97玖玖超碰| 九九激情网| 日韩欧美成人午夜福利| 极品肉射| 欧美少妇高潮视频| 97精品全部| 久久久精品| 怡红院亚洲怡春院av| 超碰性爱97| 91狠| 91色黑人少妇| 中文字幕精品丝袜| 久久久久久中文字幕中文字幕最新| 色官网色综合| 家庭乱伦网站国产| 操B在线观看| 2019久久久久久久久福利| 日日骚中文字幕| 91女色| 99热在线只有精品| 超碰诱惑| 国产无码三级视频在线观看| 97久久超碰| 青青草好吊色| 78精品| 精品无码少妇| 天躁夜夜躁2021| 超碰欧美COM| 一本色道久久综合狠狠操| 操死我了嗯嗯嗯| 日少妇亚洲版| 天天综合欧美综合| 伊人国产视频| 日日摸日日碰| 99re6在线视频精品免费完整版安卓版| 久久久久久久久久久999| 欧美日本天堂| 99这里都是精品| 91精品免费| 亚洲做性| 女人久久久| 天天做天天爱| .精品人妻一区二区三| 国模私拍一区二区三区神乳| 国产宅男宅女在线观看| 99精品欧美一区二区三区桃色| 国产无码高清操逼视频| 人妻熟女av国产网站| 国产懂色精品国产av| 性爱乱伦一区| 日韩美一区| 嫩草 人人网精品| 一二三四视频在线社区中文字幕| 午夜精品久久久久久久99| 午夜精品久久久久久久| 亚洲一区二区av| 欧美亚洲激情| 亚洲欧洲综合av在线| 深夜激情无码| 青青草黑寡妇男人天堂| 久久久国产精品亚洲精品| 亚州,欧美在线| 福利在线黄片| 爽爽淫人网| 亚洲淫乱骚妇AV| 欧美天堂亚洲电影院一区在线播放| 欧美后入式| 免费精品无码一级毛片牛牛影视| 看一级特黄a大一片| 97久久精品亚洲| 国产精品网站免费| 日韩综合97p| 久草加勒比一区在线| 久久久久久日韩| 婷婷五月花| 精品9区| 美女久久久久久久久久久| 欧美日韩另类在线播放| 国产超碰在线| 国产精品密臀网在线观看| 后入合集| 免费观看国产不卡av| 91狠狠色丁香婷婷综合久久| 亚洲性感丝袜诱惑在线观看| 五月亭亭六月丁香| 国产精品熟女乱伦| 亚洲资源网| 少妇久久久久久久| 亚洲情色电影网| A男人的天堂| 欧美色综合| 激情久久久| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 黄色片,com| 色噜噜精品一区二区三| 精品91摸| 亚洲网站一区二区在线| 欧美性爱精品一区二区| 97超碰超欧美。| 强奸抽插av| 国产乱弄免费在线视频。| 强奸乱伦麻豆| 激情露脸爱| 诱惑网综合| 国产免费久久久久| 亚洲AV不卡在线观看| 久久精品福利影院| 九草在线大香蕉| 白丝一区| 夜夜高潮夜夜爽高清视频一 | 操啊国产| 久久精品老司| 婷婷丁香五月天综合东京热| 精久久久| 久久久中文| 人妻精品一区一区三区蜜桃91| 九月激情婷婷| 国产精品久久久久久久久久久久久久久久| 人人操人人插 - 百度 - 百度| 国产成人亚洲精品自产在线| 天天干天天操天天操夜夜操天天操 | 九九九久久久久| 富女玩鸭子一级毛片| 亚洲天堂另类小说男人| 秋霞久久亚洲精品成人| 97超碰中文| 国产精品自在线发布| 中文字幕、久久精品国产2020、久久综合久久自在自线精品自、亚洲 | 91天天美女| 激情久久av一区av二区av| 啊灬啊灬啊灬啊灬高潮奶出了免费视 | 国产成久久综合片| 操91| 免费AV播放| 久久久久久久久久9| 99精品在线观看| 91老熟女| 久男人久久| 无码国产精品午夜不卡(| 日韩电影中文字幕| 亚 欧 美 综合| 国产偷人伦激情在线观看| 97久久久久久久精| 亚洲精品一二区| 97超碰欧美手机在线| 嗯啊不要在线| 亚洲国产麻豆一区二区三区| 91白虎| 日韩紧密久久| 黄片aaaaa一区| 91熟女丨91老女人| 亚洲极品| 久久伊人在线五区| 家庭乱伦性爱av| 亚洲高清欧美总合| 人妻内射一区二区在线视频| 夜夜肏2021| 俄罗斯一区二区视频在线观看 | 99热亚洲| 亚洲最新av无码成人精品区| 资源新线在线天堂| 亚洲一区二区 麻豆传媒| 日韩一区二区三区四区五区 | 人妻在线臀日韩| 久久中文色图| 国产日本熟女顶级一区二区三区视频 | 亚洲密乳AV| 亚洲另类色综合网站| 91天天日| 色官网在线| 天天激情干| 亚洲国产97| 亚洲性少妇| 热天堂一区二区| 狠狠色噜噜狠狠狠狠狠色综合久久| 一区二区中文| 97久久超碰日韩精品| 人妻爽爽啪视频| 色97| 国产久久一区二区午夜| 操一区| 亚洲国产午夜真人一级片中文字幕精品黄网站 | 国产精品欧美日韩久久| 欧美狠狠干| 久久99九九九九6666免费观看软件| 日日黄色三级网站| 久久色一区| 亚洲五月丁香花狠狠干一区二区三区 | 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | 欧美成人精品欧美一级乱黄一区二…| 91美女视频电影| 人妻在线大香蕉| 亚洲免费精品一区| 青青色综合| 久久黄黄| 亚洲熟妇图片| 97精品第3页| 日本天堂网| 91美女视屏| 国产剧情一区在线观看| 一本一道人妻久久一区二区三区 | 丝袜天堂网| 成人久久久精品| 国产免费久久精品99re韩国| 亚洲丰满很很操| 亚洲日韩乱码中文无码蜜桃臀网站| 亚洲欧美另类少妇精品| 粘花网06av视频| 亚洲射综合网| 丰满精品人妻少妇久久字幕| 欧美91精彩| 99蜜桃臀久久久欧美精品网站| 青青操在线亚洲视频观看欧美在线| 国产伦精品免编号公布| 91天天综合网,天天综合网| 国产精品制服丝袜中文字幕日韩一区二区三区 | 啊啊啊啊啊啊啊国| 99啪啪| av天天在线| 欧美综合网1| 97视频在线免费| 精品国产乱码久久久久久免费| 九九九不卡| 久久免费9| 亚洲av性爱电影| 秋霞一级A片黄色视频| 日韩乱伦AⅤ| 欧美日本国产日韩激情视频| 精品超碰国产| 麻豆区99999| 亚洲91综合| 午夜经典| 岛国色情视频在线观看| 韩国三级理论在线| 麻豆天美电影一区二区| 综合网97| 欧美亚洲91| 成人av福利在线观看| 久久精品色欧美aⅴ一区二区| 婷婷激情五月| 色五月第四色| 亚州欧美在线| 亚洲一区二区三区不卡国产欧美| 日本护士高潮| 久久久久久久久久久久黄色| 免费视频观看60秒| 黄色电影在线播放综合网站| 欧美日韩性爱精品| 日韩三级在线观看mp4| 久久久内射良家| 91色色网站| 盗摄女人妻在线| 91neishe| 蜜桃天美传媒AV一区二区三区| V A在线| 91丨熟女丨丰满熟女| 欧美制服另类丝袜| 色97国产69香蕉| 精品无码久久久久久久杏吧| 欧美丰满熟妇XXXX性ppX人交| 国产精品天美传媒| 欧美色另类| 成人免费在线网站| 青青操少妇| 国产伦精品| 91强热人妻| 欧美大香蕉97| 久久专区| 91久久国产综合久久| 天天综合~91| 三级特黄60分钟播放| 在线 制服丝袜中出 人妻| 亚洲日韩欧美一区二区| 午夜激情成人在线观看| 一本正道久久熟女| 欧美日本成人一区二区| 男人亚洲91首页在线| 久久riav中文精品| 果冻传媒A片一二三区| J?P?NESEHD熟女熟妇伦| 91国产精品熟女| julia国产在线| 户外裸露刺激视频第一区| 日日黄色三级网站| 久久精品国产亚洲妲己影视| 日韩精品9999| 免费1级a做爰片观看| 9999伦理视频| 少妇一区二区三区精选| 在线 亚洲 网爆 自拍| 蜜臀久久99精品久久久电影| 91原创在线观看| 亚洲天天操| 天天操夜夜操| 日本欧美中文字幕| 大香蕉伊人网WWWn0n| 97香蕉网| 蜜臀久久99精品久久久久免费观| 国产精品女aA片爽爽视频| 老色69| A级国产欧美激情在线| 欧美综合骚| 乱伦av麻豆| se,,,亚洲欧美| 日本性爱网址| 美女91在线| 久久大香蕉手机高清视频| 97干97色| 四虎884a| 亚欧国产无码精品在线| 麻豆亚洲AV成人无码久久精品| 色综合五月天| 日欧操屄| 一摸二插三插| 久久精品视-一级做a爰片性色毛片16美国-中国女与老外在线精品 | 久久婷色| 久久久久久久强迫| 国产一区二区在线播放,久久亚洲精品中文字幕第一区,亚洲精品在线中文字幕视频 | 干B网| 国产a级精品| 国产女人和拘做爰视频 | 熟妇乱伦一区二区| 啊啊啊快操我视频| 久久久国产成人一区二区三区在线| 中韩中文字幕在线观看| 亚洲一二三精品久久网| 美女国产一区二区久久| 91亚洲情色| 色九九九九| 在线不卡视频| 亚洲欧洲综合成人av一区| 国产精品69久久久久孕妇欧美| 五月婷婷激情综合| 色黄色美女大长腿午夜视频| 78超碰| 夜夜操中文字幕| 很很干很很操| 国产欧美精选自拍一区| 欧美少妇色图| 青青草影视蜜久久| 最新av在线| 精品色色| 凹凸久久人人| 亚洲成人精品在线一区| 91天堂丝袜美腿| 麻豆激情综合| 成人免费看吃奶视频网站| 婷婷丁香久久| 人人艹亚洲| 999综合网| 国产精品粉嫩福利在线| 欧美永久激情一区二区| 嗯啊不要啊在线| 日本视频一区二区三区| 999久久久免费精品国产牛牛| 色97国产69香蕉| 久操在97| 亚欧中文字幕在线视频| 99激情视频| 日韩精品永久在线观看| 超碰成人公开| 美女操逼A A| 女性91网站| 国产97av| 天天狂操夜夜狂日| 91成人亚洲色图| 日日日大屁股骚女人精品| www.一本大99| 大鸡吧尹人在线| 色色99| 欧美日韩岛国大片在线观看| 操高情无码| 亚洲成人免费中文字幕| 成年人三级黄色片视频| 国产黄色视频久久| 亚洲天堂在线怕怕视频| 国产精品人妻免费精品| 九九九九热| 欧美第二页| 国产精品久久久久久久久久久久| 97超碰香蕉| 丰满人妻一区二区三区免费 | 少妇蹲下露出大唇5| 后入合集| 四虎影视精品| 免费一二区| 亚洲欧美国产中文视频| 亚洲成人黄色在线观看| 一本色道综合久久欧美| 岛国大片国产| 午夜欧美女人操逼| 九月丁香| 不卡超碰护士AV在线免费播放| 日本人体九九九九九九| 一区二区三区国产精产| 亚洲色图欧美另类在线| 久久亚洲天堂| 变态综合色| 人人弄人人摸| 国产 日韩 欧美高清| 蜜乳AV一区二区三区四| 97色干| 亚洲熟妇图片| 91老熟女老女人国产老太 | 亚洲欧美经典一区二区| 五月天激情婷婷| 精品一区二区三区最新| 超碰在线97国产| 中文字幕精品三级久久久| 丝袜AV一区二区三区| 99久久无码| 二男一女成人A片| 欧美日韩操逼嗦吊| ss久久| 亚洲综合大片| 91性色| 色乱二区| 嗯嗯,啊啊,国产精品| 使劲用力艹少妇视频一区二区 | 亚洲少妇喷视频看| 欧美一区二区成人一卡| 久久岛国| 精品高清一区二区三区三州| 狠狠干狠狠干| 1.igao73.com 加入收藏 免费专区 国产精品 中文字幕 日韩精品 欧美精品 精彩 | 国产精品白丝| 亚洲色图欧美视频| 成人熟女视频一区二区三区| 极品出轨视频网站| 日日操免费视频| 大香蕉伊人久久| 啊啊啊不要好爽日韩无码一区| 18精品一二区| 国岛片视频| 99re8超碰| 97K超碰在线| 岛国大片在线观看网站入口| 亚洲精品丝袜| 精品久9| 中国探花熟女| 久久久九九九九| а√天堂资源官网在线资源| 思思热在线视频精品| 啊啊啊啊好疼视频| 国产精品 久久久精品一牛| 野狼激情网| 91白虎| 熟女人妻一区二区三区| 色九九九综合| 亚洲一区日韩精品| 精品熟女一区=区三区| 风间由美日韩欧美久久| 视频分类 国内精品| 91黑丝美女| 精品日韩人妻精品一二三区| 天天淫人人妻日日色| 怡红院久久老司机| 亚洲欧美成人在线| 久久日韩肥臀| 色欲天天综合网| 插B在线观看| 在线中文字幕极品av| 色九九综合AV| 中国大陆国产高清AⅤ毛片| 国产盗摄美女如厕大神作品在线观看| 久久在线观看免费视频| 美女露胸露尿口| 97视频在线播放| 艳美熟妇先锋一二三区| 精品99999| 九九久久久久久爱| 乱伦熟女论坛| 青青青青草av在线观看| 黄片国产精品一区二区| 91天天爱| 亚洲 国产 精品一区| 天天日熟妇| 亚洲欧美中文日韩视频中国语| 久久中久文96| 狠狠干婷婷| 国产99999| 亚洲日韩av一区二区三区百合| 国产女人视频三四五区| 色老汉色| 欧美精品xxxwww| 亚洲色棕合| 久久一二三四五六七八九区区区| 亚洲天堂男人天堂网| 精品无码一区二区| 亚洲国产一区二区日韩专区| 亚洲青青草| 婷婷五月色| 国产成人亚洲精品无码最新在线| 后入式在线免费观看60秒| 久久久麻豆精品| 999精品乱码| 精品无人区麻豆乱码久久久| 爽极品影院| 男人天堂毛片| 爱干爱射网啊啊啊| 91爆操视频| 日韩图色| 十八禁黄色成人网站观看| 岛国艾薇凹凸视频天堂| 高清无码人妻久久久一区二区三区aⅴ| 久久久啊啊| 日本一区二区不卡精品| 亚洲不雅视频1区二区| 欧美无圣光在线| 亚欧Av| aaa亚无码专区| 中文字幕免费看| 亚洲国产精品乱码在线观看| 国产av波波国产精品| 老鸭窝成人免费毛片视频| 玖玖爱综合| 91色久| 在线综合 亚洲 欧美中文字幕| 999久久芭蕾| 99久久久无码| 综合久| 免费又黄又裸乳的视频| 偷拍 亚洲 欧美| 91人妻久久久久久久久久久久久| 一区二区三区精品黑丝白丝酒店对鸡 | 人妻嗯啊啊在线播放| 中国AV美女| 91亚洲网站| 无码操逼天堂| 一区二区 电影 亚洲| 2017天天插| 香蕉视频欧美一卡二卡| 五月天伊人网| 久久久九九九| 91在线页| 中文字幕女同在线| 九九热精品视频六| 开心五月激情网| 国产无码成人无码| 91亚州日韩高清| 亚洲精品国语在线播放| 亚洲AV免费在线观看| 噜噜瑟| 亚洲欧美日韩二区视频| 欧美国产一区二区三区麻豆传媒 | 超碰99热中文字幕| 快播久久人人aV| 无码人妻一区二区一牛影视| 玖玖蜜臀资源网| 超碰综合97在线| 久久男人的天堂| 操逼操逼逼操操逼91 | 成人婷婷丁香| 精品一二三区四视频| 超碰97日韩| 国产免a费看黄片在线| 99热这里是精品| 夜精品久无码| 黄片www视频免费| 日本在线播放不卡一区| 日韩伦理视频| 东京热毛片调教| 午夜无遮挡男女啪啪视频| 大香蕉伊人久久| 亚洲性少妇| 日本人妻丰满熟妇久久久久久| 亚洲色图欧美视频| 国产熟妇一区二区| 久久狠狠色噜噜狠狠狠狠97| 成人三级片无码| 九九九九九九成人| 久久专区| 久久天堂婷婷网| 乱操9999| 人人妻人射| 精品九九九九九九九| 天天射日日干| 日韩人妻无码专区| 伊人午夜福利视频| 亚洲图片婷婷五月天| 99热超碰| 夜夜躁狠狠躁日日躁av| 亚洲乱码尤物193YW| 久久九七| 日韩熟女三十乱伦| 97资源制服丝袜| 九九九九九九九| 亚洲最新av无码成人精品区| 97色欧州| 伊人丁香五月婷婷| 天天综合影院91| 黄色免费网| 夜夜夜久久| 日本精品五区| 九九热精品在线| 69精品| 激情六月天| 国产97色在线 | 亚洲| 欧亚性爱视频免费看| 中文字幕第23区| 操操逼操操逼操操逼逼| 2000亚洲男人天堂| A 在线网址| 激情视频一二三| 精品少妇人妻av久久免费| 久日91在线| 久久中文字幕一区不卡| 超碰综合色| 五十路三级片| 中文精品少妇天堂| 欧美啪啪女女| 国产suv一区二区三区6| 天天影视网综合少妇| …亚洲黄色厕厕女女在线播…| 五月丁香在线| 欧美狠狠干| 宗合情欲网| 在线免费观看日韩一区| 激情人妻另类| 亚洲激情在线一区二区| 人妻久久| 四虎影视在线| 91精品久久久久五月天精品| 亚洲欧美在线综合| 五月天色色网站| 97精品久久| 99操| 亚洲国产成人精品无码专区| 一二区在线观看视频| 亚洲精品一区中文字幕乱码| 在线观看中文字幕| 青青草大香蕉在线视频| Blackedraw视频一区二区| 狠狠色五月亚洲91| 久操九九九九| 乱伦1色页| 国产精选视频| 日本少妇va7777| 国产精品婬乱一级毛片彝族| 欧成人在线| 九九久久一区二区三区| 在线观看岛国有码| 欧美 亚洲| 青青草黑寡妇男人天堂| 欧美国产伊人久久久久| av天堂电影网| 亚洲凸凹超碰成人| 五月婷婷影院| 日本免费人成视频播放120秒| 欧美综合亚洲| 日日日啊啊啊| 国产AV久久久蜜爱影集| a亚洲欧美色欲| 国产精品电| 亚洲国产精品乱码在线观看| 亚洲精品第一| 亚洲国产综合视频| 加勒比色综合| 亚洲综合影视| 婷婷丁香五月综合| 国产一级137片内射麻豆| 天天综合网~91| 欧美白嫩在线放| 九九Av| 又粗又长又爽在线观看| 九热中文字幕| 中文字幕欧美日本乱码一线二线| 中文字幕视频在线观看一区二区| 亚欧Av| 伊人专区一区二区三区| 一区二区三区麻豆| 91精品免费| 久久久婷婷| 夜色五月天| 97最新在线播放视频| 国产精品视频自拍在线| 天堂性色| 亚洲骚男同com| 91成人社区| 亚洲男人的天堂一区二区| 91九色精品熟女内射| 久操网视频| 婷婷干黄色| 欲香欲色| 神马久久午夜| 東南亚性呦成人伦理资源在线视频| 成人熟女区| 大香蕉在线86| 曰本精品久久久| 久久久久久久久久久久久久久性生活视频 | 久久成年片色大黄全免费网站| 97国产|免费| 欧美日日人人天天| 狠狠爱AV| 91爱欧美| 国产视频小说| 无码久| 欧美色图 人妻| 人人澡综合涩| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 欧美色图 人妻| 欧美A√综合网| 欧美高清性猛交| 久草资源在线视频官方总站日韩丝袜美腿 | 精品国产污一区二区三区| 国产伦精品一区二区三区视频女| 日韩成人综合网| 99啪啪视频| www.久久| 欧美图片偷拍| 97国产超湿| 亚洲熟女国产综合另类| 91女人的网站| 嗯嗯啊啊用力视频免费| 久久综合日韩亚洲欧美| 亚洲91亚洲| 亚洲 欧美 另类 日韩 人妻一区| 成人日韩中文字幕| 男生女生啊啊啊啊| 传媒免费一区二区三区| 女人的天堂大香蕉网| 国产欧美后入| 午夜久久久| 人妻蜜桃臀| 97AV在线观看| 2023天天操夜夜操| 免费1级a做爰片观看| 激情网色| 强奸乱亚洲| 日本欧美韩国日产片片在线看免| 高清不卡视频| 久久鲁夜| 九九九九九九九九九九九蜜桃| 新91视频.cmp| av中亚| 国产精品 久久久精品一牛| 亚洲五码一区二区三区| 欧美 亚洲 偷拍自拍| 欧洲色| 蜜桃中文字日产乱幕4区| 欧美色天堂网在线视频| 很狠操| 99av| 国产精品网址| 激情综合婷婷| 大香蕉免| 蜜臀久久精品久久久久视频| 亚洲熟女诱惑| 九九视频黄色片| 久久精品国产免费观看99| 欧美精品四区| 少妇精品久久久| 97K超碰在线| 国产JDAV无码视频在线观看| 亚洲 欧美日韩 另类| 天天日B狠狠操| 久久久专区| 久久久精品网| 性影在线视频| 黑操B| 韩日自拍| 黄片免费日韩| 日韩中文字幕视频在线观看| 97精品一二区| 视频在线观看青青99国产| 蜜臀99久久精品久久久懂爱| 嗯啊抽插大香蕉网页| 先锋精品av色鲁| 91黑丝美女| 舔足天天操天天射| 大香蕉久| 一区二区三区网站日日骚| 日本熟妇自慰性高潮一区二区三区| 国产精品网址| 国产精品视频白浆免费| 好吊色一区| 男同专区一区二区三区在线| 国产女人和拘做爰视频| 人妻久热在线| AV中文字幕三四五| 久久这里是精品| 裸体女人草逼视频播放一区,二区,三区,四区,五区 | 成人三级片无码| 欧美日韩少妇色情| 91综合站| 狼人久草| 久久久久久裸体| 操逼天美3区| 极品色社| 色区97| 日韩av影片在线观看| 三级网站超变态精品| 亚洲精品九九九| 91狠狠综合久久| 亚洲九九视频在线观看| 眼镜人妻101.com| 国产人伦精品一区二区三区 | 97在线播放 | 操操操操网黑人| 97色97干| 发朗少妇买婬全视频中文| 中文熟女五十乱码在线| 在线一道啪| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 色999偷自拍拍| 天美精品原创av片国产| 成人夜夜爽| 97这里有精品| 婷婷综合在线| 精品夜夜澡人妻无码AV| 最近的最新的中文字幕视频| 天天综合网~91入口| av在线不卡一区二区三区| 诱惑人妻欧美一区在线播放| 小说区 图片区色 综合区| 狼天天狼天天大香蕉| 欧美天天综合| 青青青操| 爱妃国产亚洲视频中文字幕| 啊啊啊啊啊操我视频| 国产黄色剧情影片麻豆免费播放| 久久侵犯人妻爽爽爽| av网站免费看| 免费看污网站| 亚洲欧美国产中文视频| 夜夜狠狠躁日日躁色视频| 国模私拍一区二区三区神乳| 热久久九九热| 岛国视频免费在线观看| 操淫穴亚洲五月丁香 | 欧美资源| 歐美一級亂黃99在綫精品| 精品日韩人妻视频| 99蜜桃臀亚洲成人在线观看| 无码人妻精品一区二区中文| 色拍偷亚洲| 久久久久婷婷| 日躁天天爽爽| 欧美色图私拍91| 乱论91| 久久精品成人| 国产精品一区二区三区在线密挑| 亚洲麻豆av一区二区| 日韩午夜国产| 亚洲一区二区三区AV无码| 97伦综合| 99色悠悠| 国产一区二区三区白丝| 少妇高潮喷水无套久久久久久| 国产精品成人无码av| 日少妇视频| 天堂在线一区二区| 去干网最新版| 少妇久久久久久| 久久人爽| www.久久| 老外又粗又长一晚做五次| 色悠久久久av| julia高潮后不停追击中出| 欧美传媒| 欧日韩一二三f区| 一区二区三区国产精产| 成人免费福利网站国产| 91青青草| 色踪合AV| 久操99| 日本午夜精品理论片A级APP发布| 91夜色| 国产日韩中文字幕欧美| 91在线视频免费中出| A片 AV一级在线播放观看免费| 熟女人妻精品一区二区视频| 91成人社区| 区日韩亚洲乱码av电影| 手机在线人成免费视频| 色色五月丁香| 久久久精品中文字幕爱豆| 大香蕉手机在线| 婷婷激情一区二区三区俺也去| 国产高清无码一区二区三区四区皇冠| 视频一区二区免费在线| 香蕉国产97| 欧美曰韩国产精品| AV 少妇 人妻 偷拍| 午夜福利免费福利视频| 思思热一热婷婷热一热| 久久黄色视频一区二区三区| 成人三级片一区二区三区视频| 亚洲中文字幕日产无码久久| 天天干一干| 啪啪啪精品视频| 伊人网青青| 色香av| 呻吟 欧美 日本 中出| 美女大乳久久久久久久女人18| 婷婷午夜| 亚洲性爱无码乱伦av| 家庭乱伦国产| 国产自制av蜜乳| 国产熟女无套内射| 99最新日韩偷拍视频| 色情亚洲日本成人| 97人肏| 99爱视频| 99热婷婷| 日本理论在线| 欧美亚洲| 黄片色区软件| 偷拍亚洲熟女视频播放| 老熟妇乱轮| 色九久| 美女黄页网站| 欧美日韩不卡传媒| 大香蕉92| 97精品中文字幕| 亚熟hd视频在线| 日韩精品99久久久久久中文字幕 | 成人欧美一区二区三区黑人一| 破苞ⅩXXX性无码动漫无码| 思思热国产在线视频| 午夜超爽| 伊人丁香五月婷婷| 久久精品 六十路 熟女 欧美| 91丝袜在线观看| 国产女人视频三四五区| 欧美天天干| 夜夜躁狠狠躁日日躁av| 国产精品农村妇女| 黄页av| 亚洲国产97| 91美女视频在线观看| 久久免费少妇| 后入式免费视频| 国产美女高潮| 欧美成人性爱视频在线播放| 亚洲伊人成综合成人网| 无码精品久久久久久亚洲| 一起草三级AV电影在线观看| 亚洲春色一区二区三区| 国产精品com| 免费的黄片有限公司| 亚洲一级性爱视频免费看| αⅴ天堂| 日韩欧美字幕亚洲一区二区| 国产亚洲中文不卡二区| 97碰碰色| 97超碰久久| 欧美乱伦专区| 欧美偷拍区| 91爆操视频| 欧美性生活综合| 床上啊啊啊一区二区三区| 青青草九九九九九| 玖玖爱综合| 九九九九九九九九九五码| 加勒比五月天| 综合网少妇| 人人操人人摸人人骑| 人人贴人人摸| 操我无码| 人妻少妇精品一区二区三区| 久久久精久久久| 精品人妻一区二区乱码一区二区| 成人十八禁日韩欧美一二三| 久久久成人免费av电影| 蜜乳成人AV| 国产性感骚丝袜在线| 亚洲免费精品一区| 啊啊啊好舒服好爽啊啊啊视频| 91l欧美在线| 青青草在线视频美女| 午夜精品久久久久久久久久久久久 | 婷婷99| 国产精品2020| 欧美性五月| 人妻少妇久久中文字幕一区二区 麻豆| 奇米四色网| 国内精品伊人久久久久影院会| 欧美亚涩| 精吧天堂| 97在线观看| 8050午夜少妇无码|