精品欧美一区二区三区在线观看 _久久久久国色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中国片| 91超碰中文字幕久久精品| 色天使在线视频| 婷婷综合六月| 亚洲视频在线一区| 精品高清视频| 艳妇乳肉豪妇荡乳av| 欧美日韩国产免费观看| 国产视频久久网| 日韩成人精品视频在线观看| 99热99re6国产在线播放| 91亚洲精品乱码久久久久久蜜桃| 国产精品日日摸夜夜添夜夜av| 国产精品免费人成网站酒店| 欧洲精品一区| 91精品国产综合久久精品app| 免费av手机在线观看| 91精品国产91久久久久游泳池| 成人小视频免费观看| 国产精品成人久久久久| 久久久综合久久久| 成人羞羞网站入口| 亚洲韩国青草视频| 欧美性受xxxx黒人xyx性爽| 日本在线影院| 一级中文字幕一区二区| 日韩中文字幕av在线| 亚洲av无码片一区二区三区| 日韩不卡手机在线v区| 大量国产精品视频| 中文字幕伦理片| 啪啪激情综合网| 日韩一区二区麻豆国产| 中文字幕av不卡在线| 小早川怜子影音先锋在线观看| 亚洲欧美国产77777| 亚洲日本精品国产第一区| 天天射,天天干| 国产盗摄精品一区二区三区在线| 欧美最顶级的aⅴ艳星| 国产在线观看99| 亚洲精品国产偷自在线观看| 中文字幕一区二区精品| 国产精品815.cc红桃| 久久久免费毛片| 日韩精品一区二区三区四区视频 | 三级做a全过程在线观看| 国产一区二区三区精品欧美日韩一区二区三区 | 欧美亚日韩国产aⅴ精品中极品| 国产毛片视频网站| 免费在线观看av电影| 亚洲精品亚洲人成人网| 宅男av一区二区三区| 999在线视频| 欧美激情一区二区三区四区 | 三级理论午夜在线观看| av高清不卡在线| 国产欧美日韩在线播放| 国精品人妻无码一区二区三区喝尿| 激情综合网av| 亚洲a区在线视频| 国产福利小视频| 国产专区综合网| 亚洲一区中文字幕| 精品久久久久久亚洲综合网站| 国产在线不卡视频| 99re在线观看| 免费观看成年人视频| 成+人+亚洲+综合天堂| 国产精品乱子乱xxxx| 黄色av网址在线| 99久久免费视频.com| 欧美黑人xxxxx| 国产系列电影在线播放网址| 亚洲国产精品精华液2区45| 中日韩在线视频| 色综合999| 午夜精品在线视频一区| 可以免费观看av毛片| 91大神在线观看线路一区| 欧美老女人第四色| 美女又黄又免费的视频| 欧美日韩一区二区三区四区不卡 | 在线免费观看成人短视频| 日韩精品你懂的| 久久的色偷偷| 日韩av一区二区在线| 亚洲精品国产精品国自产网站| 久久久综合色| 国产最新精品视频| 黄色网址中文字幕| 国产一区视频在线看| 国产精品日韩高清| 成人高清免费在线播放| 亚洲乱码精品一二三四区日韩在线| 野外做受又硬又粗又大视频√| 黑人巨大精品| 51精品国自产在线| 亚洲制服丝袜在线播放| 日韩精品dvd| 欧美精品激情在线观看| 日本久久综合网| 国产乱子伦视频一区二区三区| 国产日韩欧美综合精品| 日本中文字幕在线观看| 亚洲午夜av在线| 国产成人黄色网址| 黄色欧美网站| 久久精品国产亚洲| 亚洲第一精品在线观看| 国产一区二区三区在线观看免费视频| 国产综合动作在线观看| 免费观看在线黄色网| 黄色成人av网| 亚洲精品在线视频播放| 在线看成人短视频| 九色成人免费视频| 中文字幕一二三四| 91麻豆免费观看| 日韩中文字幕在线不卡| 成人av色网站| 午夜精品久久久99热福利| 亚洲国产综合av| 国内黄色精品| 性欧美亚洲xxxx乳在线观看| 国产又粗又黄又爽| 国产色婷婷亚洲99精品小说| 国产肉体ⅹxxx137大胆| 欧美黄色成人| 国产亚洲欧美日韩美女| 亚洲天堂日韩av| 国产白丝精品91爽爽久久| 亚洲一区bb| 中文在线最新版地址| 精品剧情v国产在线观看在线| 成人欧美一区二区三区黑人一 | 欧美成人中文字幕在线| 中文在线免费看视频| wwwwww.欧美系列| 欧美 日韩 国产精品| 国产高清亚洲| 日韩亚洲精品电影| 中文字幕二区三区| 国产日韩v精品一区二区| 99爱视频在线| 欧美色图婷婷| 久久精品人人做| 欧美一级大片视频| 性xxxx18| 黑人狂躁日本妞一区二区三区 | 久久天堂影院| 一道本无吗dⅴd在线播放一区| 精品欧美一区二区三区免费观看 | 99re视频在线| 伦理在线一区| 日韩一区二区中文字幕| 亚洲人做受高潮| 精品亚洲国产成人av制服丝袜| 三区精品视频| www.26天天久久天堂| 中文字幕无线精品亚洲乱码一区 | 欧美日韩国产综合视频在线观看| 青娱乐国产视频| 日本va欧美va精品发布| 亚洲国产日韩美| 小说区图片区亚洲| 欧美成人黑人xx视频免费观看| 国产尤物在线观看| 一区二区理论电影在线观看| 国产69视频在线观看| 亚洲日本免费| 欧美亚洲国产免费| 久久精品国产福利| 欧美人成在线视频| 午夜在线视频免费| 在线观看免费一区| 国产黄色小视频网站| 国产精品一级片| 又粗又黑又大的吊av| 国产乱码精品一区二区亚洲| 国产精品久久99久久| 成人午夜在线影视| 亚洲国产精品免费| 99re这里只有精品在线| 国产精品久久久久久久久晋中| 小早川怜子一区二区三区| 欧美激情精品久久久六区热门| 国产美女在线精品免费观看| 亚洲www免费| 日韩在线观看免费av| www.激情五月.com| 欧美性猛交xxxx富婆| 五月天婷婷丁香网| 丁香亚洲综合激情啪啪综合| 黄色免费观看视频网站| 日韩欧美中文| 国产原创精品| 欧美激情啪啪| 97免费视频在线播放| 国产福利免费在线观看| 欧美大片拔萝卜| 精品乱码一区内射人妻无码| 亚洲精品午夜久久久| 中文字幕一区二区三区人妻| 精品一区二区久久久| 亚洲 自拍 另类小说综合图区| av一区二区在线播放| 亚洲a∨日韩av高清在线观看| 中文在线аv在线| 欧美福利视频在线观看| 国产在线超碰| 欧美精品一区二区不卡| 中文字幕在线观看国产| 亚洲成人av在线电影| 成人午夜免费影院| 久久午夜羞羞影院免费观看| 国产一级二级av| 蜜臀av性久久久久蜜臀aⅴ四虎| 国产免费黄色一级片| 激情小说一区| 国产免费久久av| 欧美一区 二区 三区| 国模叶桐国产精品一区| 蜜桃久久精品成人无码av| 欧美性理论片在线观看片免费 | a篇片在线观看网站| 亚洲欧美精品一区| 人妻精品一区一区三区蜜桃91| 欧美福利视频一区| 久久久久久久久久成人| 欧美日韩午夜剧场| 国产在线拍揄自揄拍无码视频| 亚洲素人一区二区| 性色国产成人久久久精品| 久久精品一二三| 国产肉体xxxx裸体784大胆| 国产91丝袜在线播放九色| 九九热免费在线观看| 青青草国产成人av片免费| www.中文字幕在线| 亚洲免费高清| 精品成在人线av无码免费看| 色橹橹欧美在线观看视频高清| 91嫩草免费看| 欧美成a人片免费观看久久五月天| 国产精品国产三级国产aⅴ浪潮 | 成人av色在线观看| 成人福利片在线| 国产精品一区二区女厕厕| yw.尤物在线精品视频| 8050国产精品久久久久久| 黄色漫画在线免费看| 午夜精品国产精品大乳美女| 97超碰免费在线| 68精品国产免费久久久久久婷婷| av手机在线观看| 欧美一区二三区| 625成人欧美午夜电影| 国产999精品| 韩国成人在线| 国产日韩在线一区| www.成人| 岛国视频一区| 西野翔中文久久精品字幕| 日本不卡一区二区三区在线观看 | 国产乱子伦精品无码专区| 欧美特黄一级| 18禁网站免费无遮挡无码中文| 99国产精品久久久久久久| 黄色免费视频大全| 日韩vs国产vs欧美| 不卡的在线视频| 国产不卡视频在线播放| 成人无码www在线看免费| 亚洲国产精品成人综合| 亚洲色偷偷综合亚洲av伊人| 亚洲永久精品大片| 亚洲男人的天堂在线视频| 欧美主播一区二区三区| av中文字幕免费在线观看| 亚洲成人三级在线| 国产在线视频网| 麻豆一区二区在线观看| 成全电影大全在线观看| 日本不卡高字幕在线2019| 日韩毛片免费看| 不卡视频一区| 欧美禁忌电影网| 欧美性受黑人性爽| 国产欧美日韩一级| 中文字幕 欧美日韩| 成人午夜免费视频| 摸摸摸bbb毛毛毛片| 一区二区成人在线| 真实新婚偷拍xxxxx| 精品欧美一区二区在线观看| 国产在线视频网址| 欧美激情免费视频| 国产第一精品| 国产午夜精品在线| 91欧美在线| 欧美变态另类刺激| 韩国成人福利片在线播放| 美女精品久久久| 色婷婷在线视频| 自拍偷拍亚洲精品| 日韩激情电影免费看| 91麻豆国产语对白在线观看| 免费看成人哺乳视频网站| 麻豆传媒网站在线观看| 日韩福利视频网| 中文字幕免费高清视频| 亚洲三级在线免费| 这里只有精品国产| 日韩国产精品亚洲а∨天堂免| 在线观看电影av| 国产精品美女午夜av| 日韩av黄色在线| 国产女教师bbwbbwbbw| 麻豆精品在线播放| 日韩一区二区a片免费观看| 午夜av一区二区三区| 国产福利视频导航| 久久久久999| 开心久久婷婷综合中文字幕| 国产一区精品在线| 雨宫琴音一区二区在线| 五月天婷婷在线观看视频| 欧美国产日韩a欧美在线观看| 全部毛片永久免费看| 欧美精品一区二区在线观看| av片在线观看| 91在线网站视频| **女人18毛片一区二区| 国产九九热视频| 国产精品久久久久毛片软件| 日本一本在线观看| 亚洲男人av在线| 无遮挡在线观看| 久久人人爽爽人人爽人人片av| 精品91久久久久| 亚洲啪av永久无码精品放毛片 | 最近日韩免费视频| 亚洲视频在线免费观看| 在线天堂中文资源最新版| 国内精品久久久久久久果冻传媒| 亚洲特色特黄| 中文字幕精品久久久| 午夜久久久久久久久久一区二区| 六月丁香色婷婷| 98精品国产高清在线xxxx天堂| 久久久亚洲欧洲日产| 人人妻人人添人人爽欧美一区| 成人国产精品视频| 欧美三级一区二区三区| 日韩精品免费在线观看| 成人va天堂| 伊人久久大香线蕉午夜av| 紧缚捆绑精品一区二区| www.av成人| 精品美女一区二区| 韩国成人二区| 欧洲精品码一区二区三区免费看| 日韩av成人高清| 粉嫩av性色av蜜臀av网站| 日韩精品一区二区三区四区视频 | 欧美一区二区三区久久精品茉莉花| 国产一级片中文字幕| 亚洲午夜精品在线| 亚洲欧美日韩免费| 91精品国产91久久久久久| 国产欧美一区| 在线观看日本www| 亚洲成人免费在线观看| 欧美欧美欧美| 成人黄色在线播放| 影音先锋久久资源网| 中文字幕网站在线观看| 欧美一区二区三区人| 91高清视频在线观看| 欧美日韩亚洲综合一区二区三区激情在线| 石原莉奈在线亚洲三区| 一级片一级片一级片| 欧美刺激脚交jootjob| www.com.cn成人| 国产一区一区三区| 99国产精品久久久| 又色又爽又黄无遮挡的免费视频| 久久97精品久久久久久久不卡| 久久97精品| 欧美在线aaa| 亚洲mv在线观看| 日韩在线免费电影| 国产亚洲一区在线播放| 久久成人久久鬼色| 日本一级片免费看| 日韩中文字幕av| 林ゆな中文字幕一区二区|