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

Jenkins授權卡?試試我的方法

開發 前端
我們有了 SDK,現在可以基于 SDK 開發一個簡單的 Web UI,我這里后端使用 Gin 框架,前端就簡單寫個 Html 實現。

使用過 Jenkins 的應該都用過 Role Strategy plugin 來管理用戶/組的權限管理,不是說它有多好用,而是沒太多選擇。

但是,不知道有沒有發現一個問題:當用戶的量級上去之后,打開授權界面經常會把瀏覽器卡死導致無法操作,為此我想是不是可以直接通過接口去授權,這樣就不必打開那么卡的頁面了。

通過 https://github.com/jenkinsci/role-strategy-plugin 學習,發現其有 REST API,提供一部分接口功能。

8ca930960a30b80f87512c5784aaeadd MD58ca930960a30b80f87512c5784aaeadd MD5

為此,我先寫了一個 role-srategy-sdk 的SDK,地址是:https://github.com/joker-bai/go-role-strategy-sdk。該 SDK 基本涵蓋了文檔中的所有接口。

  • 權限模板管理 - 創建、刪除和查詢權限模板
  • 角色管理 - 支持全局角色、項目角色和節點角色的完整生命周期管理
  • 用戶/組分配 - 靈活的用戶和組角色分配功能
  • 查詢功能 - 獲取角色信息、分配情況和匹配的作業/代理
  • 多角色類型 - 支持 GlobalRole、ProjectRole 和 SlaveRole

SDK的使用

安裝

go get github.com/joker-bai/go-role-strategy-sdk

初始化客戶端

package main

import (
    "fmt"
    "log"
    
    rolestrategy "github.com/joker-bai/go-role-strategy-sdk"
)

func main() {
    // 創建客戶端
    client := rolestrategy.NewClient(
        "https://your-jenkins-url",
        "your-username",
        "your-api-token",
    )
}

權限模板管理

// 添加權限模板
err := client.AddTemplate(
    "developer", 
    "hudson.model.Item.Read,hudson.model.Item.Build", 
    true, // overwrite
)
if err != nil {
    log.Fatal("AddTemplate:", err)
}

// 獲取權限模板
template, err := client.GetTemplate("developer")
if err != nil {
    log.Fatal("GetTemplate:", err)
}
fmt.Printf("Template: %+v\n", template)

// 刪除權限模板
err = client.RemoveTemplates([]string{"developer"}, false)
if err != nil {
    log.Fatal("RemoveTemplates:", err)
}

角色管理

// 添加全局角色
err := client.AddRole(
    rolestrategy.GlobalRole, 
    "dev-lead", 
    "hudson.model.Hudson.Administer", 
    true, // overwrite
    "",   // pattern (項目角色使用)
    "",   // template
)
if err != nil {
    log.Fatal("AddRole:", err)
}

// 添加項目角色(帶模式匹配)
err = client.AddRole(
    rolestrategy.ProjectRole, 
    "project-dev", 
    "hudson.model.Item.Read,hudson.model.Item.Build", 
    true, 
    "dev-.*", // 匹配以 dev- 開頭的項目
    "",
)

// 獲取角色信息
role, err := client.GetRole(rolestrategy.GlobalRole, "dev-lead")
if err != nil {
    log.Fatal("GetRole:", err)
}
fmt.Printf("Role: %+v\n", role)

// 刪除角色
err = client.RemoveRoles(rolestrategy.GlobalRole, []string{"dev-lead"})
if err != nil {
    log.Fatal("RemoveRoles:", err)
}

用戶和組分配

// 分配用戶角色
err := client.AssignUserRole(rolestrategy.GlobalRole, "dev-lead", "alice")
if err != nil {
    log.Fatal("AssignUserRole:", err)
}

// 分配組角色
err = client.AssignGroupRole(rolestrategy.ProjectRole, "project-dev", "developers")
if err != nil {
    log.Fatal("AssignGroupRole:", err)
}

// 取消用戶角色分配
err = client.UnassignUserRole(rolestrategy.GlobalRole, "dev-lead", "alice")
if err != nil {
    log.Fatal("UnassignUserRole:", err)
}

// 取消組角色分配
err = client.UnassignGroupRole(rolestrategy.ProjectRole, "project-dev", "developers")
if err != nil {
    log.Fatal("UnassignGroupRole:", err)
}

查詢功能

// 獲取所有角色
allRoles, err := client.GetAllRoles(rolestrategy.GlobalRole)
if err != nil {
    log.Fatal("GetAllRoles:", err)
}
fmt.Printf("All Roles: %+v\n", allRoles)

// 獲取角色分配情況
assignments, err := client.GetRoleAssignments(rolestrategy.GlobalRole)
if err != nil {
    log.Fatal("GetRoleAssignments:", err)
}
fmt.Printf("Assignments: %+v\n", assignments)

// 獲取全局角色名列表
globalRoles, err := client.GetGlobalRoleNames()
if err != nil {
    log.Fatal("GetGlobalRoleNames:", err)
}
fmt.Println("Global Roles:", globalRoles)

// 獲取項目角色名列表
projectRoles, err := client.GetProjectRoleNames()
if err != nil {
    log.Fatal("GetProjectRoleNames:", err)
}
fmt.Println("Project Roles:", projectRoles)

// 獲取匹配的作業
matchingJobs, err := client.GetMatchingJobs("dev-.*", 10)
if err != nil {
    log.Fatal("GetMatchingJobs:", err)
}
fmt.Printf("Matching Jobs: %+v\n", matchingJobs)

// 獲取匹配的代理
matchingAgents, err := client.GetMatchingAgents("agent-.*", 10)
if err != nil {
    log.Fatal("GetMatchingAgents:", err)
}
fmt.Printf("Matching Agents: %+v\n", matchingAgents)

開發一個 Web UI

我們有了 SDK,現在可以基于 SDK 開發一個簡單的 Web UI,我這里后端使用 Gin 框架,前端就簡單寫個 Html 實現。

對于后端,我們這里只設計了四個接口,它們是:

  • /api/users:獲取用戶信息
  • /api/roles/global:獲取全局角色
  • /api/roles/project:獲取項目角色
  • /api/users/assign:用戶授權

完整的后端代碼如下:

// main.go
package main

import (
"fmt"
"log"
"net/http"
"strconv"
"strings"

"github.com/gin-gonic/gin"
 rolestrategy "github.com/joker-bai/go-role-strategy-sdk"
)

// Request models
type AssignRequest struct {
 Username     string   `json:"username" binding:"required"`
 GlobalRoles  []string`json:"globalRoles"`
 ProjectRoles []string`json:"projectRoles"`
}

type UserListResponse struct {
 Users      []UserRoles `json:"users"`
 Total      int         `json:"total"`
 Page       int         `json:"page"`
 PageSize   int         `json:"pageSize"`
 TotalPages int         `json:"totalPages"`
}

type RoleListResponse []string

type UserRoles struct {
 Username     string   `json:"username"`
 GlobalRoles  []string`json:"globalRoles"`
 ProjectRoles []string`json:"projectRoles"`
}

var jenkinsClient *rolestrategy.Client

func main() {
 jenkinsClient = rolestrategy.NewClient(
"http://127.0.0.1:8080/jenkins",
"admin",
"your-api-token",
 )

 r := gin.Default()
 r.StaticFile("/", "./web/index.html")

 api := r.Group("/api")
 {
  api.GET("/users", getUsersHandler)
  api.GET("/roles/global", getGlobalRolesHandler)
  api.GET("/roles/project", getProjectRolesHandler)
  api.POST("/users/assign", assignRolesHandler)
 }

 log.Println("Server starting on :8080")
 r.Run(":8080")
}

func getUsersHandler(c *gin.Context) {
var users []UserRoles
 userMap := make(map[string]*UserRoles)

 page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
 pageSize, _ := strconv.Atoi(c.DefaultQuery("pageSize", "10"))
 search := strings.TrimSpace(c.DefaultQuery("search", ""))
if page < 1 {
  page = 1
 }
if pageSize < 1 || pageSize > 100 {
  pageSize = 10
 }

// 從 Jenkins 獲取數據
 processRoleMap := func(roleType rolestrategy.RoleType, addToGlobal bool) {
  roleMap, err := jenkinsClient.GetAllRoles(roleType)
if err != nil {
   c.JSON(http.StatusInternalServerError, gin.H{"error": fmt.Sprintf("Failed to get %s roles: %v", roleType, err)})
   c.Abort()
   return
  }
for roleName, sids := range roleMap {
   for _, sid := range sids {
    if sid.Type != "USER" {
     continue
    }
    if _, exists := userMap[sid.SID]; !exists {
     userMap[sid.SID] = &UserRoles{
      Username:     sid.SID,
      GlobalRoles:  []string{},
      ProjectRoles: []string{},
     }
    }
    if addToGlobal {
     userMap[sid.SID].GlobalRoles = append(userMap[sid.SID].GlobalRoles, roleName)
    } else {
     userMap[sid.SID].ProjectRoles = append(userMap[sid.SID].ProjectRoles, roleName)
    }
   }
  }
 }

 processRoleMap(rolestrategy.GlobalRole, true)
if c.IsAborted() {
return
 }
 processRoleMap(rolestrategy.ProjectRole, false)
if c.IsAborted() {
return
 }

for _, user := range userMap {
  users = append(users, *user)
 }

// 應用搜索過濾
if search != "" {
var filteredUsers []UserRoles
for _, user := range users {
   if strings.Contains(strings.ToLower(user.Username), strings.ToLower(search)) {
    filteredUsers = append(filteredUsers, user)
   }
  }
  users = filteredUsers
 }

 total := len(users)
 totalPages := (total + pageSize - 1) / pageSize
 start := (page - 1) * pageSize
 end := start + pageSize
if start >= total {
  users = []UserRoles{}
 } else {
if end > total {
   end = total
  }
  users = users[start:end]
 }

 c.JSON(http.StatusOK, UserListResponse{
  Users:      users,
  Total:      total,
  Page:       page,
  PageSize:   pageSize,
  TotalPages: totalPages,
 })
}

func getGlobalRolesHandler(c *gin.Context) {
 roles, err := jenkinsClient.GetGlobalRoleNames()
if err != nil {
  c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
 }
 c.JSON(http.StatusOK, RoleListResponse(roles))
}

func getProjectRolesHandler(c *gin.Context) {
 roles, err := jenkinsClient.GetProjectRoleNames()
if err != nil {
  c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
 }
 c.JSON(http.StatusOK, RoleListResponse(roles))
}

func assignRolesHandler(c *gin.Context) {
var req AssignRequest
if err := c.ShouldBindJSON(&req); err != nil {
  c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
 }

// 獲取用戶當前的角色
 globalMap, err := jenkinsClient.GetAllRoles(rolestrategy.GlobalRole)
if err != nil {
  c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to get current global roles: " + err.Error()})
return
 }
 projectMap, err := jenkinsClient.GetAllRoles(rolestrategy.ProjectRole)
if err != nil {
  c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to get current project roles: " + err.Error()})
return
 }

// 構建當前角色集合
 currentGlobalRoles := make(map[string]bool)
for roleName, sids := range globalMap {
for _, sid := range sids {
   if sid.Type == "USER" && sid.SID == req.Username {
    currentGlobalRoles[roleName] = true
   }
  }
 }

 currentProjectRoles := make(map[string]bool)
for roleName, sids := range projectMap {
for _, sid := range sids {
   if sid.Type == "USER" && sid.SID == req.Username {
    currentProjectRoles[roleName] = true
   }
  }
 }

// 分配新角色
for _, roleName := range req.GlobalRoles {
if !currentGlobalRoles[roleName] {
   if err := jenkinsClient.AssignUserRole(rolestrategy.GlobalRole, roleName, req.Username); err != nil {
    c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to assign global role: " + err.Error()})
    return
   }
  }
 }

for _, roleName := range req.ProjectRoles {
if !currentProjectRoles[roleName] {
   if err := jenkinsClient.AssignUserRole(rolestrategy.ProjectRole, roleName, req.Username); err != nil {
    c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to assign project role: " + err.Error()})
    return
   }
  }
 }

// 移除不再擁有的角色
for roleName := range currentGlobalRoles {
if !contains(req.GlobalRoles, roleName) {
   if err := jenkinsClient.UnassignUserRole(rolestrategy.GlobalRole, roleName, req.Username); err != nil {
    c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to unassign global role: " + err.Error()})
    return
   }
  }
 }

for roleName := range currentProjectRoles {
if !contains(req.ProjectRoles, roleName) {
   if err := jenkinsClient.UnassignUserRole(rolestrategy.ProjectRole, roleName, req.Username); err != nil {
    c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to unassign project role: " + err.Error()})
    return
   }
  }
 }

 c.JSON(http.StatusOK, gin.H{"success": true, "message": "Roles updated successfully"})
}

func contains(slice []string, item string) bool {
for _, s := range slice {
if s == item {
   returntrue
  }
 }
returnfalse
}

前端代碼就不寫了,直接到 倉庫 查看。

實際的效果如下:

ff05662851d9db0302a62ec564a96b5b MD5ff05662851d9db0302a62ec564a96b5b MD5

用戶詳情,可以查看目前該用戶擁有的權限:

971f6b099af019c29ed8856a7b1bcb5d MD5971f6b099af019c29ed8856a7b1bcb5d MD5

點擊修改,可以直接修改用戶的權限:

91dcad6460cbdb0c730c3a3843cce753 MD591dcad6460cbdb0c730c3a3843cce753 MD5

對于新用戶,也可以直接授權:

7ac7f6d1b3f1541474cae991a45adef6 MD57ac7f6d1b3f1541474cae991a45adef6 MD5

這樣就不用害怕 Jenkins 卡死了。同時,我也將代碼傳到了 Github,有興趣的可以了解一下。

上面的代碼僅僅是一個簡單的 demo,可以對其進行擴充,比如:

  • 用戶接入企業用戶中心,判斷該用戶是否存在
  • 增加多Jenkins管理,操作者可以切換不同的Jenkins進行授權操作

當然,目前的界面也比較丑,不過,就這樣吧......


責任編輯:武曉燕 來源: 運維開發故事
相關推薦

2020-02-17 07:41:07

Windows 10SSD固態硬盤

2015-02-03 09:51:33

2013-01-30 10:28:06

閱讀方法編程書籍程序員

2019-03-18 08:37:00

Wi-Fi優化視頻

2021-07-30 06:35:14

網絡卡頓WiFi路由器

2022-01-07 13:36:00

MySQL數據庫分頁

2020-09-18 06:48:21

Python編程語言

2016-04-08 10:13:24

程序員IT從業者跳槽

2019-12-30 09:00:00

Web 開發代碼

2010-01-26 10:10:51

Android模擬SD

2022-06-08 13:48:06

物聯網卡智能設備SIM卡

2022-04-28 23:08:40

Windows 10微軟功能

2014-07-28 09:43:58

編程語言鑒別編程

2021-06-15 06:56:17

安卓系統應用手機卡頓

2013-08-12 09:45:06

最佳編程方法編程方法編程

2022-09-20 07:23:55

人工智能AI物聯網

2023-11-23 08:40:05

Java處理海量數據

2023-12-13 13:41:00

代碼Java程序員

2009-12-17 16:47:57

APC

2020-02-24 11:22:08

軟件中央處理器臺式電腦
點贊
收藏

51CTO技術棧公眾號

欧美系列亚洲系列| 国产999精品久久| 在线亚洲午夜片av大片| 久久久精品视频国产| 欧美bbbxxxxx| 久久亚洲捆绑美女| 91天堂在线观看| 日韩污视频在线观看| 残酷重口调教一区二区| 精品国产3级a| 亚洲久久中文字幕| 国产在线美女| 亚洲美女屁股眼交3| 欧美aaaaa喷水| a级片在线播放| 日韩黄色免费电影| 欧美激情亚洲一区| 91n在线视频| 亚洲三级网页| 精品国产乱码久久久久久牛牛| 日本成人黄色网| 91精选在线| 亚洲欧洲日产国产综合网| 久久久com| 亚洲av色香蕉一区二区三区| 蜜桃视频一区二区三区在线观看 | 午夜在线播放| 91一区一区三区| 亚洲xxxx做受欧美| 在线免费观看一级片| 免费在线欧美黄色| 97在线视频免费观看| 欧美人禽zoz0强交| 999国产精品| 国产亚洲一区精品| 强伦人妻一区二区三区| 欧美尿孔扩张虐视频| 精品久久久久久久人人人人传媒 | 日韩 欧美 中文| 韩国亚洲精品| 欧美成人激情图片网| 精品在线观看一区| 北条麻妃国产九九九精品小说| 亚洲美女自拍视频| 亚洲狠狠婷婷综合久久久久图片| 哺乳挤奶一区二区三区免费看| 91精品婷婷国产综合久久性色 | 国产麻豆精品久久一二三| 国产精品一区二区三区久久| 神马久久久久久久| 久久视频一区| 国产精品99久久久久久www| 欧美h在线观看| 亚洲一区二区免费看| 人妖精品videosex性欧美| 免费看日批视频| 首页国产欧美日韩丝袜| 青青久久aⅴ北条麻妃| 日本特级黄色片| 美女视频一区免费观看| 日本久久91av| 中文在线字幕免费观| 久久精品国产77777蜜臀| 国产精品一区二区性色av | 日韩二区三区四区| 国产精品普通话| 国产一区二区在线播放视频| 国模娜娜一区二区三区| 99久久精品久久久久久ai换脸| 国产不卡精品视频| 成人黄色大片在线观看| 精品高清视频| 国产福利在线| 亚洲日穴在线视频| 91成人综合网| 欧美电影免费看| 欧美性色综合网| 爱情岛论坛亚洲自拍| 国产精品白丝av嫩草影院| 精品一区二区三区电影| 国产18无套直看片| 欧美国产先锋| 欧美一区二区.| 又骚又黄的视频| 国产成人亚洲综合a∨婷婷| 久久久久久久久久码影片| 成人av毛片| 一区二区三区欧美在线观看| 国产97在线 | 亚洲| 一区二区视频免费完整版观看| 欧美精品 国产精品| 中文字幕在线国产| 成人免费看片39| 美日韩丰满少妇在线观看| 黄网在线观看视频| 国产在线一区二区| 蜜桃av色综合| av免费看在线| 欧美在线视频你懂得| 图片区偷拍区小说区| 精品国产一区二区三区小蝌蚪| 日韩一级黄色av| 久久久久亚洲av成人毛片韩| 精品一二线国产| 蜜桃传媒视频麻豆第一区免费观看 | 中文字幕欧美人与畜| 成人免费观看在线观看| 欧美裸体bbwbbwbbw| 人妻在线日韩免费视频| 91精品国产乱码久久久久久| 欧美亚洲在线视频| 亚洲精品字幕在线观看| 国产精品女同互慰在线看| 国产精品裸体瑜伽视频| 999精品嫩草久久久久久99| 亚洲美女福利视频网站| 久久久久无码国产精品不卡| 青青青伊人色综合久久| 久久久久高清| www视频在线观看| 欧美一级黄色录像| 91视频最新网址| 奇米精品一区二区三区四区| 精品日韩美女| 91美女主播在线视频| 91精品国产91久久久久久最新毛片 | 亚洲av无码乱码国产精品fc2| jiyouzz国产精品久久| 国产欧美综合一区| 欧美成人福利| 在线亚洲男人天堂| 中文文字幕一区二区三三| 久久午夜老司机| 一区二区传媒有限公司| 成人中文字幕视频| 欧美国产日韩中文字幕在线| 国产免费久久久| 亚洲视频一二三| 视频免费1区二区三区| 色一区二区三区四区| 日韩av不卡电影| 国产专区在线| 日本韩国一区二区三区| 美女久久久久久久久久| 亚洲欧美视频一区二区三区| 国产欧美日本在线| 两个人看的在线视频www| 亚洲国产欧美一区二区三区久久| 精品少妇久久久| a在线欧美一区| 国产原创popny丨九色| 久久资源综合| 45www国产精品网站| 日韩porn| 欧美视频精品在线观看| 一级片黄色录像| 精品无人码麻豆乱码1区2区| 自拍偷拍99| 久久久久久亚洲精品美女| 欧美成人合集magnet| 国产成人自拍一区| 黑人巨大精品欧美一区二区一视频 | 黄黄视频在线观看| 伊人久久噜噜噜躁狠狠躁| 欧美激情在线观看| 日韩a在线观看| 欧美图区在线视频| 九九热最新地址| 高潮精品一区videoshd| 草草久久久无码国产专区| 国产麻豆一区二区三区精品视频| 国产精品美女久久久久久免费| 在线观看a视频| 日韩一区二区三区电影在线观看 | 亚洲激情社区| 日韩av不卡播放| 国产亚洲久久| 97在线免费观看| 中文字幕在线播放| 精品国产百合女同互慰| 久久久精品毛片| 亚洲天天做日日做天天谢日日欢| 中国特级黄色大片| 日韩电影一二三区| 菠萝蜜视频在线观看入口| 麻豆一区二区| 成人精品久久久| 国产乱码精品一区二三赶尸艳谈| 一区二区在线免费视频| www.com在线观看| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 亚洲欧美另类自拍| av无码精品一区二区三区宅噜噜| 午夜不卡在线视频| 疯狂撞击丝袜人妻| 91在线视频网址| 加勒比av中文字幕| 亚洲欧美日韩在线观看a三区| 中文字幕剧情在线观看一区| 美女一区二区在线观看| 成人春色激情网| 在线观看v片| 成年人精品视频| 番号集在线观看| 亚洲国产精品字幕| 999免费视频| 欧美色图在线观看| 天堂中文在线网| 亚洲永久免费视频| 国产精品久久久免费看| 久久久久久电影| 丰满少妇xbxb毛片日本| 精品亚洲成a人| 欧美成人黑人猛交| 夜夜嗨一区二区| 三级在线免费观看| 99久久夜色精品国产亚洲1000部| 裸体丰满少妇做受久久99精品 | 麻豆蜜桃91| 国产成人av毛片| 91久久极品少妇xxxxⅹ软件| 福利一区二区免费视频| 国产成人高潮免费观看精品| 成人黄色动漫| 午夜精品视频在线| 久久五月精品中文字幕| 美日韩丰满少妇在线观看| 欧美另类极品| 最新69国产成人精品视频免费| 日韩欧美电影在线观看| 亚洲精品国产suv| 亚洲精品18在线观看| 日韩三级高清在线| 国产伦精品一区二区三区视频痴汉 | 99re热视频这里只精品| 北京富婆泄欲对白| 成人免费观看视频| 久久久久无码国产精品一区李宗瑞| 极品美女销魂一区二区三区免费| 一区二区三区免费播放| 免费高清视频精品| 天天操天天爽天天射| 日韩av中文字幕一区二区| 91国视频在线| 玖玖国产精品视频| 久久国产色av免费观看| 久热精品视频| 亚洲欧美日韩综合网| 久久精品国产网站| 亚洲18在线看污www麻豆| 国产在线播放一区二区三区| 日本77777| 成人一级视频在线观看| 亚洲天堂av网站| 26uuu国产日韩综合| www.中文字幕av| 欧美激情一区不卡| 一区二区三区影视| 一区二区三区四区在线播放 | 色综合天天做天天爱| 精品国产乱子伦| 欧美人妇做爰xxxⅹ性高电影| 国产精品视频在线观看免费| 欧美成人精品二区三区99精品| 成人午夜福利视频| 精品呦交小u女在线| www亚洲人| 欧美成人中文字幕在线| 9999热视频在线观看| 欧美最猛性xxxxx免费| 国产69精品久久久久按摩| 亚洲专区在线视频| 人人香蕉久久| 亚洲美女搞黄| 亚洲图片在线| 18岁视频在线观看| 国产丶欧美丶日本不卡视频| 99久久免费看精品国产一区| 国产亚洲美州欧州综合国| 四虎永久免费地址| 亚洲va欧美va人人爽| 中文字幕手机在线视频| 91精品国产综合久久久久久漫画| 欧美性受xxxx狂喷水| 一道本无吗dⅴd在线播放一区| www.在线视频| 日韩免费av一区二区| 91精品福利观看| 久精品国产欧美| 999久久久国产精品| 欧美视频在线观看网站| 捆绑紧缚一区二区三区视频| 亚洲av成人片无码| 国产精品福利一区二区三区| 精品成人久久久| 在线成人av影院| 麻豆导航在线观看| 欧美第一淫aaasss性| 视频在线日韩| 国产精品乱子乱xxxx| 国产精品久久久久久| 国产亚洲天堂网| 国产成人免费在线观看| 免费看的黄色录像| 三级网在线观看| 99riav1国产精品视频| 国产成年人视频网站| 91在线看国产| 日韩视频中文字幕在线观看| 91福利资源站| 天堂中文网在线| 久久精品国产96久久久香蕉| 中文字幕在线视频网站| 精品网站999www| 香蕉成人app免费看片| 国产精品久久久久久五月尺| 国产欧美啪啪| 四虎精品欧美一区二区免费| 日韩制服丝袜先锋影音| 国产草草浮力影院| 亚洲自拍偷拍综合| 国产精品一区二区黑人巨大| 尤物九九久久国产精品的分类 | 国产免费人做人爱午夜视频| 亚洲小说区图片区| 17c国产在线| 国产精品伦理在线| 成人黄色激情视频| 亚洲欧洲在线看| 亚洲欧美一区二区三区| 国产伦精品一区二区三区| 欧美国产专区| 18深夜在线观看免费视频| 综合久久给合久久狠狠狠97色| 最新在线中文字幕| 亚洲网在线观看| se69色成人网wwwsex| 日韩av高清| 日韩国产成人精品| 成人激情五月天| 欧美在线999| aaa在线观看| 国产区精品视频| 欧美成人激情| 992kp免费看片| 亚洲综合成人在线| 日韩在线视频免费| 97成人精品视频在线观看| 欧美一性一交| 99福利在线观看| 久久久九九九九| 中文天堂在线资源| 久久精品99久久久香蕉| 国产一区二区高清在线| 欧美视频在线第一页| 99久久久国产精品| 亚洲欧美偷拍一区| 在线观看精品国产视频| xxxxx.日韩| 黄色录像特级片| 成人午夜精品在线| 国产又黄又粗又爽| 中文字幕视频一区二区在线有码| 久久er热在这里只有精品66| 精品少妇人妻av一区二区| 国产精品一区二区三区四区| 国产香蕉在线视频| 亚洲欧美国内爽妇网| 成人精品动漫| 日本福利视频网站| 91蜜桃婷婷狠狠久久综合9色| 欧美成人一区二区三区四区| 日韩中文字幕av| julia中文字幕一区二区99在线| ww国产内射精品后入国产| 国产欧美精品区一区二区三区| 国产又粗又长又黄| 久久久久久久久亚洲| 欧美男gay| 一级黄色免费毛片| 欧美性生交xxxxxdddd| 黄网站免费在线播放| 国产欧美丝袜| 久久精品国产亚洲aⅴ| 日本一级黄色录像| 这里只有精品在线观看| 一区中文字幕| 精品www久久久久奶水| 亚洲精品高清在线观看| 欧美777四色影视在线| 成人黄色在线观看| 久久久水蜜桃av免费网站| 免费国产羞羞网站美图| 日韩高清不卡av| 国产专区精品| 黄色三级视频片| 激情成人在线视频| 菠萝菠萝蜜在线观看| 欧美视频观看一区| 成人综合激情网|