久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

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

Java Shiro自定義Realm實(shí)現(xiàn)授權(quán):從原理到權(quán)限數(shù)據(jù)模型實(shí)踐

Java Shiro自定義Realm實(shí)現(xiàn)授權(quán):從原理到權(quán)限數(shù)據(jù)模型實(shí)踐 Java Shiro 安全框架十自定義 Realm 實(shí)現(xiàn)授權(quán)做了幾個(gè) Shiro 項(xiàng)目之后我發(fā)現(xiàn)很多同學(xué)對(duì)“登錄成功”這件事特別上心但對(duì)“登錄之后能干什么”往往只有一個(gè)模糊概念反正登錄進(jìn)去了頁面上的按鈕該不該顯示、接口該不該讓調(diào)、數(shù)據(jù)該不該讓看這些才是一個(gè)安全框架真正值錢的地方。Shiro 的授權(quán)Authorization能力雖然接口簡(jiǎn)單但要把權(quán)限數(shù)據(jù)從數(shù)據(jù)庫里撈出來、裝進(jìn)框架能識(shí)別的結(jié)構(gòu)、再讓注解和標(biāo)簽正常工作中間的關(guān)鍵節(jié)點(diǎn)就是“自定義 Realm”。這篇文章我打算只講授權(quán)這一半。默認(rèn)你已經(jīng)跑通了認(rèn)證Authentication知道 Realm 是 Shiro 連接數(shù)據(jù)源的那座橋。我們順著這座橋繼續(xù)往前走把doGetAuthorizationInfo這個(gè)方法的里里外外都拆一遍從數(shù)據(jù)模型設(shè)計(jì)、代碼實(shí)現(xiàn)、調(diào)試驗(yàn)證到生產(chǎn)環(huán)境最容易踩的緩存和權(quán)限串號(hào)問題一次說清楚。1. 自定義 Realm 在 Shiro 授權(quán)中的定位1.1 授權(quán)和認(rèn)證是兩套獨(dú)立的動(dòng)作很多人第一次接觸 Shiro 時(shí)會(huì)以為“登錄數(shù)據(jù)都從數(shù)據(jù)庫查了順手把權(quán)限也查出來不就行了”。邏輯上沒問題但 Shiro 的設(shè)計(jì)把這兩件事拆得很干凈認(rèn)證回答“你是誰”授權(quán)回答“你能干什么”。這兩件事在代碼層面分別對(duì)應(yīng) Realm 里的兩個(gè)方法——doGetAuthenticationInfo和doGetAuthorizationInfo。之所以非要拆開是因?yàn)槭跈?quán)判斷發(fā)生的時(shí)機(jī)遠(yuǎn)比登錄時(shí)多。用戶登錄時(shí)你當(dāng)然可以查出他所有角色權(quán)限并塞進(jìn) Session但真實(shí)系統(tǒng)里權(quán)限經(jīng)常變化管理員給用戶加了個(gè)角色、用戶被移出了某個(gè)部門、權(quán)限菜單被調(diào)整。如果只在登錄時(shí)查一次那這些變更只能等用戶重新登錄才生效太不靈活。Shiro 的做法是每次執(zhí)行subject.isPermitted()或subject.hasRole()時(shí)動(dòng)態(tài)向 Realm 要一次授權(quán)數(shù)據(jù)再配合緩存把性能問題解決掉。所以自定義 Realm 的授權(quán)部分本質(zhì)上就是實(shí)現(xiàn)一個(gè)“按用戶查角色和權(quán)限”的查詢器。你的業(yè)務(wù)邏輯再復(fù)雜最終都得收斂到給它返回一個(gè)AuthorizationInfo。1.2 內(nèi)置 Realm 的授權(quán)能力為什么不夠用Shiro 自帶了好幾款開箱即用的 Realm比如IniRealm、PropertiesRealm、JdbcRealm。其中JdbcRealm最容易被拿來直接對(duì)接數(shù)據(jù)庫它默認(rèn)的權(quán)限查詢 SQL 是這樣的select role_name from user_roles where username ?以及select permission from roles_permissions where role_name ?這套表結(jié)構(gòu)設(shè)計(jì)的初衷是“一個(gè)用戶直接關(guān)聯(lián)角色角色直接關(guān)聯(lián)權(quán)限”簡(jiǎn)單直接。但真實(shí)業(yè)務(wù)表很少長(zhǎng)這樣常見情況是用戶表、角色表、用戶角色關(guān)聯(lián)表、權(quán)限表、角色權(quán)限關(guān)聯(lián)表五張表起步而且用戶名可能是郵箱、手機(jī)號(hào)或企業(yè)內(nèi)部工號(hào)。你要是為了湊JdbcRealm的默認(rèn) SQL 去改業(yè)務(wù)表結(jié)構(gòu)那純粹是本末倒置。更關(guān)鍵的是JdbcRealm默認(rèn)權(quán)限模型過于扁平它無法表達(dá)層級(jí)權(quán)限也沒法讓你在權(quán)限數(shù)據(jù)里塞入自定義的過濾條件。所以項(xiàng)目的通用做法是把AuthorizingRealm拿過來繼承自己寫查詢邏輯。這就是“自定義 Realm 實(shí)現(xiàn)授權(quán)”這個(gè)主題存在的根本原因。1.3 一條權(quán)限判斷背后的完整調(diào)用鏈我習(xí)慣在講代碼前先讓讀者腦子里有一張調(diào)用圖。你寫業(yè)務(wù)代碼時(shí)只調(diào)了一句if (subject.isPermitted(order:export)) { // 允許導(dǎo)出訂單 }這一句話背后發(fā)生了什么完整鏈路大致是這樣Subject委托給SecurityManager。SecurityManager繼續(xù)傳給Authorizer默認(rèn)實(shí)現(xiàn)是ModularRealmAuthorizer。ModularRealmAuthorizer遍歷當(dāng)前 SecurityManager 里注冊(cè)的所有 Realm逐個(gè)詢問realm.isPermitted(principal, permission)。每個(gè) Realm 內(nèi)部會(huì)先檢查緩存沒有緩存就調(diào)用doGetAuthorizationInfo(principalCollection)加載授權(quán)數(shù)據(jù)。授權(quán)數(shù)據(jù)拿到后和當(dāng)前要判斷的Permission做匹配返回 boolean。有意思的是第三步ModularRealmAuthorizer會(huì)“遍歷所有 Realm 并一票制決定結(jié)果”。這是什么意思只要有一個(gè) Realm 說“允許”整個(gè)判斷結(jié)果就是允許。這意味著如果你同時(shí)配置了多個(gè) Realm哪怕某個(gè) Realm 里壓根查不到這個(gè)用戶的權(quán)限只要另一個(gè) Realm 查到了授權(quán)請(qǐng)求依然能通過。這個(gè)小細(xì)節(jié)在生產(chǎn)環(huán)境里會(huì)帶來一些詭異現(xiàn)象后面我會(huì)專門講。2. 從 AuthorizingRealm 切入授權(quán)的骨架2.1 doGetAuthorizationInfo 是唯一的核心入口AuthorizingRealm這個(gè)抽象類幫我們做了大量模板化工作。它繼承自AuthenticatingRealm在認(rèn)證能力基礎(chǔ)上擴(kuò)展了授權(quán)能力。我們要實(shí)現(xiàn)的方法只有一個(gè)protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals)參數(shù)PrincipalCollection里裝著用戶身份標(biāo)識(shí)。別小看這個(gè)參數(shù)它可能包含多個(gè) Realm 各自返回的 principal所以你在取用戶標(biāo)識(shí)時(shí)不能想當(dāng)然用principals.getPrimaryPrincipal()要看你認(rèn)證時(shí)SimpleAuthenticationInfo里到底放的是什么對(duì)象。返回的AuthorizationInfo就是授權(quán)數(shù)據(jù)的容器最常用的實(shí)現(xiàn)類是SimpleAuthorizationInfo它內(nèi)部維護(hù)了三類數(shù)據(jù)方法作用常見用法addRole(String)添加單個(gè)角色標(biāo)識(shí)info.addRole(admin)addRoles(SetString)批量添加角色從數(shù)據(jù)庫查詢結(jié)果直接放入addStringPermission(String)添加字符串權(quán)限info.addStringPermission(order:export)addObjectPermission(Permission)添加對(duì)象權(quán)限自定義 Permission 實(shí)現(xiàn)時(shí)使用很多初學(xué)者會(huì)糾結(jié)“角色和權(quán)限到底往哪個(gè)里面放”。我的建議是角色照常放權(quán)限也照常放兩者并不沖突。角色用于粗粒度的功能入口控制權(quán)限用于細(xì)粒度的操作控制后面會(huì)展開講。2.2 授權(quán)數(shù)據(jù)該從哪里來doGetAuthorizationInfo方法體里面一般就三步拿用戶標(biāo)識(shí)、查數(shù)據(jù)庫、組裝AuthorizationInfo。真正的業(yè)務(wù)復(fù)雜點(diǎn)全在第二步。這里我要強(qiáng)調(diào)一個(gè)容易被忽視的設(shè)計(jì)問題授權(quán)查詢到底應(yīng)該按用戶主鍵查還是按用戶名查如果認(rèn)證時(shí)你往 principal 里塞的是用戶主鍵userId那授權(quán)查詢就用userId做條件。如果塞的是用戶名就按用戶名查。兩種都可以但我更推薦主鍵因?yàn)橛脩裘赡鼙恍薷亩壹词箖蓚€(gè)用戶同一天注冊(cè)、同名主鍵也不會(huì)撞。唯一的注意點(diǎn)是Subject的 API 大多接收 principal 作為參數(shù)你從principals.getPrimaryPrincipal()取出來的類型必須和你放進(jìn)去時(shí)一致否則要做類型判斷再轉(zhuǎn)換。至于查詢結(jié)果我也順手說一個(gè)實(shí)踐不要在doGetAuthorizationInfo里一次只查角色另一次只查權(quán)限最好一條查詢把用戶的角色碼列表查出來再用角色集合去查權(quán)限集合。這樣可以減少數(shù)據(jù)庫交互次數(shù)。很多同學(xué)在緩存沒生效的開發(fā)階段會(huì)反復(fù)看到 SQL 日志里授權(quán)查詢刷屏通常就是這里多查了幾趟。2.3 授權(quán)緩存Shiro 替你省了多少事AuthorizingRealm內(nèi)置了授權(quán)緩存。默認(rèn)情況下緩存是關(guān)閉的你需要設(shè)置authorizationCachingEnabled true并提供一個(gè)CacheManager。如果什么都不配每一次isPermitted()判斷都會(huì)真實(shí)觸發(fā)doGetAuthorizationInfo查詢數(shù)據(jù)庫性能上是災(zāi)難。這里的坑在于緩存默認(rèn) key 是AuthorizationCacheKey基于 principal 計(jì)算。什么意思呢用戶 A 的權(quán)限被緩存后如果管理員修改了 A 的權(quán)限再判斷A.isPermitted(...)時(shí) Shiro 不會(huì)主動(dòng)知道你數(shù)據(jù)庫變了它只會(huì)從緩存里取出舊數(shù)據(jù)。這就是“權(quán)限變更后不生效”的經(jīng)典問題。解決思路有兩個(gè)一是使用像 Redis 這樣的分布式緩存并主動(dòng)清理 key二是實(shí)現(xiàn)一個(gè)帶版本號(hào)的緩存策略。最省事的辦法是在權(quán)限變更的業(yè)務(wù)代碼里主動(dòng)調(diào)用realm.getAuthorizationCache().remove(userId);或者通過SecurityUtils.getSubject().logout()讓用戶重新登錄。方式很多沒有銀彈但你必須知道這個(gè)機(jī)制存在否則線上會(huì)出現(xiàn)“為什么我改了權(quán)限他還能訪問”的詭異工單。3. 手寫一個(gè)支持權(quán)限的 Realm 授權(quán)實(shí)現(xiàn)3.1 一個(gè)夠用的權(quán)限數(shù)據(jù)模型先約定一套簡(jiǎn)單但真實(shí)的數(shù)據(jù)表用戶表sys_user、角色表sys_role、權(quán)限表sys_permission、用戶角色關(guān)系表sys_user_role、角色權(quán)限關(guān)系表sys_role_permission。權(quán)限表里的perm_code字段我強(qiáng)烈建議采用 Shiro 通配符風(fēng)格的字符串形如order:list order:detail order:create order:export system:user:resetPwd這種寫法不是 Shiro 強(qiáng)制要求的但配合它默認(rèn)的WildcardPermission做字符串匹配時(shí)非常自然。order:*能匹配所有 order 下面的權(quán)限*:export能匹配所有模塊的導(dǎo)出操作寫出類似“所有模塊可查看”的規(guī)則也容易。角色表里的role_code則采用業(yè)務(wù)語義的標(biāo)識(shí)比如admin、operator、auditor。我還習(xí)慣加一個(gè)role_type字段區(qū)分“系統(tǒng)內(nèi)置角色”和“自定義角色”授權(quán)查詢時(shí)按需過濾。3.2 核心代碼doGetAuthorizationInfo 的完整實(shí)現(xiàn)下面這個(gè)UserRealm示例包含授權(quán)部分。為了演示清晰我假設(shè)認(rèn)證時(shí) principal 放的是SysUser對(duì)象該對(duì)象有g(shù)etId()返回用戶主鍵。public class UserRealm extends AuthorizingRealm { private UserService userService; private PermissionService permissionService; // 構(gòu)造方法注入省略 Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { // 1. 獲取當(dāng)前登錄用戶 Object primary principals.getPrimaryPrincipal(); if (primary null) { return null; } SysUser user; if (primary instanceof SysUser) { user (SysUser) primary; } else { // 如果統(tǒng)一存的是 username需要反查用戶 user userService.findByUsername(String.valueOf(primary)); } if (user null) { return null; } // 2. 查角色集合和權(quán)限集合 SetString roleCodes roleService.findRoleCodesByUserId(user.getId()); SetString permCodes permissionService.findPermCodesByUserId(user.getId()); // 3. 組裝授權(quán)信息 SimpleAuthorizationInfo info new SimpleAuthorizationInfo(); info.setRoles(roleCodes); info.setStringPermissions(permCodes); return info; } Override public String getName() { return userRealm; } }需要注意兩個(gè)小點(diǎn)第一principals.getPrimaryPrincipal()返回的類型完全取決于認(rèn)證時(shí)SimpleAuthenticationInfo的第一個(gè)參數(shù)傳的是什么所以上面代碼做了類型兼容處理。第二getName()方法在多個(gè) Realm 共存時(shí)要保證唯一因?yàn)?Shiro 可能用它區(qū)分不同的 Realm 緩存。3.3 權(quán)限字符串的匹配邏輯到底是怎樣工作的Shiro 的WildcardPermission把權(quán)限字符串按冒號(hào)分成多段每段內(nèi)可以用逗號(hào)表示“或”用*表示“任意”。比如order:list只匹配 order 模塊的 list 操作。order:list,detail匹配 order 模塊的 list 和 detail 兩個(gè)操作。order:*匹配 order 模塊下所有操作。*:export匹配所有模塊的 export 操作。用戶擁有的權(quán)限字符串集合和判斷時(shí)傳入的權(quán)限字符串做匹配時(shí)規(guī)則是“用戶權(quán)限要能覆蓋請(qǐng)求權(quán)限”。比如用戶擁有order:*他請(qǐng)求order:export匹配成功他請(qǐng)求product:export匹配失敗因?yàn)橛脩魴?quán)限只有 order 段product 段完全不沾邊。這里有一個(gè)很常見的誤區(qū)有人會(huì)把“擁有 order:* 就以為能操作所有模塊”。記住*只在它所在的段里通配不會(huì)跨段。想要全局權(quán)限得寫*:*:*或直接給用戶*。如果默認(rèn)的冒號(hào)多段規(guī)則滿足不了業(yè)務(wù)你可以自定義Permission實(shí)現(xiàn)類再通過info.addObjectPermission(...)放進(jìn)去。自定義匹配邏輯的判斷入口是Permission.implies(Permission p)方法這里可以完全按業(yè)務(wù)規(guī)則來。不過絕大多數(shù)項(xiàng)目用默認(rèn)通配符已經(jīng)足夠我建議不要過度設(shè)計(jì)。3.4 把 Realm 注冊(cè)進(jìn) Shiro 配置現(xiàn)在把自定義 Realm 配置到 Spring Boot 項(xiàng)目中。我這里給出一個(gè)基于配置類的寫法這也是目前主流工程常用的方式Configuration public class ShiroConfig { Bean public UserRealm userRealm() { UserRealm realm new UserRealm(); realm.setCredentialsMatcher(hashedCredentialsMatcher()); realm.setAuthorizationCachingEnabled(true); realm.setAuthorizationCacheName(authorizationCache); return realm; } Bean public DefaultWebSecurityManager securityManager(UserRealm realm) { DefaultWebSecurityManager manager new DefaultWebSecurityManager(); manager.setRealm(realm); return manager; } }這里我特意把setAuthorizationCachingEnabled(true)和緩存名稱寫出來因?yàn)楹芏嗳?Spring Boot 集成 Shiro 時(shí)忘了開啟緩存導(dǎo)致授權(quán)查詢高頻率打到數(shù)據(jù)庫。開啟后配合 Redis 緩存可以大幅提升權(quán)限判斷性能但要注意緩存失效問題這一點(diǎn)我在后面第 5 部分詳細(xì)說。4. 授權(quán)生效后的驗(yàn)證與調(diào)試4.1 用單元測(cè)試驗(yàn)證授權(quán)結(jié)果授權(quán)邏輯寫完后第一步不是啟動(dòng)整個(gè) Web 應(yīng)用去點(diǎn)按鈕而是寫幾個(gè)快速驗(yàn)證用例。Shiro 提供了一套線程綁定 Subject 的機(jī)制在測(cè)試代碼里可以直接模擬一個(gè)帶權(quán)限的用戶public class UserRealmAuthorizeTest { Test public void testAdminCanExportOrder() { // 組裝授權(quán)信息用戶擁有 order:* 權(quán)限 SimpleAuthorizationInfo authInfo new SimpleAuthorizationInfo(); authInfo.addRole(admin); authInfo.addStringPermission(order:*); // 構(gòu)造一個(gè)綁定 Subject 的 SecurityManager Realm realm mockRealmWithAuthInfo(authInfo); // 使用 Shiro 提供的測(cè)試工具認(rèn)證一個(gè)假用戶 Subject subject new Subject.Builder(securityManager).buildSubject(); subject.login(new UsernamePasswordToken(tester, 123456)); // 斷言權(quán)限判斷結(jié)果 assertTrue(subject.isPermitted(order:export)); assertFalse(subject.isPermitted(product:delete)); } }這種測(cè)試的價(jià)值在于它不依賴數(shù)據(jù)庫直接驗(yàn)證 Shiro 匹配邏輯是否符合預(yù)期。如果你改了權(quán)限字符串格式跑一遍測(cè)試馬上知道有沒有破壞舊規(guī)則。注意mockRealmWithAuthInfo是測(cè)試輔助方法大概思路是自定義一個(gè) Realm 把a(bǔ)uthInfo固定返回這樣doGetAuthorizationInfo就不會(huì)訪問數(shù)據(jù)庫。4.2 調(diào)試時(shí)如何觀察授權(quán)數(shù)據(jù)是否加載實(shí)際遇到“某個(gè)接口明明配置了權(quán)限注解卻 401/403”時(shí)最痛苦的是不知道“用戶到底有沒有這個(gè)權(quán)限”。我的習(xí)慣是先開 DEBUG 日志觀察LoggingSubject或自定義攔截器打印的 principal 和權(quán)限字符串。具體操作上可以在doGetAuthorizationInfo臨時(shí)打印一下查出來的角色和權(quán)限集合log.debug(用戶 {} 的角色: {}, user.getUsername(), roleCodes); log.debug(用戶 {} 的權(quán)限: {}, user.getUsername(), permCodes);然后調(diào)用權(quán)限判斷的地方也打印一下請(qǐng)求權(quán)限log.debug(判斷權(quán)限: {}, permission);兩端日志一對(duì)照問題大概率立刻暴露要么是權(quán)限沒查到要么是權(quán)限字符串格式不對(duì)。舉個(gè)例子數(shù)據(jù)庫權(quán)限表里存的是order:export代碼里注解寫的是RequiresPermissions(order:export)理論上沒問題但如果權(quán)限表里存成了order_export或者export那永遠(yuǎn)匹配不上。這種問題靠眼睛看數(shù)據(jù)庫就能快速定位。4.3 授權(quán)在三個(gè)業(yè)務(wù)層的落地姿勢(shì)Realm 提供的權(quán)限數(shù)據(jù)是地基但最終要作用到業(yè)務(wù)的三個(gè)位置第一層是 URL 過濾。在ShiroFilterFactoryBean里配置filterChainDefinitionMap比如/order/** perms[order:list]請(qǐng)求沒經(jīng)過 URL 層就攔截掉。這層適合做粗粒度模塊控制。第二層是方法注解。用RequiresRoles(admin)、RequiresPermissions(order:export)標(biāo)記在 Controller 方法或 Service 方法上適合做細(xì)粒度操作控制。注意注解默認(rèn)是 AOP 攔截工作需要配置AuthorizationAttributeSourceAdvisor才能生效。第三層是頁面標(biāo)簽。JSP 環(huán)境下可以用shiro:hasPermission nameorder:exportVue 這類前后端分離項(xiàng)目則往往由后端接口返回權(quán)限碼列表前端自己控制按鈕顯示。我見過很多項(xiàng)目在 URL 層和注解層重復(fù)配置同一套權(quán)限導(dǎo)致一條規(guī)則要改兩處。我的經(jīng)驗(yàn)是模塊級(jí)規(guī)則放 URL 層操作級(jí)規(guī)則放注解層不要重復(fù)攔截。權(quán)限碼列表通過接口返回給前端這樣三層的權(quán)限來源統(tǒng)一不至于各寫一套。5. 生產(chǎn)環(huán)境中授權(quán)相關(guān)的常見坑與解法5.1 權(quán)限變更后用戶權(quán)限不更新的問題這是授權(quán)功能上線后最常遇到的投訴“管理員給張三加了導(dǎo)出權(quán)限張三刷新頁面還是看不到導(dǎo)出按鈕”。原因前面說過AuthorizingRealm開了緩存后授權(quán)數(shù)據(jù)被快照在緩存里數(shù)據(jù)庫變更不會(huì)自動(dòng)推送給緩存。處理方案要看你的緩存介質(zhì)。如果用本地EhCache只能在權(quán)限變更時(shí)調(diào)realm.clearCachedAuthorizationInfo(principals)但要拿到用戶對(duì)應(yīng)的 principals 需要額外構(gòu)造。如果用 Redis推薦在權(quán)限變更服務(wù)里主動(dòng)刪除對(duì)應(yīng)用戶的 cache keykey 的命名規(guī)則要和你securityManager.setCacheManager(...)配置的序列化策略一致。我實(shí)際項(xiàng)目中更傾向的方案是授權(quán)緩存不用 Shiro 自帶的 CacheManager而是自己封裝一層回調(diào)。權(quán)限變更后通過消息隊(duì)列廣播一個(gè)用戶 ID所有節(jié)點(diǎn)都刪除該用戶授權(quán)緩存。這樣既保證了多實(shí)例環(huán)境的一致性也不至于為了清緩存引入復(fù)雜的分布式鎖。5.2 多個(gè) Realm 協(xié)同工作時(shí)的授權(quán)合并陷阱有些系統(tǒng)會(huì)配置多個(gè) Realm比如一個(gè)UserRealm處理賬號(hào)密碼登錄一個(gè)TokenRealm處理免登令牌。此時(shí)ModularRealmAuthorizer的默認(rèn)行為是任何一個(gè) Realm 的授權(quán)數(shù)據(jù)命中即算通過。這帶來的一個(gè)奇怪現(xiàn)象是用戶能登錄但判權(quán)限時(shí) Shiro 同時(shí)問兩個(gè) Realm 要授權(quán)數(shù)據(jù)。UserRealm里查不到角色的用戶請(qǐng)求subject.hasRole(admin)時(shí)TokenRealm如果也實(shí)現(xiàn)了doGetAuthorizationInfo并且返回了 admin 角色那這個(gè)用戶居然也能算作管理員。要處理這種隱患建議在doGetAuthorizationInfo里約束數(shù)據(jù)的適用范圍。最簡(jiǎn)單的方式是沒有用戶數(shù)據(jù)的 Realm 直接返回null或空AuthorizationInfo不要含糊地放一個(gè)空集合。另一個(gè)方式是重寫ModularRealmAuthorizer的核心邏輯按 principal 來源區(qū)分我只認(rèn)某個(gè) realm 的數(shù)據(jù)。不過這個(gè)方案配置成本高大多數(shù)業(yè)務(wù)場(chǎng)景用“不越權(quán)返回?cái)?shù)據(jù)”就能規(guī)避。5.3 授權(quán)查詢頻繁打到數(shù)據(jù)庫權(quán)限判斷本身是高頻操作。登錄用戶每次刷新頁面可能要觸發(fā)幾十次isPermitted()如果你忘了開緩存每一次都會(huì)進(jìn)doGetAuthorizationInfo。運(yùn)氣好命中慢查詢運(yùn)氣不好就是連接池打滿。排查方法很簡(jiǎn)單打開數(shù)據(jù)庫慢查詢?nèi)罩居^察授權(quán) SQL 的執(zhí)行頻次。解決路徑分兩步第一步開啟authorizationCachingEnabled第二步是給doGetAuthorizationInfo里的查詢加索引。sys_user_role和sys_role_permission兩張關(guān)聯(lián)表userId、roleId 字段必須有索引否則數(shù)據(jù)量上來必炸。5.4 權(quán)限字符串因大小寫和空格匹配不上數(shù)據(jù)庫里權(quán)限碼不規(guī)范是家常便飯。有人存的是Order:Export有人復(fù)制時(shí)多了個(gè)空格Shiro 默認(rèn)的WildcardPermission做的是精確字符串拆分匹配大小寫不同都算不匹配。想從源頭杜絕必須在權(quán)限維護(hù)頁面做輸入清洗統(tǒng)一轉(zhuǎn)小寫、去掉兩側(cè)空格、限制只能使用字母數(shù)字冒號(hào)星號(hào)逗號(hào)。同時(shí)在doGetAuthorizationInfo里也做一次trim().toLowerCase()兜底。不要指望靠配置 Shiro 的WildcardPermission來做大小寫忽略它沒有這個(gè)開關(guān)。6. 權(quán)限設(shè)計(jì)層面的一些建議6.1 權(quán)限點(diǎn)細(xì)到操作角色粗到入口做完技術(shù)實(shí)現(xiàn)我更想聊聊權(quán)限模型設(shè)計(jì)這部分經(jīng)驗(yàn)在很多項(xiàng)目里比代碼更值錢。我見過兩種極端一種是把權(quán)限細(xì)到“看見訂單金額”這種字段級(jí)結(jié)果是權(quán)限表爆炸維護(hù)成本極高另一種是只有三四套角色一個(gè)“管理員”走天下結(jié)果業(yè)務(wù)根本沒法精細(xì)管控。平衡點(diǎn)通常是把權(quán)限點(diǎn)設(shè)計(jì)到“模塊操作”粒度比如order:export、user:resetPwd至于字段級(jí)的數(shù)據(jù)權(quán)限應(yīng)該通過查詢條件動(dòng)態(tài)過濾而不是塞進(jìn)權(quán)限框架。角色則盡量保持在個(gè)位數(shù)級(jí)別比如系統(tǒng)管理員、普通用戶、審計(jì)員、外部合作方。角色和權(quán)限之間是組合關(guān)系角色代表一種可授權(quán)的行為集合不要在系統(tǒng)里搞出幾百個(gè)組合角色。6.2 不要在業(yè)務(wù)代碼里硬編碼權(quán)限判斷雖然 Shiro 提供了subject.isPermitted()這種代碼級(jí)判斷但我不建議在業(yè)務(wù)方法里到處寫 if 硬編碼。硬編碼權(quán)限邏輯散落在各業(yè)務(wù)層等權(quán)限規(guī)則調(diào)整時(shí)你會(huì)陷入改代碼的噩夢(mèng)。我更推薦的做法是接口上用注解聲明所需權(quán)限統(tǒng)一由 AOP 攔截特殊場(chǎng)景比如同一個(gè)接口針對(duì)“本人”和“管理員”返回不同數(shù)據(jù)才在 Service 里顯式判斷并封裝一個(gè)PermissionChecker工具類避免直接和 Subject API 耦合。這樣權(quán)限需求變更時(shí)大多數(shù)情況只需要調(diào)整數(shù)據(jù)庫權(quán)限配置不需要重新發(fā)版。6.3 從最小可用權(quán)限模型開始迭代最后一條建議給剛開始接觸 Shiro 的團(tuán)隊(duì)不要上來就設(shè)計(jì)五張表加一套復(fù)雜的動(dòng)態(tài)權(quán)限體系。先按“用戶-角色”二級(jí)模型跑通授權(quán)鏈路把doGetAuthorizationInfo的骨架搭好等業(yè)務(wù)真的出現(xiàn)“操作級(jí)精細(xì)管控”需求再加權(quán)限表、角色權(quán)限關(guān)聯(lián)表。安全框架的價(jià)值在于穩(wěn)定可靠地?cái)r住不該放行的人而不是一開始就堆功能。我的經(jīng)驗(yàn)是框架本身的靈活度足夠支撐從簡(jiǎn)單到復(fù)雜的演進(jìn)。你先把授權(quán)通了后面加權(quán)限點(diǎn)只是往數(shù)據(jù)庫里插幾行數(shù)據(jù)的事完全不用改架構(gòu)。這個(gè)系列走到第十篇自定義 Realm 的授權(quán)部分算是徹底講透了。從定位到實(shí)現(xiàn)再到排坑該注意的地方都標(biāo)注了。如果你正在改造老項(xiàng)目的權(quán)限模塊建議先按第 5 部分的幾個(gè)坑對(duì)照一下現(xiàn)有代碼往往能少熬好幾個(gè)夜。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
97视频在线观看高清资源| 欧美熟女妇同| 欧美日韩天堂| 亚洲少妇综合在线播放| 欧美白嫩在线放| 天天看片青娱乐| 无码在线亚洲| 成人情色综合网| 国语精品内射在线观看| 狠狠躁久久躁| 午夜丁香| 91制服丝袜中文字幕| 久久99午夜精品一区人妻| 9999亚洲电影| 又黄又粗又硬又长又大| 天天做日日做天天欢。| 色综合99999| 亚洲图片激情综合另类| 91N综合网| 欧美系列在线一区二区| 91色人| 91精品啪在线观看国产城中村| 中文字幕97色| www.色操逼| 99久在线精品99re8| 日韩操逼HD| 亚州春色| 亚洲五月天激情| 久久9久久| 亚洲经典啪啪| 欧美亚洲图片| 亚洲瓯美色图| 91高清无码下载| 国产精品禁久久久精品| 偷拍 精品另类 凸凹了四区| 欧美999| 欧美性爱一内片一区二区三区| 精品人妻一区二区三区四区石在线| 6080yy午夜理论三级一区二区三区无码| 日本Suv精品一区二区| 色色婷婷五月| 欧美黄色手机在线观看| 精品二999| 色一情一乱一乱一区91Av| 97超碰精品图片| 日本亚洲vr欧美不卡高清专区| yaouchengrenav| 亚洲宗合网| 女同性恋久久| 日本无码1| 亚洲日韩资源| 五月天精品| 国产女上位好爽在线| 91丨豆花丨熟女| julia ann久久| 国产日韩精品一区二区三区| 久久高清欧美国产| 国产在线播放成人免费| 热久久无毒不卡| 91狠狠综合久久久久久| 亚洲 欧美 制服 另类 自拍| 91色射| 亚洲天堂自拍| www.97在线| 成人三级片无码| 久久六六| 欧美综合综合| 日本中文字幕一区| 高凊专区人人操| 亚洲精品蜜桃久久久一区二区三区| 亚洲国产精品有声| 精品蜜乳AV免费观看| 国产精品大屁股999| 人妻天天夜夜爽一区二区| 淫荡熟女乱伦网| 狠狠干91| 91高潮| 啊啊啊啊在线播放| 有码人妻系列| 97色色视频| 久久久无码av精| 97干97色| 大香蕉99999| 九一性生活免费视频| 人妻碰碰碰碰碰碰| 狠狠操狠狠插| 亚洲五月婷婷| 亚洲精品日韩国产欧美| 最新三级网址| 日日操免费视频| 99av| 精品午夜福利| 91欧美亚洲| 91熟女视频网| 高潮9999外国| 精品高清牛人盗摄一区二区三区中文字幕A片免费在线观看 | 欧美性生活男人的天堂| 日本高清免费一本视频在线观看| 熟妇一区二区| 校园春色五月天| 人妻少妇色综合| 少妇人妻好深太紧了vr91| 91五月天| 麻豆国产97在线| 国产美女91| 中文一区在线日| 少妇啪啪自拍| 国产av激情无码久久天堂| 东京太热男人的天堂久久久| 9久9久9久9久视频网站| 91 国产丝袜在线播放-百度| 无码视频一区二区| 亚洲 欧美都市激情| 欧美色图天堂在线| 91麻豆一二三区| 久久、1234| 久久这里精品国产99丫e6| 清纯唯美亚洲另类| 91宗合网| 日本乱人伦片中文三区| 国内精品嫩模A∨私拍小视频| 久久久久国产精品久久久| 久久这里只有精品9| 九九九999久久久网站| 超碰97国产欧美| 玖玖久久久| 国产1024在线播放| 日韩欧美综合激情| 国产性感骚丝袜在线| 中文有码第五页| 夜草欧美| 欧美热图99| 极品肉射| 亚洲另类欧美精品| 日韩中文字幕视频在线观看| 色婷婷五月天| 97超级欧美| 伊人9| 高潮9999外国| 国内毛片无遮挡国产| 99久久久久久亚洲精品不卡| 国产一区二区三区影片| 久久精品亚洲婷婷| 日日爽熟女| 国产精品电影大全| 成人八戒网站| 福利天堂| 日韩欧美午夜一区二区| 婷婷久久五月| 曰本91情色| 久久老熟女| 国产午夜福利电影免费在线观看 | 国模91| 欧美色乱| 无码操逼网| 久久午夜伦| 精品人妻无码一区二区三区不卡-精品人妻无码一区二区...|精品少妇一区二区三 | 五月天伊人网| 国产av强奸美女| 亚洲五月丁香花狠狠干一区二区三区 | 中文字幕视频一区视频二区| 色臀AV| 岛国免费黄色网址| 国产丝袜美女诱惑| 婷婷九月丁香| 国内精品久久久久影院亚洲| 天天日天天射天天干| 97在线亚洲| 正在播放国产精品一区| 天天影视综合色| 国产97在线视频| 免费一级特黄特色大片在线观看看| 狠狠综合网| 精彩久久中文| 久久久久久久久久久免费精品| 色五月婷婷久久| 粉嫩久久久久| 大香蕉乱级| www.99热| 久久久96精品| 一区二区三区欧美激情| 风骚少妇视频中文字幕| 国产女人和拘做爰视频 | 日韩国产成人自拍视频| 美女大乳久久久久久久女人18| 96麻豆精品一区二区三区| 无遮挡h肉动漫在线观看| 婷婷色香| 美女一区二区国产精品| 天天舔天天日天天射| 一级成人性爱| 亚州高清色综合| 人妻干天天| 97精品国产97久久久久久免费| 亚洲欧洲综合| 亚洲激情网一二三四区| 亚洲欧美97√| 日本91白丝| 草草草视频| 久久综合99| 超碰 国产熟女精品一区| 91强热人妻| 青青草日本中文字幕| 99婷婷一区二区| 99re3这里只有精品| 青草精品视频-日本久久久久网站| 久久香蕉国产线看观看猫咪av| 97精品久久久久中文字幕| 黄片qw| 欧美日韩222| 国产精品 视频| 亚洲综合在线高清| 久久 国产 无码| 天天干天天日天天射黄色片| 太久视频| 国产嫩草精品A88AV| 婷婷成人五月天| 在线视频97| 中文字幕精品人妻丝袜| 美女尤物人人操| 大香蕉日韩欧美| 久久久网站| 美女诱惑久久| 亚洲中文电影| 国产福利影视| 在线观看中文字幕| 亚洲第一页综合在线| 三级三久久线久久99久目本WW| www欧美91| 色婷婷aV一区二区三区麻豆综合| 都市久久精品激情亚洲| 天天综合,91入口| 四虎在线视频| 日韩精品人妻系列无码天堂| 国产精品探花视频| 亚洲欧美日韩中文播放| 久草综合视频| 99免费视频| 韩美日操逼| 校园春色综合香蕉| 97久久久久久久精| 欧美aaaaaaa| 97鸡把在线视频| 欧美 青青草| 女人高潮抽搐喷水视频网站| 肏逼视频日本| 精品在线78| 91爱综合| 精品国产久热在线观看| 乱性AV| 韩日自拍| 色女99一级片在线观看| 看看小穴| 色官网在线| 极品综合| 亚洲伊人久久综合97| 欧美亚洲激情一二三| 韩国一区二区精品亚洲| 色牛牛AV| 黑人精品成人一区二区三区| 精品久久久久久中文| 国产一区二区在线播放| 99热这里只有精品1| 色九九九| 日韩三级一区| 亚洲中文字母在线播放| 淫荡少妇免费| 一区二区三区视频国产免费| 一区二区免费电影久久| 久久久久久久久999| 美性中文综合网| 2025亚洲男人天堂| 天天色粽合合合合合合合| 一牛影视成人片免费| 综合伊人激情| 欧美大香蕉久| 日韩精品中文字幕人妻| 亚洲 暴爽 AV人人爽日日碰| 亚洲情色 自拍| 啊啊啊啊好疼视频| 老司机午夜福利视频一区二区| 夜夜操二区| 啊视频在线| 把腿张开老子CAO烂你| 高清在线不卡一区二区 视频| 日本不卡在线二区三区| 久久尹人大香焦视| 国内一级精品| 欧美综合色图片| 疯操AV| 精品一区二区久久| 天天操熟妇| 欧美色爱综合| 久久久久白虎| 97精品免费| av黄图片在线观看| 久久首页| 亚洲一级特黄大片在线播放91| 国产最新小视频在线播放下载| 国产强奸AV在线| 婷婷激情四射| 在线观看精品国产免费| 亚洲天堂,男人| 人妻天天夜夜爽一区二区| 99热这里都是精品| 五月久久HDAV| 67914在线精品观看| 国产精品乱人伊人网| 九九热九九热| 二对二中文字幕。| 日韩综合色网| 亚洲人天堂| 欧美高清18A片| 国产精品亚洲无码| 欧美成人一区二区三区在线播放| 青青草视频久久| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 亚洲影视高清第一页| 欧美色97| 性色AV蜜色av色欲av| 天天视频网站黄| 国产精品无码久久久久2025| 大香蕉丝袜一级片| 久久久久久久九九九九九九| 亚州色阁| 91人人| 国产成人拍国产亚洲精品| 亚洲乱色熟女一区| 婷婷综合网站| 久久夜色一区二区| 色与欲影视天天看综合网| 97久久国产| Sekablack无码一区| 视频在线观看免费一区二区三区| 伊人久久婷婷| 天天干天天日天天射黄色片| 蜜臀va69| 日本韩国国产精品一区| 伊人女女资源在线观看| 91欧美成人色站| 天天干夜夜操一区二区| 亚洲欧美日韩免费电影| 涩五月婷婷| 99999精品成人| 夫妻AV网站| 26UUU欧美日本| 亚洲砖码砖专无区2023| 色狠人在线99| 91肉片| 国产a级午夜毛片| 白丝AV网站| 蜜汁欧美| 多毛小伙内射老太婆| 翘臀vidoes| 国产AV线| 人人看人人爰人人操| 91婷婷| 亚洲精品97中文字幕| 又粗又长又大国产不卡| 欧美很很操视频| 性生活久久久久久久久久| 天天夜夜rb| 伦伦成年午夜免费视频| 久草精品国产蜜臀| 97啪啪| 久久婷五月天| 激情视频图片| 婷婷色香| 草草草视频在线免费看| 欧美另类色| 凹凸 69堂 在线播放| xxx0国产在线播放| 综合色拍| 成人精品久久久午夜福利| 久久午夜伦| 精品国产a∨一区天美传媒| 乱伦a片视频| 亚洲欧洲小说图片视频| 亚洲欧美色图片| 女人高潮大叫一级毛片| 亚洲日本天堂| 性开放中文AV高清无码免费看| 欧美狠狠弄| yw尤物av无码点击进入麻豆| 情侣开房子拍 日韩无码 女的很漂亮| 欧美色图99| 国产精品久久久久久久久AV大片| 日本97久久| 亚洲AV成人无码久久精品播放| 国产成人主播| 黄色AAAAA欧美| 久久久久ab| 午夜操逼不卡| 色偷偷人人玩人人舔人人操人人摸人人爽| 上海一级黄片| 色噜噜日韩精品| www.色婷婷色综合| 青青草这里只有精品| 亚洲经典啪啪| 欧美 亚洲精品首页| 丁香五月自拍| 亚州一区二区| 嗯~啊~快点 死我视频| 91精品人| 欧美中字二区| 欧美另类综合久久| 国产sv美女内射| 午夜天天碰综合视频| 久久男人的天堂| 欧美熟妇精品黑人巨大一二三区| 玖玖爱在线视频免费观看| 国产农村妇女精品1区二区| 欧美传媒| 欧美综合亚洲| 射丝袜高跟鞋99| 黄色电影在线播放综合网站| 高清不卡 中文 人妻| 美女被艹尤物视频| 神马久久久久久久| 国产精品天干天干综合网麻豆| blacked精品一区国产| 精品人妻高清麻豆av| 色老汉玖玖爱| 黄片色区软件| 97鸡把在线视频| 中文字幕日产av人| 天堂中文日本在线观看| 97九色| 天美欧美国产| 日韩无码专区| 无码外流操逼视频| 亚洲少妇视频| 欧美亚洲日韩16色| 欧美黑人猛交春色影视大全| 国产亚洲精品第一最新| 中文字幕国产在线天堂| 日韩欧美~中文字| 天天影视综合色| 青青草九九九九九| 久久亚洲精品成人av| av激情亚洲五月天| 欧美精品欧美精品系列| 国产传媒日本欧美专区| 二色av| 岛国免费黄色网址| 国产精品白丝| 桑老女人九区| 骚女高跟AV在线| 婷婷色一区| 九月丁香综合网| 12一15性XXXX粉嫩国产| 久久精品28| 91路www| 综合网,亚洲,欧美| 五月婷婷六月丁香| 九色视频91| 一级片在线观看高清无码| 少妇久久久久| 熟女少妇一区二区三区| 综合色久欲| 精品小视频在线| 久久9精品视频| 很很干很很操| 啪啪啪综合网| 女人高潮抽搐喷水视频网站| 啪一啪免费视频| 99这里只有精品国产| 欧美中文字幕精品人妻| 天天干人人乐| 操一对老熟妇爽上天视频| 啊灬啊灬啊灬啊灬高潮奶出了免费视 | 黄色人人| 男女啪啪啪18禁网站| 九九操久久国产免费视频| 啊啊啊啊啊啊啊在线| 亚洲91亚洲| 蜜色网色哟哟| 91蜜臀在线久久久久| 丁香激情网| 99视频在线| 日韩精品一区二区三区色欲| 亚洲黄网在哪免费看| 久久黄色性爱视频| 26uuu国产成人综合| 欧美不卡二区| 91精品啪在线观看国产城中村| 免费一级黄色录像影片| 黄色在线网站| 成人性爱全视频观看| 亚洲综合精品国产一区| 免费在线观看AV无码网站| 无码 有码 国产18p| 国产一级黄色片在线观看| 黄色小视频日本txt| 天天做日日做天天欢。| 99热啪啪| 色噜噜人妻av 中文字幕| 九九精品美女高溯喷水| 鸥美精品一区二区久久婷婷| 99在线啪| 蜜臀Av一区二区三区| 久久久久久十| 亚洲美女AV无码| se吧提供91精品国产91久久久久久| 国产探花日韩援交| 精品国产乱码久久久久久口爆网站| 亚洲美女自拍偷拍视频| 婷婷月色| 日本男人插女人的逼黄色| 天天爱综合网| 97超碰超碰| 人妻一二三区| 国产麻豆一级精品视频| 亚洲一区中文字幕久久,果冻传媒一区二区天美传媒 | 免费操逼视频下载| 日本熟妇一区二区三区| 国产传媒1234区| 天美一区在线| 国产99999| 桃花色综合影院| 激情干在线| 婷婷色一区| 中文字幕诱惑制服人妻丝袜美丝袜美 | 9999伦理视频| 亚洲精品乱码线路中文字幕 | 精品成人亚洲午夜电影| 色色婷| 99操| 日本加勒比无码专区| 国产午夜福利电影免费在线观看 | 国产91 丝袜在线播放 | 久久综合精品一区二区三区| 国产精品探花视频| 天天色香欲综合网| 免费草草草草草视频| 欧美日韩在线小说| 亚洲导航深夜福利| 国产欧美日韩女同性恋ww喷水精品 | 欧美国产婷婷久久| 99国产精品视频尤物| 1024人妻| 99999这里都精品| 国产精品视频内谢女人| 无码伊人久久大杳蕉中文无码| 九九九九88| 校园春色 亚洲| 伊人精品久久网站| 青青11操操操操操操操操| 人妻熟女一区二区| 午夜人人操| 午夜免费视频1000| 亚州色国| 乱伦熟女专区| 天美国产精品| 精人妻一区二区三区| 久久久久亚洲AV无码专区少妇| 黄色AV影视| 亚洲欧美内射| 日韩欧美国产高清视频| 91久久堂| 国产亚洲欧美每日在线| 无码一区二区三区四区五区六区七区八区九区十区视频 | 久久久久九九九| 2000亚洲男人天堂| 人人干黄色| 97综合在线观看| 超碰九区| 性爱动态120秒| 97人人夜| 超碰免费人人| 久久久久久999| 日本中文字幕在线视频| 伊人在线大香蕉视频久久| 黄片视频,下载| 骚逼一区二区| 91精品久久久久五月天精品 | 婷婷色色五月天| 97国产精选| 久草福利在线资源站| 国产精品久久久久999| 十八禁的黄污污免费网站| 欧美视频激情久久久久久| 国产精品麻豆成人av| 中文字幕88av在线| 国产亚洲精品激情| 91欧美另类| 亚洲成人一区二区精品| 99re6在线视频精品免费完整版安卓版| 日韩在线性爱免费视频| 97超碰总站| 亚洲第一在线视频| 91色宗合| 夜夜嗨AV蜜臀av| 国产91av在线播放| 久久精品国产久精国产| 俺去俺来也在线www| 亚洲精品蜜桃久久久| 97人人草| 亚洲精品一二牛牛| 龙兴卡官方查询| 亚洲一本大道中文字幕无码在线| 秘书高跟黑色丝袜国产91在线| 99精品在线| 操逼操2| 91亚洲综合在线| 天天射影院| 亚洲伊人久久综合97| 嗯嗯,好大,好爽,好骚 | 国产精品黑人一区二区三区| 9久精品视频在线观看| 国产激情av女片自拍| 99精品九九九九九九| 高潮内射在线| 3d成人精品一区二区| 怡春院久久| 爱欲AV| 亚洲日韩成人性爱视频| 91视频综合网| 91国内外在线| 老女人爆菊| 久久91视频| 夜夜欢天天干| 中文字幕、久久精品国产2020、久久综合久久自在自线精品自、亚洲 | 视频在线观看一二三区| 91高清无码下载| 日骚逼视频| 好屌色综合| 五月丁香| 色欲蜜臀AV| 99无码狠狠久久| 中出20p| 台湾佬中文娱乐自偷自拍| 人人爱人人操人人性| 天美91| 少妇久久久免费| 国产视频一区二区三区久久亚洲天堂| 日韩欧美亚洲一区二区三区影院| 91啦人妻| 蜜臀一区二区三区亚洲最新章节在线观看 - 高清蜜臀一区二区三区亚洲全集播放 | 国产97av| 国产欧美后入| 久久婷婷在线观看视频| 91日本在线观看| 又粗又长又爽在线观看| 九九九九热| 久久久涩| 日本高清加勒比| 天天综合香 ld视频| 婷婷综合五月天| 日本熟妇人妻中出视频| 日韩无码精品综合久久| 精品人妻一二三| 亚洲天天自拍| 成人一级二级| 欧美少妇高潮久久91| 99999久久久久9国产精品| 五月丁香影视| 亚洲色诱惑| 亚洲情色中文字幕一区| 日韩在线性爱免费视频| 韩三级a视频在线观看 | 天堂亚洲精品| 91超碰在线观看| 日韩一级二级三级免费看完整版国语版| 中文字幕在线观看AV| 精品精品精品| 亚洲欧美精品一区天堂久久| www久久99| JULIA一区二区三区在线播放| 国产高清MV操逼视频| 岛国激情视频软件| 飘花国产午夜精品不卡| 手机看片日韩人妻| 国产中文字幕在线点播| 欧洲亚洲国产综合在线| 国产精品成人久久一区二区三区| 国产强奸乱伦无码视频| 在线免费观看高清无码视频| 韩国一级做a久久久久| 少妇高潮九九九九| 91夜色| 精品无码久久久久久久久果冻糖心| 香蕉99秘 一区精品蜜桃臀| 国产精品成人午夜福利| 婷婷爽人人婷婷爽视频| 亚洲国产精品无石码久久 | 另类欧美综合| 久操免费观看| 青娱乐淫乱1314| 国产狂喷潮在线精品| 日韩中文字幕视频| 欧美少妇性爱网站| 日本一区二区不卡精品| 免费综合亚洲中文| 综合五月天| 久久综合18p| 久久亚洲不卡一区二区三区| 97超碰资源网| 午夜超爽| 久久精品国产亚洲AV高级北京| AV无码久久久精品| 可以免费观看的AV| 国产久久久9999| 97超碰免费人人性爱| 97超碰免费生活| 日韩无码第3页| 电家庭影院午夜69久久夜色精品国产69乱| 毛片一区二区| 精品亚洲国产成人精品| 丁香五月综合| 久久超碰亚洲人| 亚洲天堂日本| 亚洲成成熟女人综合一区二区| 超碰95| 亚洲无吗在线视频| 婷婷色综合| 欧美页片| 九九热av| 成人av影院在线观看| 国产大学生高潮在线播放| 久久久精品国产亚洲伊人| 久久久久ab| julia国产在线| 色欲Av人妻精品一区二| 国产18精品亚洲精品| 久久一二区四| 亚洲在线A| 国产精品久久久久久久无码AV| 91成人久久| 精品国产少妇高潮视频| 日韩大香蕉精品在线视频| 91成人无码| 无码精品人妻一区二区三区妖精| 校园春色 男人天堂| 日韩精品9区| 久操精品| 亚洲中文一区二区三区视频| 国产60区。| 国产精品乱码久久久| 蜜乳AV一区| 天堂资源欧美| 综合亚洲欧美| 中文操嬖片。| 99综合自拍| 亚洲丝袜诱惑| 无码日韩网站| 色综合99999| 国产无码三级视频在线观看| 国产成人综合网| 亚洲日韩少妇一道本视频| 久久只有精品| 婷婷五月天_亚洲小说欧美激情另类_精品久久国产字幕 | 国产精品999zyz| 91女网站| 国内一区二区免费| 九九Av| 激情久久日韩精品中文字幕麻豆| 欧美日韩插逼视频| 日韩乱码Av| 日日骚一区二区三区| 午夜福利1区2区3区| 久久精品国产亚洲AV片多多| 激情丁香五月| 亚洲第一视频 欧美风情 日韩| 丰满人妻一区二区三区四区| 九九热超碰97亚洲最新香蕉 | 中国熟妇| 五月丁香婷婷综合网| 国产91专区| 日本高清_区二区三区| 国产九区| 成人av影院在线观看| 秋霞男人网| 天天干天天舔| 男人天堂日日夜夜| 92性色国产午夜福利在线661| 91亚洲黑人| 91视频在线观看18| 欧美视频在线第3页| 猛猛干| 亚洲丝袜二区| 搡老女人老熟女91| 在线女人91| AAAA欧美日韩| 麻豆性爱视频在线播放| 中文字幕一区二区三区字幕| 国产精品。| 变态乱伦伪娘灌肠一区二区| 97在线青| 最近的最新的中文字幕视频| 疯操AV| 99精品久久| 国产60页| 加勒比AV网| 黄色区免费观看中文字幕| 青青草中日韩在线| 大香蕉啪啪啪| 麻豆久久精品亚洲精品88 | 亚洲国产日韩欧美熟妇在线| 久久精品导航| 色性荡荡荡荡视频| 免费a级毛片av无码久久精品中文字幕| 欧洲精品在线播放| 色综合久久88色综合久久天天| 亚洲情色无码一区二区三区| 九月色婷婷| 亚洲在线网站| 美女爽爽爽刺痛洞洞| 五月婷婷无码| 黄污污污污| 欧美组图日韩亚洲中文字幕| 东北女人的毛片| 国产 v乱码一区二| 欧美极品| 日日日色色色色色| 久久精品国产精品亚洲艾通辽熟妇 | 亚洲高潮影院| 日本不卡码黄色| 欧美日韩性爱无码| 欧美 亚洲 第一页| 欧美日动态视频| aaa一级黄片| 亚洲中文字幕熟女| 天天影视网色欲色香| 日韩精品国产精品五码一区二区| 国产又猛又粗又爽又黄| 熟妇无码视频三区| 亚洲情色1区| www网站黄| 国产JDAV无码视频在线观看| yazhouzaixian| 人妻出轨一区二区三区| 免费的黄片wwwwww| 精品国产三级av韩国在线| 天天干1区2区在线| 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | 国产精品久久久久久久久久久久久久吹| 中文字幕乱碼在线| 爱我干综合| 欧美一二三级精品在线| 少妇色欲综合网2| 亚洲蜜臀懂色| 欧美躁死她一区二区| 亚洲精品xxx| 思思久热在线精品66| 人妻人久久精品中文字幕| 色九月综合| 骚逼高潮久久精品| 人人摸人人干人人拍97| 夜夜草天天| 欧亚日韩中文在线| 日本97久久| 金典av| 秋霞男人网| 日韩AV电影网站 | ji熟女.com| 超碰97久久| 亚洲久久天堂| 啊啊啊啊好疼视频| 性生活无遮挡纯毛片在线看| 九九毛片这里只有精品| 日韩成人免费电影| 综合久久六月久久婷婷| 岛国福利在线精品播放| 91美女视频| 夜夜躁狠狠躁日日躁av| 尤物视频新赏网鲜网色诱网| 亚洲黄色网址| 99蜜桃臀亚洲成人在线观看| 操穴国产| 96精品在线| 思思99热| 骚逼高潮久久精品| 国产一级片| 爱做久久久久久| 亚州AV无码国产精品| 熟女五十路一区二区三| 国产精品ⅴ无码大片在线看.| 日韩精品在线视频,日韩精品……| 麻豆av一区二区| 亚洲无码一区成人免费午夜 | 2026国产精品视频| julia中文字幕在线观看| 麻豆精品A片免费观看| 欲色影视综合吧| 亚洲国成人情色好看电影| 麻豆国产av网| 日本加靬比网站发布页| 久久精品72| 日韩美女,国产传媒,视频一区| 自拍欧美| 综合视频91| 日本高清加勒比| 熟妇高潮二区三区| av2014 日韩在线中文字幕| 桑老女人九区| 天天操天天舔| 国产品精品自在在线午夜免费| 国产高清自拍视频| 人人干人人操人人爱| 人妻丰满熟妇一区二区三| 韩国一级婬片A片无码天美 | 国产亚洲色婷婷久久99精品91 - 百度| 超碰在线一区| 日韩av免费一级电影| 免费一级黄色录像影片| 婷婷视频在线免费观看| 超碰碰碰碰| 国产视频三区四区| 亚洲永久永久永久永久一级一级一级精品| 成人五月天色网| 日韩中文字幕精品一二三事国产精品 | 日本天天色| 日韩一区二区熟女| 高清肉丝中文无码| 亚洲精品熟妇1区2区3区。| 久久黄人人爽视频| 天天日天天干天天色| 激情网色| 伊人色综合网| 欧美性爱一区二区三区四区| 色香91| 白丝一区| 3d成人精品一区二区| 色欲久久综合| 久热精品色情| 欧美成人A天堂片在线观看| 国产欧美岛国精品一区| 狠狠干综合| 91总综合网| 日本二区不卡| 国产家庭乱伦表演| 精品区国产区一区二区三区| 国产欧美日韩女同性恋ww喷水精品| 亚洲人妻熟妇三十三区| 疯操AV| 日日操免费视频| 亚欧性爱在线无码| 欧美日韩电影一区二区| 日韩成人小视频| 翔田千里Av在线| 九九色逼| 亚洲精品1区| 日韩色| 18禁超污无遮挡无码免费网| 大香蕉伊人亚洲| 精品人妻一区二区蜜桃视频 | 久久超碰天天| 天天激情综合站| 欧美成人精品A片免费一区99| 性色国产东北露脸精品视频| 欧美色九九| jizzjizz欧美| 国产偷仑| 97欧美| 秋霞一级视频在线观看免费| 老熟女熟妇| 青草精品视频日本久久久久网站在线| 手机在线播放国产福利| 按摩中文字幕| 极品色综合| 亚洲无码一区二区三区三州| 久久久网一区| 日本国产欧美一区三区二区 | 国产三区免费在线观看| 日本日日色视频| 久久78| 九九内射在线| 久肏视频字幕| 日韩性爱再线视频| 精品9区| 婷婷在线视频在线观看| 久久免费老司机精品| 无码人妻一区二区三区四区老鸭窝| 盗摄女人妻在线| laoshunv91| 操逼逼一区视频| 精品人妻一区二区三区-国产精品| 中文字幕乱妇免费视频| 国产免费一区在线观看| 精品欧美日韩在线观看| 国模不卡| 久偷拍欧美日韩三区| 免费日韩黄片| 高潮嗯啊性感美女久久久| 国产精品不卡高清在线观看| 亚洲精品视频二区| 欧美色图20P| 五月天综合在线| 中国韩国明星一极片一区乱码毛片人妻熟女一区二区三区 | 丰满少妇精品一区二区| 在线无码操| 国模91| 黄色免费网页无码| 久久噜| 欧美日本一区二区a人| 新精精品久久精品| 亚洲乱码国产乱码精网站| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师 | 欧美78| 日韩一区二区高清在线观看的| 久久婷婷欧美| 亚洲黄色网址视频| 天天日骚逼熟女| 日本福利二区视频| 怡红院成人视频| 久久久无码国精品无码三区三区| 欧美亚洲首页| 99re6久热只有精品6在线直播 | V A在线| 区一二区日韩亚洲乱码av电影| 五月丁香六月综合缴清无码| 丝袜无码a片| 欧美日韩精品一区二区三区高清| 激情啪啪视频| 色综合久久888| 成人性交免费视频| 亚洲 中文 女同| 啪啪啪东京| 国产99999久久精品| 人人透人人操| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师黑人潮喷一 | 在线国产福利网址导航| 日夜尻逼网| 欧美色三级片91| 国产一区免费午夜视频| 97国产精品久久久久| 五月婷婷五月天| 亚洲一区日韩精品中文字幕| 亚洲自拍一区夜夜操| 国产色呦呦| 久久久亚洲| AV在线资源| 99操逼| 秋霞一级鲁丝片A片| 青青草中日韩在线| 麻豆天美电影一区二区| wwwxxx日本爽| 久久久久成人网| 久久亚洲天天做| 日本福利二区视频| 日韩日本欧美在线观看| 中文熟女五十乱码在线| 蜜桃久久综合视频| 狼狼色丁香久久婷婷综合五月| 另类图片五月天| 日日干日日操五月天伦理视频| 欧美大香蕉专区网| 啊啊啊啊啊啊在线观看| 精吧天堂| 怡红院怡春院| 国模精品娜娜一二三区| 亚洲欧美日韩制服另类| 丰满欧美放荡少妇在线| 日本熟人妻中文字幕在线|...久久国产精品-国产精品_日本一区二区三区中文字幕 | 麻豆久久久一区二区| 国产女人与拘做受视频免费 | 碰人碰碰人人开房人肉| 久久久久久久少妇| 婷婷丁香成人| 无码丰满熟妇一区二区浪潮AV| 99re久久| 91精产一区二区三区| 91九久| 在线播放成人网站| 国产亚洲中文不卡二区| 精品久| 日本一二三免费久久| 欧美午夜视频| 中文字幕在线观看AV| 人人色人人操在线| 日本不卡高清视频| 天天视频黄| 欧美激情专区| 亚洲少妇综合| 中国黄色特级精品一区二区三区片| 97精品一二区| 调教熟妇 久久久久久| 国产精品久久成人免费| 亚洲图片婷婷五月天| 尤物av网站免费在线播放| 99re视频在线播放青草| 十八禁电影伊人网| 99精品伊人| 物尤视频一区二区| xxx亚洲午夜天堂| 色欧美天天| 伊人婷婷五月天| 免费看欧美美女黄色大片 | 日韩欧美大片免费高清啪啪| 欧美不在线| 97在线视频网站| 亚洲欧洲日韩中文字幕一区| 视频黄站| 美女网站黄页| 黄色十八禁| 久偷拍欧美日韩三区| 国产丰满少妇久久久精品影院| 亚洲成人在线高清| 黄片aaaaa一区| 偷拍三区| 99re热有精品视频国产| 家庭乱伦国产精品| 日韩激情电影中文字幕| 国产偷拍网站| 国产亚洲99久久精品熟| 欧美日韩在线视频网站| 高清国产精品福利网站| 一二三区操逼国产91| 97在线视频观看| 午夜男女爽爽大片免费观看| 操屄日韩| 秋霞网—男女啪啪亚洲免费体验区 | 国产久久日| 精品久久艹| 国产蜜臀在线| 久久中文字幕人妻熟av女蜜柚| 一本大道久| 欧美宗合色| 欧美色999| 日韩激情无码影院| 欧美天天干| 玖玖爱免费观看视频| 看一级黄色视频| 又大又白奶子| 精品一区二区三区最新| 磁力99AV| 色香91| 国产美女自拍视频| 操碰97| 伊人久久在线视频观看| 艹比视频国产精品| 91久久婷婷| 丰满翘臀美女影院视频| 大香网伊人久久综合网eew| 中文字幕诱惑制服人妻丝袜美丝袜美| 国产91丝袜在线播放蜜月| 婷婷丁香人妻 | 全球成人中文在线| 五月天婷婷色| 91色爽欧美| 国产精品久久久久999| 亚洲区 欧美区| 青娱乐老司机视频| 操B在线观看| 亚洲 欧美 91| 欧美91精彩| 青青在线视频免费| 国产无马在线| 天天干天天操天天干天天操 | 殴美在线AⅤ| 男人的天堂不卡一区二区| 国产亚卅97| 精品视频一区二区| 人人性爱视频免费| aⅴ日韩成人电影av在线免费看av大全 | 在线视频日韩欧美国产| 野狼激情网| 欧美天天综合站| 美女黄网|