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

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線(xià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)去了頁(yè)面上的按鈕該不該顯示、接口該不該讓調(diào)、數(shù)據(jù)該不該讓看這些才是一個(gè)安全框架真正值錢(qián)的地方。Shiro 的授權(quán)Authorization能力雖然接口簡(jiǎn)單但要把權(quán)限數(shù)據(jù)從數(shù)據(jù)庫(kù)里撈出來(lái)、裝進(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)問(wèn)題一次說(shuō)清楚。1. 自定義 Realm 在 Shiro 授權(quán)中的定位1.1 授權(quán)和認(rèn)證是兩套獨(dú)立的動(dòng)作很多人第一次接觸 Shiro 時(shí)會(huì)以為“登錄數(shù)據(jù)都從數(shù)據(jù)庫(kù)查了順手把權(quán)限也查出來(lái)不就行了”。邏輯上沒(méi)問(wèn)題但 Shiro 的設(shè)計(jì)把這兩件事拆得很干凈認(rèn)證回答“你是誰(shuí)”授權(quán)回答“你能干什么”。這兩件事在代碼層面分別對(duì)應(yīng) Realm 里的兩個(gè)方法——doGetAuthenticationInfo和doGetAuthorizationInfo。之所以非要拆開(kāi)是因?yàn)槭跈?quán)判斷發(fā)生的時(shí)機(jī)遠(yuǎn)比登錄時(shí)多。用戶(hù)登錄時(shí)你當(dāng)然可以查出他所有角色權(quán)限并塞進(jìn) Session但真實(shí)系統(tǒng)里權(quán)限經(jīng)常變化管理員給用戶(hù)加了個(gè)角色、用戶(hù)被移出了某個(gè)部門(mén)、權(quán)限菜單被調(diào)整。如果只在登錄時(shí)查一次那這些變更只能等用戶(hù)重新登錄才生效太不靈活。Shiro 的做法是每次執(zhí)行subject.isPermitted()或subject.hasRole()時(shí)動(dòng)態(tài)向 Realm 要一次授權(quán)數(shù)據(jù)再配合緩存把性能問(wèn)題解決掉。所以自定義 Realm 的授權(quán)部分本質(zhì)上就是實(shí)現(xiàn)一個(gè)“按用戶(hù)查角色和權(quán)限”的查詢(xún)器。你的業(yè)務(wù)邏輯再?gòu)?fù)雜最終都得收斂到給它返回一個(gè)AuthorizationInfo。1.2 內(nèi)置 Realm 的授權(quán)能力為什么不夠用Shiro 自帶了好幾款開(kāi)箱即用的 Realm比如IniRealm、PropertiesRealm、JdbcRealm。其中JdbcRealm最容易被拿來(lái)直接對(duì)接數(shù)據(jù)庫(kù)它默認(rèn)的權(quán)限查詢(xún) SQL 是這樣的select role_name from user_roles where username ?以及select permission from roles_permissions where role_name ?這套表結(jié)構(gòu)設(shè)計(jì)的初衷是“一個(gè)用戶(hù)直接關(guān)聯(lián)角色角色直接關(guān)聯(lián)權(quán)限”簡(jiǎn)單直接。但真實(shí)業(yè)務(wù)表很少長(zhǎng)這樣常見(jiàn)情況是用戶(hù)表、角色表、用戶(hù)角色關(guān)聯(lián)表、權(quán)限表、角色權(quán)限關(guān)聯(lián)表五張表起步而且用戶(hù)名可能是郵箱、手機(jī)號(hào)或企業(yè)內(nèi)部工號(hào)。你要是為了湊JdbcRealm的默認(rèn) SQL 去改業(yè)務(wù)表結(jié)構(gòu)那純粹是本末倒置。更關(guān)鍵的是JdbcRealm默認(rèn)權(quán)限模型過(guò)于扁平它無(wú)法表達(dá)層級(jí)權(quán)限也沒(méi)法讓你在權(quán)限數(shù)據(jù)里塞入自定義的過(guò)濾條件。所以項(xiàng)目的通用做法是把AuthorizingRealm拿過(guò)來(lái)繼承自己寫(xiě)查詢(xún)邏輯。這就是“自定義 Realm 實(shí)現(xiàn)授權(quán)”這個(gè)主題存在的根本原因。1.3 一條權(quán)限判斷背后的完整調(diào)用鏈我習(xí)慣在講代碼前先讓讀者腦子里有一張調(diào)用圖。你寫(xiě)業(yè)務(wù)代碼時(shí)只調(diào)了一句if (subject.isPermitted(order:export)) { // 允許導(dǎo)出訂單 }這一句話(huà)背后發(fā)生了什么完整鏈路大致是這樣Subject委托給SecurityManager。SecurityManager繼續(xù)傳給Authorizer默認(rèn)實(shí)現(xiàn)是ModularRealmAuthorizer。ModularRealmAuthorizer遍歷當(dāng)前 SecurityManager 里注冊(cè)的所有 Realm逐個(gè)詢(xún)問(wèn)realm.isPermitted(principal, permission)。每個(gè) Realm 內(nèi)部會(huì)先檢查緩存沒(méi)有緩存就調(diào)用doGetAuthorizationInfo(principalCollection)加載授權(quán)數(shù)據(jù)。授權(quán)數(shù)據(jù)拿到后和當(dāng)前要判斷的Permission做匹配返回 boolean。有意思的是第三步ModularRealmAuthorizer會(huì)“遍歷所有 Realm 并一票制決定結(jié)果”。這是什么意思只要有一個(gè) Realm 說(shuō)“允許”整個(gè)判斷結(jié)果就是允許。這意味著如果你同時(shí)配置了多個(gè) Realm哪怕某個(gè) Realm 里壓根查不到這個(gè)用戶(hù)的權(quán)限只要另一個(gè) Realm 查到了授權(quán)請(qǐng)求依然能通過(guò)。這個(gè)小細(xì)節(jié)在生產(chǎn)環(huán)境里會(huì)帶來(lái)一些詭異現(xiàn)象后面我會(huì)專(zhuān)門(mén)講。2. 從 AuthorizingRealm 切入授權(quán)的骨架2.1 doGetAuthorizationInfo 是唯一的核心入口AuthorizingRealm這個(gè)抽象類(lèi)幫我們做了大量模板化工作。它繼承自AuthenticatingRealm在認(rèn)證能力基礎(chǔ)上擴(kuò)展了授權(quán)能力。我們要實(shí)現(xiàn)的方法只有一個(gè)protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals)參數(shù)PrincipalCollection里裝著用戶(hù)身份標(biāo)識(shí)。別小看這個(gè)參數(shù)它可能包含多個(gè) Realm 各自返回的 principal所以你在取用戶(hù)標(biāo)識(shí)時(shí)不能想當(dāng)然用principals.getPrimaryPrincipal()要看你認(rèn)證時(shí)SimpleAuthenticationInfo里到底放的是什么對(duì)象。返回的AuthorizationInfo就是授權(quán)數(shù)據(jù)的容器最常用的實(shí)現(xiàn)類(lèi)是SimpleAuthorizationInfo它內(nèi)部維護(hù)了三類(lèi)數(shù)據(jù)方法作用常見(jiàn)用法addRole(String)添加單個(gè)角色標(biāo)識(shí)info.addRole(admin)addRoles(SetString)批量添加角色從數(shù)據(jù)庫(kù)查詢(xún)結(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ì)展開(kāi)講。2.2 授權(quán)數(shù)據(jù)該從哪里來(lái)doGetAuthorizationInfo方法體里面一般就三步拿用戶(hù)標(biāo)識(shí)、查數(shù)據(jù)庫(kù)、組裝AuthorizationInfo。真正的業(yè)務(wù)復(fù)雜點(diǎn)全在第二步。這里我要強(qiáng)調(diào)一個(gè)容易被忽視的設(shè)計(jì)問(wèn)題授權(quán)查詢(xún)到底應(yīng)該按用戶(hù)主鍵查還是按用戶(hù)名查如果認(rèn)證時(shí)你往 principal 里塞的是用戶(hù)主鍵userId那授權(quán)查詢(xún)就用userId做條件。如果塞的是用戶(hù)名就按用戶(hù)名查。兩種都可以但我更推薦主鍵因?yàn)橛脩?hù)名可能被修改而且即使兩個(gè)用戶(hù)同一天注冊(cè)、同名主鍵也不會(huì)撞。唯一的注意點(diǎn)是Subject的 API 大多接收 principal 作為參數(shù)你從principals.getPrimaryPrincipal()取出來(lái)的類(lèi)型必須和你放進(jìn)去時(shí)一致否則要做類(lèi)型判斷再轉(zhuǎn)換。至于查詢(xún)結(jié)果我也順手說(shuō)一個(gè)實(shí)踐不要在doGetAuthorizationInfo里一次只查角色另一次只查權(quán)限最好一條查詢(xún)把用戶(hù)的角色碼列表查出來(lái)再用角色集合去查權(quán)限集合。這樣可以減少數(shù)據(jù)庫(kù)交互次數(shù)。很多同學(xué)在緩存沒(méi)生效的開(kāi)發(fā)階段會(huì)反復(fù)看到 SQL 日志里授權(quán)查詢(xú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查詢(xún)數(shù)據(jù)庫(kù)性能上是災(zāi)難。這里的坑在于緩存默認(rèn) key 是AuthorizationCacheKey基于 principal 計(jì)算。什么意思呢用戶(hù) A 的權(quán)限被緩存后如果管理員修改了 A 的權(quán)限再判斷A.isPermitted(...)時(shí) Shiro 不會(huì)主動(dòng)知道你數(shù)據(jù)庫(kù)變了它只會(huì)從緩存里取出舊數(shù)據(jù)。這就是“權(quán)限變更后不生效”的經(jīng)典問(wèn)題。解決思路有兩個(gè)一是使用像 Redis 這樣的分布式緩存并主動(dòng)清理 key二是實(shí)現(xiàn)一個(gè)帶版本號(hào)的緩存策略。最省事的辦法是在權(quán)限變更的業(yè)務(wù)代碼里主動(dòng)調(diào)用realm.getAuthorizationCache().remove(userId);或者通過(guò)SecurityUtils.getSubject().logout()讓用戶(hù)重新登錄。方式很多沒(méi)有銀彈但你必須知道這個(gè)機(jī)制存在否則線(xiàn)上會(huì)出現(xiàn)“為什么我改了權(quán)限他還能訪(fǎng)問(wèn)”的詭異工單。3. 手寫(xiě)一個(gè)支持權(quán)限的 Realm 授權(quán)實(shí)現(xiàn)3.1 一個(gè)夠用的權(quán)限數(shù)據(jù)模型先約定一套簡(jiǎn)單但真實(shí)的數(shù)據(jù)表用戶(hù)表sys_user、角色表sys_role、權(quán)限表sys_permission、用戶(hù)角色關(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這種寫(xiě)法不是 Shiro 強(qiáng)制要求的但配合它默認(rèn)的WildcardPermission做字符串匹配時(shí)非常自然。order:*能匹配所有 order 下面的權(quán)限*:export能匹配所有模塊的導(dǎo)出操作寫(xiě)出類(lèi)似“所有模塊可查看”的規(guī)則也容易。角色表里的role_code則采用業(yè)務(wù)語(yǔ)義的標(biāo)識(shí)比如admin、operator、auditor。我還習(xí)慣加一個(gè)role_type字段區(qū)分“系統(tǒng)內(nèi)置角色”和“自定義角色”授權(quán)查詢(xún)時(shí)按需過(guò)濾。3.2 核心代碼doGetAuthorizationInfo 的完整實(shí)現(xiàn)下面這個(gè)UserRealm示例包含授權(quán)部分。為了演示清晰我假設(shè)認(rèn)證時(shí) principal 放的是SysUser對(duì)象該對(duì)象有g(shù)etId()返回用戶(hù)主鍵。public class UserRealm extends AuthorizingRealm { private UserService userService; private PermissionService permissionService; // 構(gòu)造方法注入省略 Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { // 1. 獲取當(dāng)前登錄用戶(hù) Object primary principals.getPrimaryPrincipal(); if (primary null) { return null; } SysUser user; if (primary instanceof SysUser) { user (SysUser) primary; } else { // 如果統(tǒng)一存的是 username需要反查用戶(hù) 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()返回的類(lèi)型完全取決于認(rèn)證時(shí)SimpleAuthenticationInfo的第一個(gè)參數(shù)傳的是什么所以上面代碼做了類(lèi)型兼容處理。第二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 操作。用戶(hù)擁有的權(quán)限字符串集合和判斷時(shí)傳入的權(quán)限字符串做匹配時(shí)規(guī)則是“用戶(hù)權(quán)限要能覆蓋請(qǐng)求權(quán)限”。比如用戶(hù)擁有order:*他請(qǐng)求order:export匹配成功他請(qǐng)求product:export匹配失敗因?yàn)橛脩?hù)權(quán)限只有 order 段product 段完全不沾邊。這里有一個(gè)很常見(jiàn)的誤區(qū)有人會(huì)把“擁有 order:* 就以為能操作所有模塊”。記住*只在它所在的段里通配不會(huì)跨段。想要全局權(quán)限得寫(xiě)*:*:*或直接給用戶(hù)*。如果默認(rèn)的冒號(hào)多段規(guī)則滿(mǎn)足不了業(yè)務(wù)你可以自定義Permission實(shí)現(xiàn)類(lèi)再通過(guò)info.addObjectPermission(...)放進(jìn)去。自定義匹配邏輯的判斷入口是Permission.implies(Permission p)方法這里可以完全按業(yè)務(wù)規(guī)則來(lái)。不過(guò)絕大多數(shù)項(xiàng)目用默認(rèn)通配符已經(jīng)足夠我建議不要過(guò)度設(shè)計(jì)。3.4 把 Realm 注冊(cè)進(jìn) Shiro 配置現(xiàn)在把自定義 Realm 配置到 Spring Boot 項(xiàng)目中。我這里給出一個(gè)基于配置類(lèi)的寫(xiě)法這也是目前主流工程常用的方式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)和緩存名稱(chēng)寫(xiě)出來(lái)因?yàn)楹芏嗳?Spring Boot 集成 Shiro 時(shí)忘了開(kāi)啟緩存導(dǎo)致授權(quán)查詢(xún)高頻率打到數(shù)據(jù)庫(kù)。開(kāi)啟后配合 Redis 緩存可以大幅提升權(quán)限判斷性能但要注意緩存失效問(wèn)題這一點(diǎn)我在后面第 5 部分詳細(xì)說(shuō)。4. 授權(quán)生效后的驗(yàn)證與調(diào)試4.1 用單元測(cè)試驗(yàn)證授權(quán)結(jié)果授權(quán)邏輯寫(xiě)完后第一步不是啟動(dòng)整個(gè) Web 應(yīng)用去點(diǎn)按鈕而是寫(xiě)幾個(gè)快速驗(yàn)證用例。Shiro 提供了一套線(xiàn)程綁定 Subject 的機(jī)制在測(cè)試代碼里可以直接模擬一個(gè)帶權(quán)限的用戶(hù)public class UserRealmAuthorizeTest { Test public void testAdminCanExportOrder() { // 組裝授權(quán)信息用戶(hù)擁有 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è)假用戶(hù) 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à)值在于它不依賴(lài)數(shù)據(jù)庫(kù)直接驗(yàn)證 Shiro 匹配邏輯是否符合預(yù)期。如果你改了權(quán)限字符串格式跑一遍測(cè)試馬上知道有沒(méi)有破壞舊規(guī)則。注意mockRealmWithAuthInfo是測(cè)試輔助方法大概思路是自定義一個(gè) Realm 把a(bǔ)uthInfo固定返回這樣doGetAuthorizationInfo就不會(huì)訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)。4.2 調(diào)試時(shí)如何觀察授權(quán)數(shù)據(jù)是否加載實(shí)際遇到“某個(gè)接口明明配置了權(quán)限注解卻 401/403”時(shí)最痛苦的是不知道“用戶(hù)到底有沒(méi)有這個(gè)權(quán)限”。我的習(xí)慣是先開(kāi) DEBUG 日志觀察LoggingSubject或自定義攔截器打印的 principal 和權(quán)限字符串。具體操作上可以在doGetAuthorizationInfo臨時(shí)打印一下查出來(lái)的角色和權(quán)限集合log.debug(用戶(hù) {} 的角色: {}, user.getUsername(), roleCodes); log.debug(用戶(hù) {} 的權(quán)限: {}, user.getUsername(), permCodes);然后調(diào)用權(quán)限判斷的地方也打印一下請(qǐng)求權(quán)限log.debug(判斷權(quán)限: {}, permission);兩端日志一對(duì)照問(wèn)題大概率立刻暴露要么是權(quán)限沒(méi)查到要么是權(quán)限字符串格式不對(duì)。舉個(gè)例子數(shù)據(jù)庫(kù)權(quán)限表里存的是order:export代碼里注解寫(xiě)的是RequiresPermissions(order:export)理論上沒(méi)問(wèn)題但如果權(quán)限表里存成了order_export或者export那永遠(yuǎn)匹配不上。這種問(wèn)題靠眼睛看數(shù)據(jù)庫(kù)就能快速定位。4.3 授權(quán)在三個(gè)業(yè)務(wù)層的落地姿勢(shì)Realm 提供的權(quán)限數(shù)據(jù)是地基但最終要作用到業(yè)務(wù)的三個(gè)位置第一層是 URL 過(guò)濾。在ShiroFilterFactoryBean里配置filterChainDefinitionMap比如/order/** perms[order:list]請(qǐng)求沒(méi)經(jīng)過(guò) URL 層就攔截掉。這層適合做粗粒度模塊控制。第二層是方法注解。用RequiresRoles(admin)、RequiresPermissions(order:export)標(biāo)記在 Controller 方法或 Service 方法上適合做細(xì)粒度操作控制。注意注解默認(rèn)是 AOP 攔截工作需要配置AuthorizationAttributeSourceAdvisor才能生效。第三層是頁(yè)面標(biāo)簽。JSP 環(huán)境下可以用shiro:hasPermission nameorder:exportVue 這類(lèi)前后端分離項(xiàng)目則往往由后端接口返回權(quán)限碼列表前端自己控制按鈕顯示。我見(jiàn)過(guò)很多項(xiàng)目在 URL 層和注解層重復(fù)配置同一套權(quán)限導(dǎo)致一條規(guī)則要改兩處。我的經(jīng)驗(yàn)是模塊級(jí)規(guī)則放 URL 層操作級(jí)規(guī)則放注解層不要重復(fù)攔截。權(quán)限碼列表通過(guò)接口返回給前端這樣三層的權(quán)限來(lái)源統(tǒng)一不至于各寫(xiě)一套。5. 生產(chǎn)環(huán)境中授權(quán)相關(guān)的常見(jiàn)坑與解法5.1 權(quán)限變更后用戶(hù)權(quán)限不更新的問(wèn)題這是授權(quán)功能上線(xiàn)后最常遇到的投訴“管理員給張三加了導(dǎo)出權(quán)限張三刷新頁(yè)面還是看不到導(dǎo)出按鈕”。原因前面說(shuō)過(guò)AuthorizingRealm開(kāi)了緩存后授權(quán)數(shù)據(jù)被快照在緩存里數(shù)據(jù)庫(kù)變更不會(huì)自動(dòng)推送給緩存。處理方案要看你的緩存介質(zhì)。如果用本地EhCache只能在權(quán)限變更時(shí)調(diào)realm.clearCachedAuthorizationInfo(principals)但要拿到用戶(hù)對(duì)應(yīng)的 principals 需要額外構(gòu)造。如果用 Redis推薦在權(quán)限變更服務(wù)里主動(dòng)刪除對(duì)應(yīng)用戶(hù)的 cache keykey 的命名規(guī)則要和你securityManager.setCacheManager(...)配置的序列化策略一致。我實(shí)際項(xiàng)目中更傾向的方案是授權(quán)緩存不用 Shiro 自帶的 CacheManager而是自己封裝一層回調(diào)。權(quán)限變更后通過(guò)消息隊(duì)列廣播一個(gè)用戶(hù) ID所有節(jié)點(diǎn)都刪除該用戶(hù)授權(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ù)命中即算通過(guò)。這帶來(lái)的一個(gè)奇怪現(xiàn)象是用戶(hù)能登錄但判權(quán)限時(shí) Shiro 同時(shí)問(wèn)兩個(gè) Realm 要授權(quán)數(shù)據(jù)。UserRealm里查不到角色的用戶(hù)請(qǐng)求subject.hasRole(admin)時(shí)TokenRealm如果也實(shí)現(xiàn)了doGetAuthorizationInfo并且返回了 admin 角色那這個(gè)用戶(hù)居然也能算作管理員。要處理這種隱患建議在doGetAuthorizationInfo里約束數(shù)據(jù)的適用范圍。最簡(jiǎn)單的方式是沒(méi)有用戶(hù)數(shù)據(jù)的 Realm 直接返回null或空AuthorizationInfo不要含糊地放一個(gè)空集合。另一個(gè)方式是重寫(xiě)ModularRealmAuthorizer的核心邏輯按 principal 來(lái)源區(qū)分我只認(rèn)某個(gè) realm 的數(shù)據(jù)。不過(guò)這個(gè)方案配置成本高大多數(shù)業(yè)務(wù)場(chǎng)景用“不越權(quán)返回?cái)?shù)據(jù)”就能規(guī)避。5.3 授權(quán)查詢(xún)頻繁打到數(shù)據(jù)庫(kù)權(quán)限判斷本身是高頻操作。登錄用戶(hù)每次刷新頁(yè)面可能要觸發(fā)幾十次isPermitted()如果你忘了開(kāi)緩存每一次都會(huì)進(jìn)doGetAuthorizationInfo。運(yùn)氣好命中慢查詢(xún)運(yùn)氣不好就是連接池打滿(mǎn)。排查方法很簡(jiǎn)單打開(kāi)數(shù)據(jù)庫(kù)慢查詢(xún)?nèi)罩居^察授權(quán) SQL 的執(zhí)行頻次。解決路徑分兩步第一步開(kāi)啟authorizationCachingEnabled第二步是給doGetAuthorizationInfo里的查詢(xún)加索引。sys_user_role和sys_role_permission兩張關(guān)聯(lián)表userId、roleId 字段必須有索引否則數(shù)據(jù)量上來(lái)必炸。5.4 權(quán)限字符串因大小寫(xiě)和空格匹配不上數(shù)據(jù)庫(kù)里權(quán)限碼不規(guī)范是家常便飯。有人存的是Order:Export有人復(fù)制時(shí)多了個(gè)空格Shiro 默認(rèn)的WildcardPermission做的是精確字符串拆分匹配大小寫(xiě)不同都算不匹配。想從源頭杜絕必須在權(quán)限維護(hù)頁(yè)面做輸入清洗統(tǒng)一轉(zhuǎn)小寫(xiě)、去掉兩側(cè)空格、限制只能使用字母數(shù)字冒號(hào)星號(hào)逗號(hào)。同時(shí)在doGetAuthorizationInfo里也做一次trim().toLowerCase()兜底。不要指望靠配置 Shiro 的WildcardPermission來(lái)做大小寫(xiě)忽略它沒(méi)有這個(gè)開(kāi)關(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)目里比代碼更值錢(qián)。我見(jiàn)過(guò)兩種極端一種是把權(quán)限細(xì)到“看見(jiàn)訂單金額”這種字段級(jí)結(jié)果是權(quán)限表爆炸維護(hù)成本極高另一種是只有三四套角色一個(gè)“管理員”走天下結(jié)果業(yè)務(wù)根本沒(méi)法精細(xì)管控。平衡點(diǎn)通常是把權(quán)限點(diǎn)設(shè)計(jì)到“模塊操作”粒度比如order:export、user:resetPwd至于字段級(jí)的數(shù)據(jù)權(quán)限應(yīng)該通過(guò)查詢(xún)條件動(dòng)態(tài)過(guò)濾而不是塞進(jìn)權(quán)限框架。角色則盡量保持在個(gè)位數(shù)級(jí)別比如系統(tǒng)管理員、普通用戶(hù)、審計(jì)員、外部合作方。角色和權(quán)限之間是組合關(guān)系角色代表一種可授權(quán)的行為集合不要在系統(tǒng)里搞出幾百個(gè)組合角色。6.2 不要在業(yè)務(wù)代碼里硬編碼權(quán)限判斷雖然 Shiro 提供了subject.isPermitted()這種代碼級(jí)判斷但我不建議在業(yè)務(wù)方法里到處寫(xiě) 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工具類(lèi)避免直接和 Subject API 耦合。這樣權(quán)限需求變更時(shí)大多數(shù)情況只需要調(diào)整數(shù)據(jù)庫(kù)權(quán)限配置不需要重新發(fā)版。6.3 從最小可用權(quán)限模型開(kāi)始迭代最后一條建議給剛開(kāi)始接觸 Shiro 的團(tuán)隊(duì)不要上來(lái)就設(shè)計(jì)五張表加一套復(fù)雜的動(dòng)態(tài)權(quán)限體系。先按“用戶(hù)-角色”二級(jí)模型跑通授權(quán)鏈路把doGetAuthorizationInfo的骨架搭好等業(yè)務(wù)真的出現(xiàn)“操作級(jí)精細(xì)管控”需求再加權(quán)限表、角色權(quán)限關(guān)聯(lián)表。安全框架的價(jià)值在于穩(wěn)定可靠地?cái)r住不該放行的人而不是一開(kāi)始就堆功能。我的經(jīng)驗(yàn)是框架本身的靈活度足夠支撐從簡(jiǎn)單到復(fù)雜的演進(jìn)。你先把授權(quán)通了后面加權(quán)限點(diǎn)只是往數(shù)據(jù)庫(kù)里插幾行數(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
返回資訊列表
熟女网站最新| 2010男人的天堂| 超碰碰小说97| 手机不卡视频不卡在线一二三区| 六九九九| 人人扣人人操| 亚洲欧美日韩精品久| 日韩精品碰碰| 欧美色狠| 天天拍夜夜| 日日摸日日碰| 亚洲国成人情色好看电影| 国产尤物AV尤物在线观看不卡| 亚洲在线| 无码国产精品96久久久久孕妇| 婷婷尹人大香蕉免费| 91色亚洲| 欧美欧美啪啪视频| 天天欲望网| 欧美综合网1| 日日AV加勒比| 亚洲综人| 91痴汉| 欧美丝袜激情| 久操操| 日本三级久| 爱我干综合| 五月天丁香婷婷综合网站| 人妻9117c| 国产97亚洲| 久久久久久久97| 久久久天美| jiujiujiujingpin| 亚洲色香| 国产第二页| 二三四区精品| 91M一社| 日韩欧美天堂| 激情内射| 91丝袜美女视频| 久久超碰网| 99无码狠狠久久| 国产精品久久妻无码网站| 乱伦一二三区| 曰本人妻人人澡人人夹| 多乙久久久久久| 国产黄色av大片网站| 91三级理论片播放器| 欧美日韩 强奸乱伦| 伊人久久大香线蕉无码| 亚洲天堂热| 五月天色图| h在线看免费版在线看| 婷婷在线精品| 有码人妻系列| 任你干在线视频| 超碰在线综合97| 亚洲玖玖爱| 亚洲高清91| 91成人高清在线观看| 天天色黄色影院天天操| 婷婷伊人| 久久鲁夜| 色婷婷日韩精品一区二区三区| 天天操妹子| 精品国产一区探花在线观看| 日本午夜操逼| 超碰超碰95| 老熟女中文字幕高清| 99视频自拍区| 久草国产在线视频| 五月丁香六月婷| 成人精品视频一区二区| 中文字幕av一区二区三区人妻少妇 | 久久啊啊| 精品国产一区二区三区香蕉欧美| 国产又爽又黄| 啊啊啊97视频| 亚洲国产美女久久久久| 日本综合久久| 亚洲成人色情五月天丁香花| 成人性交免费视屏| 日韩一区二区高清在线观看的| 四虎影院成年人片| 麻豆国产成人精品| 欧美中文字幕精品人妻| 色情五月丁香| 91熟女.com| 亚洲A曰本VA欧美VA视频| 国产Aα| 天无日色综合| 国产精品白丝AV| 91久久免费视频互動交流| 囯产乱伦一区二区三女 | 99热婷婷一区二区三| 眼镜人妻101.com| 屌逼麻豆| 久久草草亚洲蜜桃臀| 午夜男人一级A片7777| 精品一区二区三区四区女| 精品国产乱码久久| 天天干天天爽| 国产精品片| 国产免费永久精品无码| 欧美91丝袜| 久久青青草原免费视频| 99国产精品久久久在线播放| 欧美操人视频| 亚洲www91| 国产一区二区三区白丝| 亚洲有薄码区久久在线一区| 国产黄色 A 片免费看| 久久精品视频久久久| 久久久性爱| 国产乱码精品一区二区三区四川| 99精品高潮| 内射老妇BBWX0C0CK| 蜜桃在线观看一区二区三区| 熟妇xxxxx性春色| 波多野结衣被操50分钟免费视频| 亚洲五月丁香花狠狠干一区二区三区 | 亚洲日产专区婷婷| 大地资源在线观看中文第二页| 国产 大胆 对白| 伊人丁香五月婷婷| 中文字幕av丝袜| 操逼操2| 在线情色电影 91大 | 亚码人妻| av一区二区三区 中文| 91色人| 亚洲日韩精品在线播放| TS人妖另类精品视频系列| 日本三级黄页| 51一区二区三区| 91超碰在线播放| 欧美日韩 强奸乱伦| 久久是精品| 色婷婷99| 色综合五月天| nuu12国产麻豆精品| 亚洲色色色| 91天堂色男人的天堂| 国产无码精品成人| 97超碰日韩| 国产九区| 欧美性爱精品七区| 国产亚洲欧洲在线观看| 国产乱伦性爱区| 天天视频黄| 欧美综合色站| 中文字幕中文字幕一区二区| 妇女乱色二区| 日韩钢筋无码高清啾啾啾| 亚洲无码超碰免费| 蜜臀va69| 色爱欲亚洲| 人妻中文字幕日韩电影| 欧美日韩1234| 啊啊啊好大好湿| 亚洲欧美国产成人综合不卡| 亚洲国产美女久久久久| 国产AV人人夜夜澡人人爽麻豆| 日韩av乱伦| 国产激情视频一区区三区| 大香网伊人久久综合网eew| 日韩探花精品在线视频| a男人的天堂久久一级A毛片| 97精品全部| 操学生天天| 操逼操操操91| 成人av影院在线观看| 高潮9999外国| 中 文字幕一区二区三四 五 区日 日 骚| 国产九九九九九九九九| 极品国产内射| 97资源站国产精品| 98福利在线视频| 综合久欧洲| 狠狠综合| 欧美激情中文字幕另类小说| 国产成人亚洲精品无码最新在线| 啊啊啊啊啊啊在线| 久久精品一区二区三区蜜桃臀| 国产一区96在线| 午夜寂寞欧美| 可能人人看人人摸| 操逼不卡中文字幕| 大香蕉视频一二三区| 综合欧美色图| 玖玖爱视频网站| 超碰在线综合97| 日日日大屁股骚女人精品| 国产精品久久9| 亚洲欧洲网站免费观看| 青青青国产手线观看视频2| 加勒比久久av| 国产999精品久久久| 天天看片麻豆| 91n免费处女| 蜜臀AV成人精品蜜臀AV久久| 中文字幕日产av人| 亚洲成人一二三区| 天堂日本亚洲欧美| 久艹伊人精品综合在线| 四虎国产成人精品免费一女五男| 亚洲官网在线| 国产乱人妻精品入口| 欧美激情亚洲色图| 诱惑人妻欧美一区在线播放| 欧美成人一区二区| 欧洲一区二区| 久久久久亚洲Av无码专区老牛影视| 男人的天堂三级| 91女优在线观看 | 美女网站91| 97中文字幕一区| 九九这里只有精品| 九热久| 操熟女91| 国产精品懂色tv影视免费观看| 东北熟女91| 狠狠婷婷亚洲中文综合久久| 久久精品国产欧美日韩亚洲欧美日韩中文久久国产一区 | 亚卅熟女乱色| 丁香九月激情啪| 色综合久久久久| AV九九| 99精品网| 97超碰天天爱天天爱| 97久久精品亚洲中六字幕| 大香蕉欧美国产日韩高潮| 91热情品| 夜夜高潮夜夜爽国产伦精品| 亚洲欧美首页| 亚洲最新av无码成人精品区| 91久久精品国产| 91伊人影视综合| 欧美精品三区| 亚洲丝袜综合| 久久国产性爱| 熟女在线视频| 天欧美在线| 天天天干977| 国产精品福利视频播放| 秋霞欧美性爰视频| 天天综合网1| 神马久久久久久久久| 天天做天天爱| 日韩性爱再线视频| 中美日韩毛片| 国产免费小视频| 久久这里只精品免费福利| 八人操人人摸人人看| 最新欧洲欧美日本激情网站| 美女诱惑在线一区| 国产精品久久久亚洲第一牛牛_在线观看 | 襙一襙| 国产特级毛片AAAAAA高潮流水| 色综合色欲色综合色综合色综合| 2025亚洲男人天堂| 日韩97超碰| 国产亚洲精品美女久久久久久2021| 精品人妻美妇91job| 国产夫妻一区二区| 久久春色| 日韩人妻一区二区精品| 少妇内射www在线观看视频| 欧美桃色网| 久久无码一区二区二三区性色| 在线国产一区二区av| 熟女日韩| 乱抡国产91| 色婷婷在线视频| 国产精品3| 偷拍偷窥与盗摄视频专区| 麻豆这里只有精品| 一卡二卡在线播放| 91精品国产高清久久久久久,亚洲成人| 97干色天堂| 999久久久九九九九| 强免费黄色网址| 欧美色图成人网一区二区| 亚洲色图91| 五月综合视频| 99热精品在线观看| 日本护士高潮| 欧美综合另类| 久操高青| 丝袜人妻av一区二区| 婷婷日韩一区二区三区中文字幕在线| 欧美人妻制服| 久久久久久久一级黄色打同平台| 婷婷激情四射| 超碰79人人乐| 亚洲码在线中文在线观看| 91丨国产丨白浆| 999久久久国产精品| 在线国产探花| 精品传媒在线一区| 67914亚洲精品| 久久久久久十| 人妻久久久| 精品久久久久综合无码| 国产精品国产自产拍高清AV| 国产精品白领在线观看| 欧美熟妇操操视频| 26uuu国产日韩综合在线观看| 妇女视频网站| 92午夜免费福利视频| 91劲爆| 国产欧美亚洲精品a第2页| 99re6在线视频精品免费完整版安卓版| 亚洲成人性爱网站在线播放| 老鸭窝日丰县女人| 乱人伦 国语对白:视频直接看| 久久有码视频| 一区=区三区视频| 亚洲国产一区二区日韩专区| 欧美日韩亚洲少妇寂寞影院正在播放 | 嫩草 我啊~嗯~在线| 国产浮力影院第1页| 日韩专区久久久| 伊人五月天| 12一15性XXXX粉嫩国产| 神马久久69| 成人av动漫在线观看| 女优大全 - 91n| 裸模AV女优| 99久久久久久久久| 免费a v| 中文久久96| 97人人射| 午夜男人av| sewuyueav| 台湾肥佬网一区二区三区| 久久综合精品一区二区三区| 逼逼逼逼操操操操操操操操操午夜剧场 | 亚州欧美另类| 丝袜美腿校园春色| 天天操夜夜操| 无码日韩人妻av一| 国产色产精品在线观看 | 巨爆乳肉感一区二区三区竹菊影视| 人人澡人人干| 青青草原成人| 色娱乐色呦呦夜夜夜夜av| 99热综合| 操我无码| 可能人人看人人摸| 91久久免费视频互動交流| 日本二区不卡| 中文字幕人乱码中文字的预防方法| 99精品无码| yellow网站免费观看日韩高清无码| 亚洲欧洲综合| 国产女主播视频在线观看| 嗯嗯啊啊操死我| 欧美国产日韩高清在线| 国产日韩欧美中文在线播放| 女色综合| 大香蕉99999| 夜夜免费视频| 噜噜瑟| 欧美A√综合网 | nuu12国产麻豆精品| 国产丝袜美腿美女麻豆| 青青爽| av九九| 久久男女激情视频网站| 伊人网综合在线视频| 国产黄色剧情影片麻豆免费播放| 91精品人妻一区二区三区蜜臀| 亚洲精品一区二区免费在线观看| 伊人网在线视频| 中文字幕加勒比海高清无码免费视频| 久久久久精| 大香蕉久操| 人人干人人搞人人摸| 再深点灬舒服灬太大了添视频| 国产精品人妻免费精品| dy888午夜老子影视达达兔| 人妻铁牛TV| 美女91AV| 中文字幕精品探花视频| 91精品微拍福利| 老熟女搡BBBB搡BBBB视频| 久久久精品中文字幕爱豆| 69av一区二区三区| 视频黄色国产一级| 亚洲最大无码中文字幕网站| 丁香五月色| 婷婷五月天在线观看| 天天舔天天 | 日韩成人性日韩成人性爱视频在线免费观看| 熟妇人妻精品一区二区| 亚洲日韩国产精品| 日本人妻伦在线中文字幕| 岛国免费视频在线| 国产 亚洲 丝袜 制服| 亚洲黄色a级片| 一级A啪啪啪啪| 欧美激情亚洲情色| 中文字幕无码不卡啪啪| 欧美天天搞| 综合亚洲欧美精品日韩?v| 91东京热男人的天堂| 999亚洲国产视频| 婷婷操逼| 啊啊啊啊啊好大好舒服想要| 加勒比无码毛片| 啊啊嗯嗯好爽| 国产免a费看黄片在线| 亚洲精品亚洲人成在线麻豆| av九九| 2025亚洲男人天堂| 久久久久久久久久精| 99精品无码| 国产精品人妻无码久久久互動交流 | 激情熟女12P| 欧美视频一区二区在线| 91爱综合| 夜夜做夜夜爽精品视频| 97爱综合| 91 亚洲 欧美 日韩 国产 综合| 色婷婷成人| 操学生天天| 骚货操死你| 国产精品白丝在线播放 | 欧美色综合网| 久久久久亚洲?V片无码V| 五月丁香激情综合| 色香在线| 91AV入口| 91xingse| 超碰精品97| 亚瑟国产精品久久无码| 九九色色| 97 国产精品| 免费啪啪av| 9久超碰| 九草九九九| 久久国产逼| 色色无码| 综合自拍| 国产精品久久久久久 百度| 亚洲综合113页| 精品无码久久| 丁香色色网| 日韩成人人妻网站| 无码av永久免费专区网站| 蜜桃久久久久久| 天天日天天看| 婷色五月| 少妇高潮九九九九九九九| 亚洲国产欧美另类自拍| 97欧美精品综合| 青娱乐91| av天堂影视中文在字幕在线中文 | 欧美人妻久久精品二区三区| 少妇69中文| 国产日韩精品suv| 99激情| 久久久久99精品成人片蜜臀| 国产一区二区三区影片| 欧美成人精品一区二区男人蜜臀 | 啊啊啊啊啊舒服| 欧美精品99久久久**| 亚洲日韩青青草色月| 老熟妇乱轮| 翘臀vidoes| 综合久久97| 十八禁网站在线| 超碰97色| 欧亚久久偷拍视频| 日韩性爱1级片视频| 久久九七| 美女97超碰| 在线播放成人高清免费视频| 99re在线观看| 上海一级黄片| 大但人体久久久久| caorenqi shipin| 易易A毛视频| 激情自拍 校园春色| 91网站18| 神马久久69| 新版天堂中文资源8在线| 999久久芭蕾| h在线看免费版在线看| 国产激情视频一区区三区| 色九九九| 亚洲少妇综合在线播放| 国产国产亚洲一二三久久| 亚洲另类在线观看| 国产人妖的免费的视频| 国产91精品在线免费| 久久久久密| 欧洲综合无码| 国际精品久久久| 精品精品精品| 国产精品久久久久久照片| 久久色AV线| 国产精品交换一区二区| 中文字幕一区二区三区字幕| 久久9免费视频| 欧美色图天堂在线| 变态乱伦伪娘灌肠一区二区| 老色鬼成人精品视频下载大在线观看| 激情久久久| 天天上日日上日韩精品| 亚洲做性| 国产高清无码一区二区三区四区皇冠| 蜜臀一二三区| 久久久久免费少妇| 欧美色就是色| 无码男人天堂| 久久性爱视频| 日日操丁香五月天| 蜜臀久久99精品久久久久久| 人妻激情偷乱视频一区二区三区| 91视频精品| 日韩激情视频| 美女自卫慰黄网站免费| 青娱乐福利99| 97久久久久| 传媒免费一区二区三区| 久久国产精品一级二级三级| 欧美不卡二区| 日韩强奸av| 欧美热图99| 蜜桃丰满熟妇av无码区不卡| 色呦呦、国产精品| 中文字幕在线观看丝袜| 在线无码操| 岛国片在线播放| 日韩 欧美 另类 人妻| 999狠狠综合| 99国产人成精品| 中文字幕国产精品1区| 亚洲91综合| 国产怡红院| 天天躁日日躁成人字幕aⅴ| 福利在线观看一区二区| 国产精品露脸在线观看| 在线洲亚线| 91天天综合日韩欧美| 婷婷久月| 大奶啊啊好爽 | 综合网亚洲在线| 欧美亚州色的图| 91撸色网 玖玖网 欧美| 91女人的网站| 一块操欧美| 天天干天天狼在线视频| 亚洲一区二区精品福利| 综合欧美日韩在线观看| 久久色精品视频在线| 91处女视频在线观看| 日韩伦理久 久久 清纯| 又大又黄国产| 久久久啊啊| 在线女人91| 99re这里只有精品3| 嗯嗯嗯啊啊啊操的我好爽| 992这里有精品| 成人av影院在线观看| 亚洲www91| 激情五月天婷婷| 九九成人视频| 嗯啊不要啊啊在线观看视频| 精品无吗久久| 欧美亚洲涩涩| 夜夜无码| 丝袜亚洲综合| 岛国福利在线精品播放| 亚洲国产av中文字幕久久| 国产对白刺激视频| 中文久久爆乳| 亚洲综合色男人网| 午夜天堂精品久久| 精品无码一区二区人妻久久蜜桃| 五十路成人在线视频二区三区| 性欧美| 人人澡人人干| 欧美A片中文字幕| 欧美强奸乱能| 可以看的av| 性欧美体内射精| 色欲色香天天天综合网www-亚洲综合国| 亚洲素人网| 日韩欧美女求操每天更新| 色综合一本| 啪啪啪精品视频| 欧美1727免费观看视频| 欲射影视| 国产午夜无码片在线观看影视| 97天天| 国产Av超碰| 可以免费观看的日韩av毛片| 超碰AV在线| 天天综合网久久ww| 91精品国| 五十路熟女,国产欧美精品区一区二区三区 | 极品色综合| 国产精品嫩草影院午夜两性| 8050无码八戒| 日韩av熟女一区二区三区成人| 热热色色综合| 99婷婷一区二区| 精品成人av一区二区三区在线| WWW4虎| 密臀国产在线| 亚洲 欧美 制服 另类 自拍| 色婷婷综合久久久久中文国产精品一区中文字幕,国产福利电影一区二区三区 | 天天干天天操天天操夜夜操天天操| 无码国产Av| 青青网三级视频| 亚洲欧美综合网站| 亚洲AV成人无码一二三久久| 五月激情小说| 羞答答AV中文字| 老司机深夜18禁污污网站| 九九久久精品| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 精品国产乱码久久久久久口爆网站| 91久久精品国产| 欧美日韩人妻精品一区二区三区| 天天摸夜夜添无码小视频| 亚码激情| 黄页av| 日本黄 R色 成 人网站| 五十路人妻在线| 久久久亚洲Av| 青娱乐大香蕉| 男女猛烈无遮掩视频免费软件| 国产熟女少妇一区| 中文字幕一区二区三区人妻不卡| 欧美人妻一区| 东北操逼| 亚洲无码久久久久久久| 欧美日韩青操| 亚一综合久久久久久久久久| 啊灬快c我灬啊灬用力灬啊灬-国产精品性做久久久久久-成人AV | 天天躁夜夜躁狠狠躁AV| 无遮挡一级毛片视频免费的| 天天综合影院91| 91网九色蝌蚪操熟女| 美女啊啊啊啊啊啊啊| 亚洲熟女综合网| 亚洲天堂,男人| 熟女人妻一区二区三区免费看| 婷婷五月天伊人| 欧美 亚洲 第一页 | 丝袜美腿操av| 久久99热这里只频精品6学生| 啊啊啊啊好疼| 老女人爆菊| 成人三一级一片aaa| 蜜臀AV成人精品蜜臀| 精品人妻中文字幕4399| 日本A级视频| 九九热AV| 一区二区三区四区五区高清无码永久视频 | 亚洲色图尤物视频| 性交一区二区在线播放| 五月天婷精品激情| 亚洲图片小说欧洲| 亚洲中文制服诱惑| 一区操逼| 精品9999| 久久一二三四五六七八九区区区 | 99re视频在线播放青草| 中文字幕高清20页视频| 搡老熟女免费视频 | 久久精品一区二区| AV天堂男人的天堂| 欧美大香蕉专区网| 欧美色性情| 久久久婷婷| 國產尤物AV尤物在線觀看| 欧美亚洲特P| 福利偷拍视频-中文字幕2019国语完整视频大全-S91AV | 麻豆AV一区二区| 国产又黄又粗的视频| 天美麻豆黄色录像| 欧美色棕合| 国产一级特黄大片处女| 亚洲97网站| 青青青国产| 91快色色色色色| 超碰97色| 性爱av在线免费观看| 婷婷丁香六月天| 五月丁香啪啪| 久久久禁| 日本天天吊| www.久久最新地址| 天天爱综合网| 淫色网综合| 国产精品亚洲免费| 国产乱伦性爱区| 中国特猛少妇色xxx| 日韩9999| 97网址www| 欧美精品1区2区3区| 亚洲在线网站| 夜夜高潮夜夜爽夜夜爱爱一区| 四季AV综合网址| 九九伊人网| 强奸乱伦Av网| 久热在线精品免费观看| 九久精品| 国产乱码久久久| 99色骚| 色一射色一射| 色综合色色| 综合欧美日韩在线观看| 国产又黄又粗的视频| 97AV在线观看| 久久欧美激情| 91美女视频直播| 91碰碰| 丝袜美女诱惑 91 视频| 东京热一区二区三区四区五区六区| 玖玖在线视频| 婷婷六月色开| 熟女被操视频网址| 免费操逼视频下载| 91快色色色色色| av在线观看不卡网站| 91免费看一区二区三区| 欧美爱爱97| 久草在线| 亚洲图片欧美| 97超碰精品| 国产乱子伦久久精品综合一区二区三| 97超碰大| 一起草视频在线| 久一区久久蜜桃| 亚洲欧美清纯| 欧美日综合| 亚洲一区操| 五月天AV资源| 久久精品国产99久久,亚洲日韩久久日本一区一区三区 | 五月天婷婷色色| 成人看片网站| 激激五月| 91久热| 97中文天堂| 97 国产一区| 无码操逼天堂| 偷偷人人精品女女久久| 99婷婷一区二区| 日韩免费a级毛片无码a∨ | 九九九九精| 狠狠亚洲| 91欧美巨乳| 97资源亚洲| 成 人 A V免费视频在线观看| 天天狠操| 成人在线日韩| 立川理惠被中出无码| 亚洲久久久久| 激情黄色片在线观看| 成年人黄色视频免费| 国产a片操逼| 全免费a敌肛交毛片免费| 综合久久中文字幕综合日韩精品 | 蜜臀AV成人精品蜜臀| 任你干在线视频| 91欧| a级免费在线观看| 亚洲图片日本AⅤ欧美在线| 久久激情亚洲精品无码?V | 人妻精品一区二区| 黑人精品XXX一区一二区| 国产黄片在线免费观看| 婷婷丁香成人| 日日天天久久啊啊aaa| 91在线/欧洲| 亚洲中文字幕熟女少妇一区二区| 中日韩免费看男女操逼大全| 久久毛卡| 情色AV电影| 亚洲男人综合网| 人妻天堂网| 国产一区二区a毛片| 99色色网| 天天射夜夜| 亚州综合| 国产激情在线| 亚洲码和欧洲精品激情系列| 高清无码学生妹高潮| 麻豆国产精品午夜视频| 人妻-91porn| 亚洲综合图文| 夜夜欢天天干| 婷婷五月天激情网| 亚洲色图欧美色图制服丝袜| 亚洲性综合11| 亚洲性爱电影| 欧美性爱97超碰| 欧美九一精品久久久熟妇| 欧洲性爱无码区| 亚洲夜夜欢无码一区二区| 少妇人妻无码| 国产精品操| 日本亚洲熟女视频| 国精综合一二三区影视| 97综合网| 99热精品在线在线| 综合色久欲| 欧美日产国产在线成人第一区| 久久乐| 欧洲站一级二级三级h| av网站在线观看了| 婷婷色香| 91老熟妇| 懂色AV一区二区三区| 国产AV天美传媒一区二区三区 | 国产欧美日韩一区二区三区| 亚洲s在线观看| 干少妇视频| 久操婷婷| 1204人成网站色www| 伦伦成年午夜免费视频| 岛国人妻少妇av在线观看| 男女性无套 免费九一| 另类图片五月| 91精品国产一区三一| 九九色影院| 久久精品国产99久久,亚洲日韩久久日本一区一区三区 | 精品人妻二区三区| 97超碰色色| 亚洲性爱高潮影院| 九九九网站| 91N欧美| 精品九九九九九九| 天天操av懂色| A级片一区| 好看的91视频| 久久综合国产精品国产| 先锋音影AV| 亚洲乱伦图片视频| 日日日色色色色色| 最新日产中文在线麻豆| 欧美后入式| 五月天丁香| 思思热国产高清| 午夜天堂网| 久久久亚洲高清不打码| 舔舔啊| 婷婷在线视频| 人人摸人人入| 天天天天做夜夜夜夜做| 熟女精品va中文字幕| 偷拍99| 日韩素人无码一区二区三区三州| 99久久无码| 成人久久精品| 九色视频91| 五月亭亭六月丁香| 国产美女激情| 欧美精品1区2区3区| 96久久久久久久| 亚洲熟妇乱女区二区三区| 欧美日韩国产另类综合| 熟女熟妇伦久久影院毛片一区二区 | 超碰日本97美女人妻人人玩人人爱| 久久产精品一区二区三区电影| 69视频福利导航| 强奸乱伦资源| 啊啊啊啊啊在线| 日本新免费二区三区| 99日韩| 欧美人与动性人交a| 国产精品 视频| 97这里都是精品| 久操不卡视频| 日韩欧美大片免费高清啪啪| 亚州大图综合色图| 久久久久久久九九九九九九| 国产精品久久久久久久黄无码 | 99热这里只有精| 永久免费av无码网站国产app| 国产丸一视频| 啊啊啊啊啊操我视频| 亚洲AV无码国产精品久久久久| 91天天综合日韩欧美| 91麻豆一二三区| 青青草视频这里只有精品| 国内毛片婷婷六月色| 精品999一区二区| 亚洲天天影视色综合| 又黄又爽在线观看视频| 奇米狠999| 亚洲一区二区三区春色| 国产乱码久久久| 国产人妻一区二区三区欧美毛片| 综合熟女| 国产树林里野战在线看| 午夜亚洲WWW湿好大| 九九热精品视频六| 99re在线精品78| 久久9久9久99久9久9| 曰韩无码777| 国产精品一级特黄aaa大片在线观看| 亚洲91在线| 人妻熟妇一区二区三区| 中文字幕人乱码中文字的预防方法 | 狠插 制服 自拍| 欧美一区91大爱| 国产免费永久精品无码| 国产人伦a片信息免费片| 日本爽爽爽爽爽爽免费视频| 97欧美日韩| 无套后入双马尾| 色香网| 热久久无毒不卡| 是还免费视频1727我| 男生女生啊啊啊啊| 青青青操| 骚货| 九九热九九热| 婷婷香蕉欧美在线一区二区三区| 色色五月婷婷| 免费视频a级毛片免费视频| 夜嗨影院| 嫖老熟女A片一二三区| 国语国产操逼伊人AV网| 曰本人妻人人澡人人夹| 又粗又长又爽在线观看| 国产精品久久久久久照片| 亚洲日韩视频二区| 久久久久久亚洲Av无码精| 日韩特级毛片免费观看全集| 欧美日本成人一区二区| 97操| 91在线精品一区二区三区| 91精品无码久久久久久久| 天天日天天操天天射河南省| 国产高清自拍视频| 看免费一级在线播放毛片| 亚洲 欧美 精品专区 极品| 欧美高清18A片| 国产强奸乱伦xd| 国产高清26uuu| 日本性爱少妇| 五月丁香综合啪啪| 性吧在线视频| 亚洲色图 欧美热图 清纯唯美 另类自拍 | 亚洲日本加勒比在线| 青青青操| 天天α片| 碰人碰碰人人开房人肉| 日韩精品人妻中文字幕不卡乱码| 啊啊啊啊好疼| 秋霞怕怕片| 国产精品日韩在线一区| 国产精品无码av| 日本综合久久| 天天干一区二区| 日本黄色裸日本黄色裸体| 美熟女逼导航AV操逼| 亚洲天在线| 欧美97| 曰本人妻人人澡人人夹| 丁香啪啪| 天天日日本| 国产吹潮女在线观看| 91天堂网| av无码av无码专区| 五月丁香影视| 97色97好| 欧美小说区视频区| 黄色电影在线播放综合网站| 青草伊人久久| 国产精品乱码久久| 中文字幕在线免费观看2| 国产亚洲福利第一页丝袜| 97色色视频| 国产乱码精品久久久久久| 日韩有码中文字幕女同性恋 | 欧美日韩操逼嗦吊| 午夜精品一区二区三区三上悠亚| 动漫片子网站3黄| 伊人在线大香蕉视频久久| 色悠久| 成人三一级一片aaa| 丁香五月天社区| 亚洲欧洲久久天堂| 97天天操| 久久九九视频九九视频| 丝袜熟女2P| 亚洲91射| 蜜乳AV.COM| 久久精品人体AV| 夜夜夜夜爽| 波多野结衣AV无码一区| 色色色欧美| 99爱爱| 久艾草在线精品视频在线观看| 人妻中文在线| AV色五月天| 亚洲精品一区二区精品| 亚洲va综合va国产va中文| 粉嫩久久久久| 亚洲影院无码在线| 天天干少妇| 91欧美少妇| 国产综合网站在线播放| 蜜臀久久99精品久久久久免费观| 无人区高清电影免费观看一区二区三 www.qmcai2.com | 欧美性爱18观看| 国产按摩一区二区三区| 久久9精品网站| 91午夜无码| 中文字幕av久久爽Av| 超碰在线一区二区| 色婷婷丁香五月| 强乱老妇中文字幕| 国产欧美日韩精品中文| 精品999日本| 性爱网站一区二区| 99re这里只有精品3| 97在线看| 九色 人妻 大香蕉| 日韩十八禁| 91九色网| 97超碰精品图片| 去干网最新版| 99热这里只有精品1| 亚洲精品aa久久伊人| 天美传媒av在线| 日本免费专区| 亚州色阁| 国产黄色 A 片免费看| 欧美一级专区免费大片| 日韩国产欧美伦理在线| 绑缚麻绳人妻寝取完整版| 欧美爱三级日韩久久| 在线综合 亚洲 欧美中文字幕 | 久久久久久国产精品免费网站| 东京热不卡视频| 久久av成人无码免费| 日本精品一区二区三| 国产18精品亚洲精品| 丝袜视频网国产90| 亚洲超碰在线| 伊人网高清| 欧美精品成人亚洲| 国产又粗又大硬免费色网视频| 精品一区二区三区最新| 久久久草草精品| 综合性视频99| 亚洲色91C| 色色色色日本| 久久性爱精品一区| 男人综合网| JIZZJIZZ亚洲女人被躁| 亚洲AV乱码专区国产噜噜亚洲| 91精品无码久久久久久久| 亚洲91网。| 成人三一级一片aaa| 怡红院亚洲怡春院av| 午夜大香蕉| 午夜传煤十二区精品| 亚州久久9| 日韩Va亚洲va欧美Ⅴa久久| 91老熟女91老女人| 99自拍视频| 日韩欧美大片免费高清啪啪| 东京热av男人的天堂| 另类小色呦| 91啪啪| 丰满搜索结果 -第18页- 久久高清无码 | 九九亚洲视频| 探花视频免费观看国产专区| 青娱乐手机日韩在线视频| 天美麻花大全视频| 9久在线视频只有精品| 日韩视频小说在线观看| 麻豆这里只有精品| 中英熟女操女| 果冻传媒A片一二三区| 久久久精品国产亚洲伊人| WWW啪啪的com| 亚洲欧美碰碰| 日韩啪啪啪视频| 色婷婷激情| 岛国网址国产| 亚洲97在线| 国产热av| 夜夜高潮夜夜爽| 国产伦乱91| 欧美特大AA级黄片| 9精品久久久久| 欧洲一区二区三区免费| 九九Av| 久草视频在线视频在线视频在线观看| 亚洲欧美日韩不卡人妻| 啊啊啊好舒服视频在线观看| 狠狠干综合| 插日本熟女视频| 极品销魂美女一区二区| www.人人摸在线视频| 亚洲自拍一区夜夜操| 超踫中文字幕| 国产午夜无码片在线观看影视| 88xx成人精品视频| 91欧| 亚洲欧美综合网站| 成人A片男人的天堂| 七久久久| 色婷婷99| 在线啊v一区| 国产最新小视频在线播放下载| 大色综合| 欧美天天干| 久久精品导航| 91n.欧美| 91女优在线观看| 熟女一区二区三区| 91欧美偷拍| 九九无码久久精品视频| 欧美性爱五月天| 五月天色色网站| 凸凹视频在线观看| 国产黄片在线免费观看| 免费日韩黄片| 在线播放成人高清免费视频| 99热在线观看| 91美女小视频| 超碰人妻久久| 久操免费观看| 亚洲天堂2020| 日本不卡在线二区三区| 99rre在线精品99re8| 国产精品伦理| 九九精品热| 久久草视频污视频| 久久99干一本高清| 97超碰伊人| 97超碰欧美手机在线| 天天操美美| 欧美一区二区三区成人性生活| 中文字幕久久精视频久久大全| 欧美 日韩 国产传媒| 60秒试看最爽10分钟网站| 欧美亚洲第1页| 青青草精品| 大香蕉欧美国产日韩高潮| 人人爽人人精品乱人伦AV| 黑人精品久久97| 亚洲。天堂。日本在线观看| 五十路熟女在线不卡观看一区二区| 中文一区二区| 97在线观看视频| 96久久久久|