精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Gin集成Casbin進行訪問權限控制

開源
Casbin是一個強大的、高效的開源訪問控制框架,其權限管理機制支持多種訪問控制模型,Casbin只負責訪問控制.

[[391016]]

Casbin是什么

Casbin是一個強大的、高效的開源訪問控制框架,其權限管理機制支持多種訪問控制模型,Casbin只負責訪問控制[1]。

其功能有:

  • 支持自定義請求的格式,默認的請求格式為{subject, object, action}。.
  • 具有訪問控制模型model和策略policy兩個核心概念。
  • 支持RBAC中的多層角色繼承,不止主體可以有角色,資源也可以具有角色。
  • 支持內置的超級用戶 例如:root或administrator。超級用戶可以執行任何操作而無需顯式的權限聲明。
  • 支持多種內置的操作符,如 keyMatch,方便對路徑式的資源進行管理,如 /foo/bar可以映射到 /foo*

Casbin的工作原理

在 Casbin 中, 訪問控制模型被抽象為基于 **PERM **(Policy, Effect, Request, Matcher) [策略,效果,請求,匹配器]的一個文件。

  • Policy:定義權限的規則
  • Effect:定義組合了多個Policy之后的結果
  • Request:訪問請求
  • Matcher:判斷Request是否滿足Policy

首先會定義一堆Policy,然后通過Matcher來判斷Request和Policy是否匹配,然后通過Effect來判斷匹配結果是Allow還是Deny。

Casbin的核心概念

Model

Model是Casbin的具體訪問模型,其主要以文件的形式出現,該文件常常以.conf最為后綴。

  • Model CONF 至少應包含四個部分: [request_definition], [policy_definition], [policy_effect], [matchers]。
  • 如果 model 使用 RBAC, 還需要添加[role_definition]部分。
  • Model CONF 文件可以包含注釋。注釋以 # 開頭, # 會注釋該行剩余部分。

比如:

  1. # Request定義 
  2. [request_definition] 
  3. r = sub, obj, act 
  4.  
  5. # 策略定義 
  6. [policy_definition] 
  7. p = sub, obj, act 
  8.  
  9. # 角色定義 
  10. [role_definition] 
  11. g = _, _ 
  12.  
  13. [policy_effect] 
  14. e = some(where (p.eft == allow)) 
  15.  
  16. # 匹配器定義 
  17. [matchers] 
  18. m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act 
  • request_definition:用于request的定義,它明確了e.Enforce(...)函數中參數的定義,sub, obj, act 表示經典三元組: 訪問實體 (Subject),訪問資源 (Object) 和訪問方法 (Action)。
  • policy_definition:用于policy的定義,每條規則通常以形如p的policy type開頭,比如p,joker,data1,read就是一條joker具有data1讀權限的規則。
  • role_definition:是RBAC角色繼承關系的定義。g 是一個 RBAC系統,_, _表示角色繼承關系的前項和后項,即前項繼承后項角色的權限。
  • policy_effect:是對policy生效范圍的定義,它對request的決策結果進行統一的決策,比如e = some(where (p.eft == allow))就表示如果存在任意一個決策結果為allow的匹配規則,則最終決策結果為allow。p.eft 表示策略規則的決策結果,可以為allow 或者deny,當不指定規則的決策結果時,取默認值allow 。
  • matchers:定義了策略匹配者。匹配者是一組表達式,它定義了如何根據請求來匹配策略規則

Policy

Policy主要表示訪問控制關于角色、資源、行為的具體映射關系。

比如:

  1. p, alice, data1, read 
  2. p, bob, data2, write 
  3. p, data2_admin, data2, read 
  4. p, data2_admin, data2, write 
  5. g, alice, data2_admin 

它的關系規則很簡單,主要是選擇什么方式來存儲規則,目前官方提供csv文件存儲和通過adapter適配器從其他存儲系統中加載配置文件,比如MySQL, PostgreSQL, SQL Server, SQLite3,MongoDB,Redis,Cassandra DB等。

實踐

創建項目

首先創建一個項目,叫casbin_test。

項目里的目錄結構如下:

  1. ├─configs         # 配置文件 
  2. ├─global      # 全局變量 
  3. ├─internal        # 內部模塊 
  4. │  ├─dao     # 數據處理模塊 
  5. │  ├─middleware   # 中間件 
  6. │  ├─model        # 模型層 
  7. │  ├─router       # 路由 
  8. │  │  └─api 
  9. │  │      └─v1    # 視圖 
  10. │  └─service      # 業務邏輯層 
  11. └─pkg             # 內部模塊包 
  12.     ├─app         # 應用包 
  13.     ├─errcode     # 錯誤代碼包 
  14.     └─setting     # 配置包 

下載依賴包,如下:

  1. go get -u github.com/gin-gonic/gin 
  2. # Go語言casbin的依賴包 
  3. go get github.com/casbin/casbin 
  4. # gorm 適配器依賴包 
  5. go get github.com/casbin/gorm-adapter 
  6. # mysql驅動依賴 
  7. go get github.com/go-sql-driver/mysql 
  8. # gorm 包 
  9. go get github.com/jinzhu/gorm 

創建數據庫,如下:

  1. CREATE DATABASE `casbin_test` DEFAULT CHARACTER SET utf8; 
  2. GRANT AlterAlter Routine, CreateCreate Routine, Create Temporary Tables, Create ViewDeleteDrop, Event, ExecuteIndexInsert, Lock Tables, ReferencesSelect, Show ViewTriggerUpdate ON `casbin\_test`.* TO `ops`@`%`; 
  3. FLUSH PRIVILEGES
  4. DROP TABLE IF EXIST `casbin_rule`; 
  5. CREATE TABLE `casbin_rule` ( 
  6.   `p_type` varchar(100) DEFAULT NULL COMMENT '規則類型'
  7.   `v0` varchar(100) DEFAULT NULL COMMENT '角色ID'
  8.   `v1` varchar(100) DEFAULT NULL COMMENT 'api路徑'
  9.   `v2` varchar(100) DEFAULT NULL COMMENT 'api訪問方法'
  10.   `v3` varchar(100) DEFAULT NULL
  11.   `v4` varchar(100) DEFAULT NULL
  12.   `v5` varchar(100) DEFAULT NULL 
  13. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='權限規則表'
  14. /*插入操作casbin api的權限規則*/ 
  15. INSERT INTO `casbin_rule`(`p_type`, `v0`, `v1`, `v2`) VALUES ('p''admin''/api/v1/casbin''POST'); 
  16. INSERT INTO `casbin_rule`(`p_type`, `v0`, `v1`, `v2`) VALUES ('p''admin''/api/v1/casbin/list''GET'); 

代碼開發

由于代碼比較多,這里就不貼全部代碼了,全部代碼已經放在gitee倉庫[3],可以自行閱讀,這些僅僅貼部分關鍵代碼。

(1)首先在configs目錄下創建rbac_model.conf文件,寫入如下代碼:

  1. [request_definition] 
  2. r = sub, obj, act 
  3.  
  4. [policy_definition] 
  5. p = sub, obj, act 
  6.  
  7. [role_definition] 
  8. g = _, _ 
  9.  
  10. [policy_effect] 
  11. e = some(where (p.eft == allow)) 
  12.  
  13. [matchers] 
  14. m = r.sub == p.sub && ParamsMatch(r.obj,p.obj) && r.act == p.act 

(2)在internal/model目錄下,創建casbin.go文件,寫入如下代碼:

  1. type CasbinModel struct { 
  2.  PType  string `json:"p_type" gorm:"column:p_type" description:"策略類型"
  3.  RoleId string `json:"role_id" gorm:"column:v0" description:"角色ID"
  4.  Path   string `json:"path" gorm:"column:v1" description:"api路徑"
  5.  Method string `json:"method" gorm:"column:v2" description:"訪問方法"
  6.  
  7. func (c *CasbinModel) TableName() string { 
  8.  return "casbin_rule" 
  9.  
  10. func (c *CasbinModel) Create(db *gorm.DB) error { 
  11.  e := Casbin() 
  12.  if success := e.AddPolicy(c.RoleId,c.Path,c.Method); success == false { 
  13.   return errors.New("存在相同的API,添加失敗"
  14.  } 
  15.  return nil 
  16.  
  17. func (c *CasbinModel) Update(db *gorm.DB, values interface{}) error { 
  18.  if err := db.Model(c).Where("v1 = ? AND v2 = ?", c.Path, c.Method).Update(values).Error; err != nil { 
  19.   return err 
  20.  } 
  21.  return nil 
  22.  
  23. func (c *CasbinModel) List(db *gorm.DB) [][]string { 
  24.  e := Casbin() 
  25.  policy := e.GetFilteredPolicy(0, c.RoleId) 
  26.  return policy 
  27.  
  28. //@function: Casbin 
  29. //@description: 持久化到數據庫  引入自定義規則 
  30. //@return: *casbin.Enforcer 
  31. func Casbin() *casbin.Enforcer { 
  32.  s := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=%s&parseTime=%t&loc=Local"
  33.   global.DatabaseSetting.Username, 
  34.   global.DatabaseSetting.Password
  35.   global.DatabaseSetting.Host, 
  36.   global.DatabaseSetting.DBName, 
  37.   global.DatabaseSetting.Charset, 
  38.   global.DatabaseSetting.ParseTime, 
  39.  ) 
  40.  db, _ := gorm.Open(global.DatabaseSetting.DBType, s) 
  41.  
  42.  adapter := gormadapter.NewAdapterByDB(db) 
  43.  enforcer := casbin.NewEnforcer(global.CasbinSetting.ModelPath, adapter) 
  44.  enforcer.AddFunction("ParamsMatch", ParamsMatchFunc) 
  45.  _ = enforcer.LoadPolicy() 
  46.  return enforcer 
  47.  
  48. //@function: ParamsMatch 
  49. //@description: 自定義規則函數 
  50. //@param: fullNameKey1 string, key2 string 
  51. //@return: bool 
  52. func ParamsMatch(fullNameKey1 string, key2 string) bool { 
  53.  key1 := strings.Split(fullNameKey1, "?")[0] 
  54.  // 剝離路徑后再使用casbin的keyMatch2 
  55.  return util.KeyMatch2(key1, key2) 
  56.  
  57. //@function: ParamsMatchFunc 
  58. //@description: 自定義規則函數 
  59. //@param: args ...interface{} 
  60. //@return: interface{}, error 
  61. func ParamsMatchFunc(args ...interface{}) (interface{}, error) { 
  62.  name1 := args[0].(string) 
  63.  name2 := args[1].(string) 
  64.  
  65.  return ParamsMatch(name1, name2), nil 

(3)在internal/dao目錄下創建casbin.go,寫入如下代碼:

  1. func (d *Dao) CasbinCreate(roleId string, path, method string) error { 
  2.  cm := model.CasbinModel{ 
  3.   PType:  "p"
  4.   RoleId: roleId, 
  5.   Path:   path, 
  6.   Method: method, 
  7.  } 
  8.  return cm.Create(d.engine) 
  9.  
  10. func (d *Dao) CasbinList(roleID string) [][]string { 
  11.  cm := model.CasbinModel{RoleId: roleID} 
  12.  return cm.List(d.engine) 

(4)在internal/service目錄下創建service.go,寫入如下代碼:

  1. type CasbinInfo struct { 
  2.  Path   string `json:"path" form:"path"
  3.  Method string `json:"method" form:"method"
  4. type CasbinCreateRequest struct { 
  5.  RoleId      string       `json:"role_id" form:"role_id" description:"角色ID"
  6.  CasbinInfos []CasbinInfo `json:"casbin_infos" description:"權限模型列表"
  7.  
  8. type CasbinListResponse struct { 
  9.  List []CasbinInfo `json:"list" form:"list"
  10.  
  11. type CasbinListRequest struct { 
  12.  RoleID string `json:"role_id" form:"role_id"
  13.  
  14. func (s Service) CasbinCreate(param *CasbinCreateRequest) error { 
  15.  for _, v := range param.CasbinInfos { 
  16.   err := s.dao.CasbinCreate(param.RoleId, v.Path, v.Method) 
  17.   if err != nil { 
  18.    return err 
  19.   } 
  20.  } 
  21.  return nil 
  22.  
  23.  
  24. func (s Service) CasbinList(param *CasbinListRequest) [][]string { 
  25.  return s.dao.CasbinList(param.RoleID) 

(5)在internal/router/api/v1目錄下創建casbin.go,寫入如下代碼:

  1. type Casbin struct { 
  2.  
  3. func NewCasbin() Casbin { 
  4.  return Casbin{} 
  5.  
  6. // Create godoc 
  7. // @Summary 新增權限 
  8. // @Description 新增權限 
  9. // @Tags 權限管理 
  10. // @Produce json 
  11. // @Security ApiKeyAuth 
  12. // @Param body body service.CasbinCreateRequest true "body" 
  13. // @Success 200 {object} string "成功" 
  14. // @Failure 400 {object} errcode.Error "請求錯誤" 
  15. // @Failure 500 {object} errcode.Error "內部錯誤" 
  16. // @Router /api/v1/casbin [post] 
  17. func (c Casbin) Create(ctx *gin.Context) { 
  18.  param := service.CasbinCreateRequest{} 
  19.  response := app.NewResponse(ctx) 
  20.  valid, errors := app.BindAndValid(ctx, &param) 
  21.  if !valid { 
  22.   log.Printf("app.BindAndValid errs: %v", errors) 
  23.   errRsp := errcode.InvalidParams.WithDetails(errors.Errors()...) 
  24.   response.ToErrorResponse(errRsp) 
  25.   return 
  26.  } 
  27.  
  28.  // 進行插入操作 
  29.  svc := service.NewService(ctx) 
  30.  err := svc.CasbinCreate(&param) 
  31.  if err != nil { 
  32.   log.Printf("svc.CasbinCreate err: %v", err) 
  33.   response.ToErrorResponse(errcode.ErrorCasbinCreateFail) 
  34.  } 
  35.  response.ToResponse(gin.H{}) 
  36.  return 
  37.  
  38.  
  39. // List godoc 
  40. // @Summary 獲取權限列表 
  41. // @Produce json 
  42. // @Tags 權限管理 
  43. // @Security ApiKeyAuth 
  44. // @Param data body service.CasbinListRequest true "角色ID" 
  45. // @Success 200 {object} service.CasbinListResponse "成功" 
  46. // @Failure 400 {object} errcode.Error "請求錯誤" 
  47. // @Failure 500 {object} errcode.Error "內部錯誤" 
  48. // @Router /api/v1/casbin/list [post] 
  49. func (c Casbin) List(ctx *gin.Context) { 
  50.  param := service.CasbinListRequest{} 
  51.  response := app.NewResponse(ctx) 
  52.  valid, errors := app.BindAndValid(ctx, &param) 
  53.  if !valid { 
  54.   log.Printf("app.BindAndValid errs: %v", errors) 
  55.   errRsp := errcode.InvalidParams.WithDetails(errors.Errors()...) 
  56.   response.ToErrorResponse(errRsp) 
  57.   return 
  58.  } 
  59.  // 業務邏輯處理 
  60.  svc := service.NewService(ctx) 
  61.  casbins := svc.CasbinList(&param) 
  62.  var respList []service.CasbinInfo 
  63.  for _, host := range casbins { 
  64.   respList = append(respList, service.CasbinInfo{ 
  65.    Path:   host[1], 
  66.    Method: host[2], 
  67.   }) 
  68.  } 
  69.  response.ToResponseList(respList, 0) 
  70.  return 

再在該目錄下創建一個test.go文件,用于測試,代碼如下:

  1. type Test struct { 
  2.  
  3. func NewTest() Test { 
  4.  return Test{} 
  5.  
  6. func (t Test) Get(ctx *gin.Context) { 
  7.  log.Println("Hello 接收到GET請求.."
  8.  response := app.NewResponse(ctx) 
  9.  response.ToResponse("接收GET請求成功"

(6)在internal/middleware目錄下創建casbin_handler.go,寫入如下代碼:

  1. func CasbinHandler() gin.HandlerFunc { 
  2.  return func(ctx *gin.Context) { 
  3.   response := app.NewResponse(ctx) 
  4.   // 獲取請求的URI 
  5.   obj := ctx.Request.URL.RequestURI() 
  6.   // 獲取請求方法 
  7.   act := ctx.Request.Method 
  8.   // 獲取用戶的角色 
  9.   sub := "admin" 
  10.   e := model.Casbin() 
  11.   fmt.Println(obj, act, sub) 
  12.   // 判斷策略中是否存在 
  13.   success := e.Enforce(sub, obj, act) 
  14.   if success { 
  15.    log.Println("恭喜您,權限驗證通過"
  16.    ctx.Next() 
  17.   } else { 
  18.    log.Printf("e.Enforce err: %s""很遺憾,權限驗證沒有通過"
  19.    response.ToErrorResponse(errcode.UnauthorizedAuthFail) 
  20.    ctx.Abort() 
  21.    return 
  22.   } 
  23.  } 

(7)在internal/router目錄下創建router.go,定義路由,代碼如下:

  1. func NewRouter() *gin.Engine { 
  2.  r := gin.New() 
  3.  r.Use(gin.Logger()) 
  4.  r.Use(gin.Recovery()) 
  5.  casbin := v1.NewCasbin() 
  6.  test := v1.NewTest() 
  7.  apiv1 := r.Group("/api/v1"
  8.  apiv1.Use(middleware.CasbinHandler()) 
  9.  { 
  10.   // 測試路由 
  11.   apiv1.GET("/hello", test.Get) 
  12.  
  13.   // 權限策略管理 
  14.   apiv1.POST("/casbin", casbin.Create
  15.   apiv1.POST("/casbin/list", casbin.List) 
  16.  } 
  17.  return r 

最后就啟動項目進行測試。

驗證

(1)首先訪問測試路徑,當前情況下沒在權限表里,如下:


(2)將測試路徑添加到權限列表,如下:


(3)然后再次訪問測試路徑,如下: 

并且從日志上也可以看到,如下:


參考文檔:

[1] https://casbin.org/

[2] https://casbin.org/docs/zh-CN/overview

[3] https://gitee.com/coolops/casbin_test.git

 

責任編輯:姜華 來源: 運維開發故事
相關推薦

2021-08-09 07:29:54

PythonCasbinPython基礎

2025-09-03 00:06:05

2019-07-30 15:13:30

2023-08-07 08:13:41

2010-07-19 21:31:42

2023-08-07 15:23:28

鴻蒙首次啟動申請授權

2022-01-07 07:29:08

Rbac權限模型

2016-10-12 15:11:56

2011-09-01 12:42:09

SQL Server創建加密視圖控制視圖頁面的訪問權限

2013-03-26 13:38:12

Android per

2021-07-21 09:03:53

GoogleChrome權限

2011-09-01 12:53:02

SQL Server控制視圖頁面的訪問權限

2012-11-15 10:42:10

云集成大數據云應用集成

2009-09-24 13:47:05

IIS安全配置web服務器訪問控制

2011-08-03 10:20:27

網絡智能手機

2011-08-03 10:01:28

網絡智能手機

2013-05-14 10:37:10

AIR Android設置訪問權限

2011-03-03 15:02:22

proftpd權限

2011-03-03 11:13:11

Pureftpd

2009-02-05 10:12:00

訪問控制列表限制訪問
點贊
收藏

51CTO技術棧公眾號

av一区二区三区在线| 婷婷五月精品中文字幕| 日韩毛片无码永久免费看| 看女生喷水的网站在线观看| 黄色美女久久久| 中文在线免费一区三区高中清不卡| 欧美激情国产精品| 中文字幕av日韩精品| 久久草视频在线| 高清在线一区二区| 中文字幕欧美三区| 91精品视频免费看| www.97视频| 日韩av电影资源网| 久久先锋影音av| 97人人做人人爱| 亚洲欧美日韩色| 台湾佬中文娱乐久久久| 久久免费国产精品| 亚洲一区二区三区在线视频| 久久爱一区二区| 国产suv精品一区| 亚洲一区二区高清| 成人性色av| 免费人成视频在线| 日韩精品成人| 一区二区三区欧美激情| 国产精品福利片| 欧美特黄一区二区三区| 国产网站在线| 99国产精品99久久久久久| 久久青草福利网站| 精品无码国产一区二区三区51安| 成年人视频免费在线播放| 国产东北露脸精品视频| 欧美大片在线看| 嘿嘿视频在线观看| 95精品视频| 久热国产在线| 奇米777欧美一区二区| 亚洲精品视频播放| 超碰影院在线观看| 国产福利在线| 精品无人码麻豆乱码1区2区 | 久久视频在线观看免费| 嫩草视频免费在线观看| 超碰免费在线播放| 国产传媒日韩欧美成人| 国产精品网站大全| 欧美一区二区三区爽爽爽| 嫩呦国产一区二区三区av| 一区二区三区欧美日韩| 亚洲一区二区三区涩| 一区二区三区免费在线视频| 欧美xxx.com| 日本精品在线播放| 欧美日韩视频在线第一区| 日韩视频一二三| 日韩中文字幕观看| 石原莉奈在线亚洲三区| 久久精品视频亚洲| 久久久久久久无码| а√中文在线天堂精品| 欧美性xxxxxxxxx| 一本一生久久a久久精品综合蜜| 可以在线观看的av| 成人免费高清在线| 国产精品久久久久久一区二区| 日韩在线视频网址| 久久夜色电影| 亚洲精品黄网在线观看| 国产一二三四在线视频| 青春草免费在线视频| 久久品道一品道久久精品| 国模精品一区二区三区| 久草视频在线免费| 国产一区亚洲| 中文字幕日韩av| 李丽珍裸体午夜理伦片| 人人精品久久| 日韩欧美在线观看视频| 黑鬼大战白妞高潮喷白浆| 在线成人视屏| 777欧美精品| 午夜精品久久久内射近拍高清| 亚洲综合影视| 国产精品久久久久婷婷二区次| 国产一区喷水| 黄色av网站在线看| av网站一区二区三区| 久久精品二区| www.日韩高清| 激情综合色播激情啊| 97久久天天综合色天天综合色hd | 99九九热只有国产精品| 亚洲国产精品va在看黑人| 污污的视频免费观看| 成人教育av| 亚洲va国产va欧美va观看| 日韩人妻精品一区二区三区| 精品三级久久久久久久电影聊斋| 国产精品污网站| 被灌满精子的波多野结衣| 免费a级在线播放| 国产欧美一区二区在线观看| 久久精品第九区免费观看| 99视频在线观看地址| 久久久久久久久免费| 国产一区福利视频| 在线免费观看的av网站| 亚洲午夜久久久久久久久电影网| 韩国一区二区av| 亚洲一区二区三区中文字幕在线观看 | 欧美二区三区在线| 亚洲大尺度视频| 国产原创一区二区三区| 成人黄色免费看| 一级特黄aaaaaa大片| 成人三级伦理片| 一卡二卡3卡四卡高清精品视频| 一级黄色片国产| 亚洲成人av观看| 亚洲第一中文字幕| 国产午夜手机精彩视频| 久久香蕉精品| 国产一级精品aaaaa看| 黄色在线视频网站| 欧美视频一区二区三区四区| 久久无码高潮喷水| 午夜伦理福利在线| 在线视频亚洲一区| 亚洲最大成人在线观看| 精品乱码一区二区三区四区| 欧美蜜桃一区二区三区| 污污的视频免费观看| 亚洲毛片免费看| 亚洲午夜未删减在线观看 | 国产又粗又长又黄| 久久99国内精品| 99影视tv| 欧美新色视频| 国产精品女同一区二区三区| 免费成人午夜视频| 日韩免费小视频| 7777精品伊人久久久大香线蕉最新版| 青青草成人免费视频| 黄色不卡一区| 久久久极品av| 亚洲一区中文字幕永久在线| 国产精品一区二区视频| 精品一区二区三区自拍图片区 | 一本色道久久综合狠狠躁篇的优点 | 国产福利一区二区三区| 一级二级三级欧美| 四虎国产精品永久在线国在线| 一区二区av在线| 国产女优在线播放| 国产精品综合一区二区三区| 中国成人在线视频| 亚洲精品乱码日韩| 日韩视频中文字幕| 日本熟妇毛耸耸xxxxxx| 日韩在线卡一卡二| 51国偷自产一区二区三区的来源| 亚洲视频tv| 午夜久久久久久电影| av地址在线观看| 国产探花在线精品一区二区| 欧美性受xxxx白人性爽| 国产日韩在线观看一区| 91片在线免费观看| 最新av网址在线观看| 中文字幕成人| 欧美国产亚洲视频| 特黄视频在线观看| 最新高清无码专区| 欧美女人性生活视频| 蜜桃tv一区二区三区| 欧美区二区三区| 艳妇乳肉豪妇荡乳av无码福利| 日本一区二区不卡视频| 午夜剧场高清版免费观看| 亚洲最新av| 国产精品亚洲激情| 成人av福利| 日韩成人在线免费观看| 日本黄色小说视频| 美女网站在线免费欧美精品| 九九九九精品| 亚洲成人av观看| 欧美成人午夜剧场免费观看| 亚洲视频在线观看一区二区| 亚洲日本欧美天堂| 手机在线成人免费视频| 亚洲一区二区三区无吗| 久久久com| 青青久久精品| 韩国国内大量揄拍精品视频| 福利在线视频导航| 欧美v日韩v国产v| 欧美激情图片小说| caoporn国产一区二区| 亚洲天堂网一区| 国内一区二区三区| 日韩精品电影网站| 欧美黄色三级| 九九热视频这里只有精品| 青青草免费观看免费视频在线| 欧美日韩激情一区二区三区| 天堂在线中文视频| 粉嫩av亚洲一区二区图片| 国产免费内射又粗又爽密桃视频| 外国成人毛片| 欧洲精品在线视频| 欧洲一级在线观看| 91精品国产色综合久久不卡蜜臀 | 农村少妇久久久久久久| 在线亚洲精品福利网址导航| 国产亚洲欧美精品久久久www | 日韩欧美主播在线| 色哟哟网站在线观看| 一级欧洲+日本+国产| 蜜桃久久影院| 欧美××××黑人××性爽 | 深田咏美在线x99av| 欧美极品影院| 欧美黑人巨大精品一区二区| 91.xxx.高清在线| 亚洲精品中文字幕av| 精品久久人妻av中文字幕| 欧美视频一区二区三区四区| 久久久免费高清视频| 国产亚洲精品久| 免费一级特黄录像| 国产亚洲激情| 五月天亚洲综合小说网| 欧美18xxxx| 国产精品高潮呻吟久久av黑人| 欧美人与性动交α欧美精品图片| 色妞久久福利网| 精品久久久免费视频| 欧美三级日本三级少妇99| 日韩在线播放中文字幕| 国产精品热久久久久夜色精品三区 | 久久9999久久免费精品国产| 99久久国产免费看| 中文字幕在线播放一区二区| 国产一区免费电影| 成人av毛片在线观看| 麻豆国产精品官网| 国内精品在线观看视频| av一区二区在线播放| 91日本在线视频| 亚洲一区av| 成人在线播放av| 国产精品一区二区精品视频观看| 国产精品亚洲欧美导航| 久久天天久久| 成人精品视频99在线观看免费| 亚洲老司机网| 亚洲自拍偷拍第一页| 视频免费一区二区| 官网99热精品| 天海翼精品一区二区三区| 国产美女久久精品| 天堂久久一区| 99r国产精品视频| 999久久精品| 精品久久久久亚洲| 免费欧美视频| 亚洲在线不卡| 欧美理论在线| 在线码字幕一区| 正在播放日韩欧美一页| 国产成人艳妇aa视频在线| av中文一区| 亚洲综合首页| 欧美视频日韩| 国产主播在线看| 日本在线不卡视频一二三区| 五月婷婷丁香色| 裸体素人女欧美日韩| 国产性生活免费视频| 在线不卡亚洲| 无码毛片aaa在线| 激情婷婷亚洲| 一本久道中文无码字幕av| 精品福利电影| 久草在在线视频| 毛片不卡一区二区| 337p日本欧洲亚洲大胆张筱雨 | 媚黑女一区二区| 国产原创精品在线| 成人黄色一级视频| 久久久久无码精品| 2024国产精品| 一级片一级片一级片| 午夜精品在线视频一区| 成人一二三四区| 精品国产伦一区二区三区观看体验| 在线免费看91| 亚洲第一级黄色片| 国产成人天天5g影院在线观看| 超碰97人人做人人爱少妇| jizz内谢中国亚洲jizz| 亚洲xxx自由成熟| 美女亚洲一区| 国产美女在线一区| 毛片av一区二区三区| 超碰97在线资源站| 亚洲视频在线一区二区| 日本一区二区网站| 91精品国产综合久久蜜臀| 欧美扣逼视频| 久久久亚洲国产天美传媒修理工| 黄色精品视频| 久久亚洲精品欧美| 好吊一区二区三区| 日韩成人精品视频在线观看| 91免费国产视频网站| 欧美精品久久久久性色| 欧美日本视频在线| 韩国福利在线| 91超碰caoporn97人人| 在线成人av观看| 91香蕉视频在线下载| 日韩大片在线观看| 日本一级淫片演员| 玖玖国产精品视频| 一区二区免费在线观看视频| 亚洲人成亚洲人成在线观看图片| 99re这里只有精品在线| 欧美日韩一区三区| 男女污污视频在线观看| 国内成人精品视频| 一区二区免费| 7777在线视频| 精品在线亚洲视频| 青青青视频在线免费观看| 综合久久久久久| 亚洲综合成人av| 亚洲日韩第一页| 国内精品不卡| 国产精品日韩av| 日韩精品久久久久久久电影99爱| 不卡影院一区二区| 久久久久久久综合日本| 日韩一区二区视频在线| 欧美日韩一本到| 在线日本中文字幕| 国产精品久久久久秋霞鲁丝| 亚洲欧美成人vr| 国产福利一区视频| 国产视频一区二区在线| 午夜久久久久久久久久影院| 亚洲精品视频免费在线观看| 日本不良网站在线观看| 91久久久久久久久久久久久| 天天精品视频| 欧美体内she精高潮| 久久日韩精品一区二区五区| 亚洲精品午夜国产va久久成人| 日韩成人在线视频网站| 亚洲午夜天堂| 日韩电影天堂视频一区二区| 日韩avvvv在线播放| 萌白酱视频在线| 精品欧美一区二区三区| 国产精品久久久久久无人区| 日日狠狠久久偷偷四色综合免费 | 婷婷在线播放| 国产成人精品久久二区二区| 日韩精品中文字幕吗一区二区| 8x8x华人在线| 不卡欧美aaaaa| 欧美a视频在线观看| 中文字幕亚洲无线码a| 国产亚洲字幕| 国产视频一视频二| 国产欧美一区二区三区网站| 国产精品九九九九| 欧美风情在线观看| 亚洲a级精品| 永久免费的av网站| 亚洲国产精品久久人人爱| 亚洲一卡二卡在线| 久久99久久99精品中文字幕| 精品网站aaa| 超碰在线播放91| 亚洲一区二区五区| 成人一区二区不卡免费| 欧美亚洲在线视频| 日韩精品一区二区久久| 久久人妻少妇嫩草av蜜桃| 亚洲欧美精品午睡沙发| 又色又爽又黄无遮挡的免费视频| 久久精品视频免费播放| 一区二区导航| 又黄又爽又色的视频| 欧美性xxxx极品高清hd直播|