一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

用戶認(rèn)證管理設(shè)計(jì)方案

 bluecrystal 2006-09-24

1 設(shè)計(jì)思路

 

為了設(shè)計(jì)一套具有較強(qiáng)可擴(kuò)展性的用戶認(rèn)證管理,需要建立用戶、角色和權(quán)限等數(shù)據(jù)庫(kù)表,并且建立之間的關(guān)系,具體實(shí)現(xiàn)如下。

1.1 用戶

用戶僅僅是純粹的用戶,用來(lái)記錄用戶相關(guān)信息,如用戶名、密碼等,權(quán)限是被分離出去了的。用戶(User)要擁有對(duì)某種資源的權(quán)限,必須通過(guò)角色(Role)去關(guān)聯(lián)。

用戶通常具有以下屬性:

ü         編號(hào),在系統(tǒng)中唯一。

ü         名稱,在系統(tǒng)中唯一。

ü         用戶口令。

ü         注釋,描述用戶或角色的信息。

1.2 角色

角色是使用權(quán)限的基本單位,擁有一定數(shù)量的權(quán)限,通過(guò)角色賦予用戶權(quán)限,通常具有以下屬性:

ü         編號(hào),在系統(tǒng)中唯一。

ü         名稱,在系統(tǒng)中唯一。

ü         注釋,描述角色信息

1.3 權(quán)限

       權(quán)限指用戶根據(jù)角色獲得對(duì)程序某些功能的操作,例如對(duì)文件的讀、寫(xiě)、修改和刪除功能,通常具有以下屬性:

ü         編號(hào),在系統(tǒng)中唯一。

ü         名稱,在系統(tǒng)中唯一。

ü         注釋,描述權(quán)限信息

1.4 用戶與角色的關(guān)系

一個(gè)用戶(User)可以隸屬于多個(gè)角色(Role),一個(gè)角色組也可擁有多個(gè)用戶,用戶角色就是用來(lái)描述他們之間隸屬關(guān)系的對(duì)象。用戶(User)通過(guò)角色(Role)關(guān)聯(lián)所擁有對(duì)某種資源的權(quán)限,例如

l         用戶(User):

UserID      UserName      UserPwd

1                   張三                 xxxxxx

2                   李四                 xxxxxx    

……

l         角色(Role):

RoleID           RoleName          RoleNote

       01                  系統(tǒng)管理員       監(jiān)控系統(tǒng)維護(hù)管理員

       02                  監(jiān)控人員          在線監(jiān)控人員

       03                  調(diào)度人員          調(diào)度工作人員

       04                  一般工作人員   工作人員

       ……

l         用戶角色(User_Role):

UserRoleID           UserID           RoleID           UserRoleNote

1                       1                   01                  用戶“張三”被分配到角色“系統(tǒng)管理員”

2                        2                   02                  用戶“李四”被分配到角色“監(jiān)控人員”

3                        2                   03                  用戶“李四”被分配到角色“調(diào)度人員”

……

       從該關(guān)系表可以看出,用戶所擁有的特定資源可以通過(guò)用戶角色來(lái)關(guān)聯(lián)。

1.5 權(quán)限與角色的關(guān)系

一個(gè)角色(Role)可以擁有多個(gè)權(quán)限(Permission),同樣一個(gè)權(quán)限可分配給多個(gè)角色。例如:

l         角色(Role):

RoleID           RoleName          RoleNote

       01                  系統(tǒng)管理員       監(jiān)控系統(tǒng)維護(hù)管理員

       02                  監(jiān)控人員          在線監(jiān)控人員

       03                  調(diào)度人員          調(diào)度工作人員

       04                  一般工作人員   工作人員

       ……

l         權(quán)限(Permission):

PermissionID      PermissionName       PermissionNote

0001                        增加監(jiān)控                 允許增加監(jiān)控對(duì)象

0002                        修改監(jiān)控                 允許修改監(jiān)控對(duì)象

0003                        刪除監(jiān)控                 允許刪除監(jiān)控對(duì)象

0004                        察看監(jiān)控信息       允許察看監(jiān)控對(duì)象

……

l         角色權(quán)限(Role_Permission):

RolePermissionID   RoleID PermissionID RolePermissionNote

1                             01            0001        角色“系統(tǒng)管理員”具有權(quán)限“增加監(jiān)控”

2                             01            0002        角色“系統(tǒng)管理員”具有權(quán)限“修改監(jiān)控”

3                             01            0003        角色“系統(tǒng)管理員”具有權(quán)限“刪除監(jiān)控”

4                             01            0004        角色“系統(tǒng)管理員”具有權(quán)限“察看監(jiān)控”

5                             02            0001        角色“監(jiān)控人員”具有權(quán)限“增加監(jiān)控”

6                             02            0004        角色“監(jiān)控人員”具有權(quán)限“察看監(jiān)控”

……

       由以上例子中的角色權(quán)限關(guān)系可以看出,角色權(quán)限可以建立角色和權(quán)限之間的對(duì)應(yīng)關(guān)系。

1.6 建立用戶權(quán)限

用戶權(quán)限系統(tǒng)的核心由以下三部分構(gòu)成:創(chuàng)造權(quán)限、分配權(quán)限和使用權(quán)限。

第一步由Creator創(chuàng)造權(quán)限(Permission),Creator在設(shè)計(jì)和實(shí)現(xiàn)系統(tǒng)時(shí)會(huì)劃分。利用存儲(chǔ)過(guò)程CreatePermissionInfo@PermissionName,@PermissionNote)創(chuàng)建權(quán)限信息,指定系統(tǒng)模塊具有哪些權(quán)限。

第二步由系統(tǒng)管理員(Administrator)創(chuàng)建用戶和角色,并且指定用戶角色(UserRole)和角色權(quán)限(RolePermission)的關(guān)聯(lián)關(guān)系。

1)        Administrator具有創(chuàng)建用戶、修改用戶和刪除用戶的功能:

 

l         存儲(chǔ)過(guò)程CreateUserInfo@UserName,@UserPwd)創(chuàng)建用戶信息;

l         存儲(chǔ)過(guò)程ModifyUserInfo@UserName,@UserPwd)修改用戶信息;

l         存儲(chǔ)過(guò)程DeleteUserInfo@UserID)刪除用戶信息;

2)        Administrator具有創(chuàng)建角色和刪除角色的功能:

 

l         存儲(chǔ)過(guò)程CreateRoleInfo@RoleName,@RoleNote)創(chuàng)建角色信息;

l         存儲(chǔ)過(guò)程DeleteRoleInfo(@RoleID)刪除角色信息;

3Administrator具有建立用戶和角色、角色和權(quán)限的關(guān)聯(lián)關(guān)系功能:

l         存儲(chǔ)過(guò)程GrantUserRole@UserID,@RoleID,@UserRoleNote)建立用戶和角色的關(guān)聯(lián)關(guān)系;

l         存儲(chǔ)過(guò)程DeleteUserRole(@UserRoleID)刪除用戶和角色的關(guān)聯(lián)關(guān)系;

l         存儲(chǔ)過(guò)程GrantRolePermission(@RoleID,@PermissionID,@RolePermissionNote)建立角色和權(quán)限的關(guān)聯(lián)關(guān)系;

l         存儲(chǔ)過(guò)程DeleteRolePermission(@RolePermissionID)刪除角色和權(quán)限的關(guān)聯(lián)關(guān)系;

第三步用戶(User)使用Administrator分配給的權(quán)限去使用各個(gè)系統(tǒng)模塊。利用存儲(chǔ)過(guò)程GetUserRole@UserID, @UserRoleID output,GetRolePermission@RoleID,@Role-

-PermissinID output)獲得用戶對(duì)模塊的使用權(quán)限。

1.7 用戶認(rèn)證實(shí)現(xiàn)

當(dāng)用戶通過(guò)驗(yàn)證后,由系統(tǒng)自動(dòng)生成一個(gè)128位的TicketID保存到用戶數(shù)據(jù)庫(kù)表中,建立存儲(chǔ)過(guò)程Login@UserID,@UserPwd,@TicketID output)進(jìn)行用戶認(rèn)證,認(rèn)證通過(guò)得到一個(gè)TicketID,否則TicketIDnull。其流程圖如下:

1 Login流程圖

得到TicketID后,客戶端在調(diào)用服務(wù)端方法時(shí)傳遞TicketID,通過(guò)存儲(chǔ)過(guò)程JudgeTicketPermission@TicketID,@PermissionID)判斷TicketID對(duì)應(yīng)的用戶所具有的權(quán)限,并根據(jù)其權(quán)限進(jìn)行方法調(diào)用。

當(dāng)用戶退出系統(tǒng)時(shí),建立存儲(chǔ)過(guò)程Logout@UserID)來(lái)退出系統(tǒng)。當(dāng)用戶異常退出系統(tǒng)時(shí),根據(jù)最后的登陸時(shí)間(LastSignTime)確定用戶的TickeID,建立存儲(chǔ)過(guò)程ExceptionLogout@UserID,@LastSignTime)處理用戶的異常退出。

2 Logout流程圖

WebService可以采用SoapHeader中寫(xiě)入TicketID來(lái)使得TicketID從客戶端傳遞給服務(wù)端。.Net Remoting可以采用CallContext類來(lái)實(shí)現(xiàn)TicketID從客戶端傳遞給服務(wù)端。

2 數(shù)據(jù)庫(kù)設(shè)計(jì)

 

2.1 數(shù)據(jù)庫(kù)表

3 數(shù)據(jù)庫(kù)關(guān)系圖

2.2 數(shù)據(jù)庫(kù)表說(shuō)明

2.2.1 用戶表(Static_User

Static_User

Static_User字段名

 

詳細(xì)解釋

 

類型

 

備注

 

UserID

 

路線編號(hào)

 

varchar(20)

 

PK

 

UserName

 

用戶名稱

 

varchar(20)

 

 

 

 

 

 

UserPwd

 

用戶密碼

 

varchar(20)

 

 

 

 

 

 

LastSignTime

 

最后登陸時(shí)間

 

datatime

 

 

 

 

 

 

SignState

 

用戶登陸狀態(tài)標(biāo)記

 

int

 

 

 

 

 

 

TickeID

 

驗(yàn)證票記錄編號(hào)

 

varchar(128)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2.2.2 角色表(Static_Role

Static_Role

Static_User字段名

 

詳細(xì)解釋

 

類型

 

備注

 

RoleID

 

角色編號(hào)

 

varchar(20)

 

PK

 

RoleName

 

角色名稱

 

varchar(20)

 

 

 

 

 

 

RoleNote

 

角色信息描述

 

varchar(20)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2.2.3 用戶-角色表(Static_User_Role

Static_User_Role

Static_User字段名

 

詳細(xì)解釋

 

類型

 

備注

 

UserRoleID

 

用戶角色編號(hào)

 

varchar(20)

 

PK

 

UserID

 

用戶編號(hào)

 

varchar(20)

 

FK

 

RoleID

 

角色編號(hào)

 

varchar(20)

 

FK

 

UserRoleNote

 

用戶角色信息描述

 

varchar(20)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2.2.4 權(quán)限表(Static_Permission

Static_Permission

Static_User字段名

 

詳細(xì)解釋

 

類型

 

備注

 

PermissionID

 

編號(hào)

 

varchar(20)

 

PK

 

PermissionName

 

權(quán)限名稱

 

varchar(20)

 

 

 

 

 

 

PermissionNote

 

全息信息描述

 

varchar(20)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2.2.5 角色-權(quán)限表(Static_Role_Permission

Static_Role_Permission

Static_User字段名

 

詳細(xì)解釋

 

類型

 

備注

 

RolePermissionID

 

角色權(quán)限編號(hào)

 

varchar(20)

 

PK

 

RoleID

 

角色編號(hào)

 

varchar(20)

 

FK

 

PermissionID

 

權(quán)限編號(hào)

 

varchar(20)

 

FK

 

RolePermissionNote

 

角色權(quán)限信息描述

 

varchar(20)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3 .net技術(shù)概要

 

3.1 WebService SoapHeader

對(duì) SQL 數(shù)據(jù)庫(kù)執(zhí)行自定義身份驗(yàn)證和授權(quán)。在這種情況中,應(yīng)向服務(wù)傳遞自定義憑據(jù)(如用戶名和密碼),并讓服務(wù)自己處理身份驗(yàn)證和授權(quán)。 將額外的信息連同請(qǐng)求一起傳遞給 XML Web 服務(wù)的簡(jiǎn)便方法是通過(guò) SOAP 標(biāo)頭。為此,需要在服務(wù)中定義一個(gè)從 SOAPHeader 派生的類,然后將服務(wù)的公共字段聲明為該類型。這在服務(wù)的公共合同中公開(kāi),并且當(dāng)從 WebServiceUtil.exe 創(chuàng)建代理時(shí)可由客戶端使用,如下例所示:


 

using System.Web.Services;

 

using System.Web.Services.Protocols;

 

 

 

 

 

 

// AuthHeader class extends from SoapHeader

 

public class AuthHeader : SoapHeader {

 

    public string Username;

 

    public string Password;

 

}

 

 

 

 

 

 

public class HeaderService : WebService {

 

    public AuthHeader sHeader;

 

    ...

 

}

服務(wù)中的每個(gè) WebMethod 都可以使用 SoapHeader 自定義屬性定義一組關(guān)聯(lián)的標(biāo)頭。默認(rèn)情況下,標(biāo)頭是必需的,但也可以定義可選標(biāo)頭。SoapHeader 屬性指定公共字段的名稱或者 Client Server 類的屬性(本標(biāo)題中稱為 Headers 屬性)。在為輸入標(biāo)頭調(diào)用方法前,WebService 設(shè)置 Headers 屬性的值;而當(dāng)方法為輸出標(biāo)頭返回時(shí),WebService 檢索該值。

[WebMethod(Description="This method requires a custom soap header set by the caller")]

 

[SoapHeader("sHeader")]

 

public string SecureMethod() {

 

 

 

 

 

 

if (sHeader == null)

 

return "ERROR: Please supply credentials";

 

else

 

return "USER: " + sHeader.Username;

 

 

 

 

 

 

}

 

然后,客戶端在調(diào)用要求標(biāo)頭的方法之前,直接在代理類上設(shè)置標(biāo)頭,如下面的示例所示:

HeaderService h = new HeaderService();

 

AuthHeader myHeader = new AuthHeader();

 

myHeader.Username = "username";

 

myHeader.Password = "password";

 

h.AuthHeader = myHeader;

 

String result = h.SecureMethod();

 

3.2 .Net Remoting的安全認(rèn)證方式

 

CallContext提供與執(zhí)行代碼路徑一起傳送的屬性集,CallContext是類似于方法調(diào)用的線程本地存儲(chǔ)的專用集合對(duì)象,并提供對(duì)每個(gè)邏輯執(zhí)行線程都唯一的數(shù)據(jù)槽。數(shù)據(jù)槽不在其他邏輯線程上的調(diào)用上下文之間共享。當(dāng) CallContext 沿執(zhí)行代碼路徑往返傳播并且由該路徑中的各個(gè)對(duì)象檢查時(shí),可將對(duì)象添加到其中。當(dāng)對(duì)另一個(gè) AppDomain 中的對(duì)象進(jìn)行遠(yuǎn)程方法調(diào)用時(shí),CallContext 類將生成一個(gè)與該遠(yuǎn)程調(diào)用一起傳播的 LogicalCallContext 實(shí)例。只有公開(kāi) ILogicalThreadAffinative 接口并存儲(chǔ)在 CallContext 中的對(duì)象被在 LogicalCallContext 中傳播到 AppDomain 外部。不支持此接口的對(duì)象不在 LogicalCallContext 實(shí)例中與遠(yuǎn)程方法調(diào)用一起傳輸。

CallContext.SetData方法存儲(chǔ)給定對(duì)象并將其與指定名稱關(guān)聯(lián),CallContext.GetData方法從 CallContext 中檢索具有指定名稱的對(duì)象。

下面的代碼示例說(shuō)明如何使用 SetData 方法將主體和標(biāo)識(shí)對(duì)象傳輸?shù)竭h(yuǎn)程位置以進(jìn)行標(biāo)識(shí)。

public class ClientClass {

 

   public static void Main() {

 

      GenericIdentity ident = new GenericIdentity("Bob");

 

      GenericPrincipal prpal = new GenericPrincipal(ident,

 

                                          Newstring[] {"Level1"});

 

      LogicalCallContextData data =

 

 new LogicalCallContextData(prpal);

 

      //Enter data into the CallContext

 

      CallContext.SetData("test data", data);

 

 

 

 

 

 

     

 

      Console.WriteLine(data.numOfAccesses);

 

      ChannelServices.RegisterChannel(new TcpChannel());

 

      RemotingConfiguration.RegisterActivatedClientType(

 

typeof(HelloServiceClass), "tcp://localhost:8082");

 

      HelloServiceClass service = new HelloServiceClass();

 

      if(service == null) {

 

          Console.WriteLine("Could not locate server.");

 

          return;

 

      }

 

 

 

 

 

 

      // call remote method

 

      Console.WriteLine();

 

      Console.WriteLine("Calling remote object");

 

      Console.WriteLine(service.HelloMethod("Caveman"));

 

      Console.WriteLine(service.HelloMethod("Spaceman"));

 

      Console.WriteLine(service.HelloMethod("Bob"));

 

      Console.WriteLine("Finished remote object call");

 

      Console.WriteLine();

 

 

 

 

 

 

      //Extract the returned data from the call context

 

      LogicalCallContextData returnedData =

 

         (LogicalCallContextData)CallContext.GetData("test data");

 

 

 

 

 

 

      Console.WriteLine(data.numOfAccesses);

 

      Console.WriteLine(returnedData.numOfAccesses);

 

   }

 

}

 

下面的代碼示例說(shuō)明如何使用 GetData 方法將主體和標(biāo)識(shí)對(duì)象傳輸?shù)竭h(yuǎn)程位置以進(jìn)行標(biāo)識(shí)。

using System;

 

using System.Text;

 

using System.Runtime.Remoting.Messaging;

 

using System.Security.Principal;

 

 

 

 

 

 

public class HelloServiceClass : MarshalByRefObject {

 

   static int n_instances;

 

   int instanceNum;

 

 

 

 

 

 

   public HelloServiceClass() {

 

      n_instances++;

 

      instanceNum = n_instances;

 

      Console.WriteLine(this.GetType().Name + " has been created.

 

             Instance # = {0}", instanceNum);

 

   }

 

 

 

 

 

 

  ~HelloServiceClass() {

 

      Console.WriteLine("Destroyed instance {0} of

 

HelloServiceClass.", instanceNum);     

 

   }

 

 

 

 

 

 

   public String HelloMethod(String name) {

 

 

 

 

 

 

      //Extract the call context data

 

      LogicalCallContextData data =

 

          (LogicalCallContextData)CallContext.GetData("test data");     

 

      IPrincipal myPrincipal = data.Principal;

 

     

 

      //Check the user identity

 

      if(myPrincipal.Identity.Name == "Bob") {

 

         Console.WriteLine("\nHello {0}, you are identified!",

 

myPrincipal.Identity.Name);

 

         Console.WriteLine(data.numOfAccesses);

 

      }

 

      else {

 

         Console.WriteLine("Go away! You are not identified!");

 

         return String.Empty;

 

      }

 

 

 

 

 

 

        // calculate and return result to client   

 

      return "Hi there " + name + ".";

 

   }

 

}

 

4 詳細(xì)代碼設(shè)計(jì)

 

4.1 WebService代碼設(shè)計(jì)

WebService端代碼主要進(jìn)行對(duì)數(shù)據(jù)庫(kù)的操作,建立起Client操作數(shù)據(jù)庫(kù)所需要的方法,供Client的端調(diào)用。

1class UserInfoMng() 用戶信息管理類,其中包括方法:

 

l         CreateUserInfo(string UserName string UserPwd) 建立用戶信息,調(diào)用存儲(chǔ)過(guò)程CreateUserInfo@UserName,@UserPwd

 

l         ModifyUserInfo(string UserName string UserPwd) 修改用戶信息,調(diào)用存儲(chǔ)過(guò)程ModifyUserInfo@UserName,@UserPwd

 

l         DeleteUserInfo() 刪除用戶信息,調(diào)用存儲(chǔ)過(guò)程DeleteUserInfo

 

(@UserID)

 

2class UserAuthentication() 用戶認(rèn)證類,用來(lái)實(shí)現(xiàn)用戶角色、權(quán)限的設(shè)置,包括方法:

 

l         CreatePermissionInfo(string PermissionName string Permissi-

 

-onNote) 建立權(quán)限信息,調(diào)用存儲(chǔ)過(guò)程CreatePermissionInfo

 

@PermissionName,@PermissionNote

 

l         CreateRoleInfo(string RoleName string RoleNote) 建立角色信息,調(diào)用存儲(chǔ)過(guò)程CreateRoleInfo(@RoleName,@RoleNote)

 

l         DeleteRoleInfo() 刪除角色信息,調(diào)用存儲(chǔ)過(guò)程DeleteRoleInfo

 

(@RoleID)

 

l         GrantUserRole(string UserID string RoleID string UserRoleNote) 授予用戶角色,調(diào)用存儲(chǔ)過(guò)程GrantUserRole(@UserID,@RoleID,

 

@UserRoleNote)

 

l         DeleteUserRole() 刪除用戶角色,調(diào)用存儲(chǔ)過(guò)程DeleteUserRole

 

(@UserRoleID)

 

l         GrantRolePermission(string RoleID string PermissionID string RolePermissionNote) 授予角色權(quán)限,調(diào)用存儲(chǔ)過(guò)程GrantRolePermission(@RoleID,@PermissionID,@RolePermissionNote)

 

l         DeleteRolePermission() 刪除授予的角色權(quán)限,調(diào)用存儲(chǔ)過(guò)程

 

DeleteRolePermission(@RolePermissionID)

 

4.2 用戶認(rèn)證代碼設(shè)計(jì)(Client端)

Client端調(diào)用WebService方法來(lái)進(jìn)行數(shù)據(jù)庫(kù)訪問(wèn),Client端代碼設(shè)計(jì)主要實(shí)現(xiàn)界面的功能,包括:權(quán)限設(shè)置、用戶管理、用戶授權(quán)管理和用戶認(rèn)證管理

1)權(quán)限設(shè)置

 

class PermissionInfoMng() 用戶權(quán)限信息管理類,包括方法:

 

l         CreatePermissionInfo() 建立權(quán)限信息

 

2)用戶管理

 

class UserInfoMng() 用戶信息管理類,包括方法:

 

l         CreateUserInfo() 建立用戶信息

 

l         ModifyUserInfo() 修改用戶信息

 

l         DeleteUserInfo() 刪除用戶信息

 

3)用戶授權(quán)管理

 

class RoleInfoMng() 角色信息管理類,包括方法:

 

l         CreateRoleInfo() 建立角色信息

 

l         DeleteRoleInfo() 刪除角色信息

 

class UserRoleMng() 用戶角色管理類,包括方法:

 

l         GrantUserRole() 授予用戶角色

 

l         DeleteUserRole() 刪除用戶角色

 

class RolePermissionMng() 角色權(quán)限管理類,包括方法

 

l         GrantRolePermission() 授予角色權(quán)限

 

l         DeleteRolePermission() 刪除角色權(quán)限

 

4)用戶認(rèn)證管理

 

class Authentication() 用戶認(rèn)證類,包括方法:

 

l         Login(string UserName string UserPwd) 用戶登陸認(rèn)證,用戶認(rèn)證通過(guò)分配給用戶一個(gè)TicketID,否則TicketID則為null

 

l         Logout() 用戶正常退出

 

l         ExceptionLogout() 用戶異常退出

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    又色又爽又黄的三级视频| 99国产一区在线播放| 日本东京热加勒比一区二区| 精品一区二区三区人妻视频| 亚洲日本加勒比在线播放| 亚洲熟女一区二区三四区| 99国产高清不卡视频| 高跟丝袜av在线一区二区三区| 久久大香蕉精品在线观看| 黄片免费观看一区二区| 福利视频一区二区在线| 日本欧美视频在线观看免费| 日韩人妻毛片中文字幕| 国产在线视频好看不卡| 国产一区二区三区香蕉av| 中文字幕乱码亚洲三区| 青青操日老女人的穴穴| 91福利免费一区二区三区| 翘臀少妇成人一区二区| 国产精品福利一级久久| 久草热视频这里只有精品| 激情爱爱一区二区三区| 九九视频通过这里有精品| 久久经典一区二区三区| 欧美一级特黄特色大色大片| 高清亚洲精品中文字幕乱码| 中文文精品字幕一区二区| 欧美日韩国产黑人一区| 欧美色欧美亚洲日在线| 空之色水之色在线播放| 99久久精品视频一区二区| 高清一区二区三区四区五区| 国产精品伦一区二区三区四季| 在线观看视频国产你懂的| 亚洲欧美日韩精品永久| 熟女白浆精品一区二区| 日韩偷拍精品一区二区三区| 国产又大又黄又粗的黄色 | 中文久久乱码一区二区| 好吊日视频这里都是精品| 国产午夜精品在线免费看|