黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

一種簡單的直觀的高效的權(quán)限設(shè)計(jì)

系統(tǒng) 2053 0

?大部分系統(tǒng)都有權(quán)限系統(tǒng)。一般來說,它能管控人員對某個否頁面的訪問;對某些字段、控件可見或者不可見。對gridview中的數(shù)據(jù)是否可刪除、可添加、可新增等等。大部分人都把權(quán)限作為一個子系統(tǒng)獨(dú)立出來。但是這里我不是想設(shè)計(jì)一個權(quán)限管理系統(tǒng),網(wǎng)上的設(shè)計(jì)方案太多了,可以說每個開發(fā)人員都有自己的開發(fā)權(quán)限管理系統(tǒng)的想法和思路。

?? 在這篇文章中,我先用簡單的C#代碼模仿一個用戶的權(quán)限,再使用sql去模擬。這是一種很簡單,很直觀,很高效的方式去判定用戶的權(quán)限。

C#:

???好吧,先從最簡單開始,定義一個用戶(User)類,如下。

1 ? class ?User?
2 ? {
3 ? ???? bool ?CanDelete;
4 ? ???? bool ?CanRead;
5 ? ???? bool ?CanWrite;
6 ? ???? bool ?CanModify;
7 ? ???? bool ?CanCreate;
8 ? }

??? 這里設(shè)計(jì)5個屬性來管控用戶的權(quán)限。我發(fā)現(xiàn)這樣雖然很直觀,但是不宜擴(kuò)張。我們將權(quán)限獨(dú)立出來,在看下面代碼:

?1 ? ???? enum ?PermissionTypes?:? int ?
?2 ? ????{
?3 ? ????????None? = ? 0 ,
?4 ? ????????Read? = ? 1 ,
?5 ? ????????Write? = ? 2 ,
?6 ? ????????Modify? = ? 4 ,
?7 ? ????????Delete? = ? 8 ,
?8 ? ????????Create? = ? 16 ,
?9 ? ????????All? = ?Read? | ?Write? | ?Modify? | ?Delete? | ?Create
10 ? ????}
11 ? ???? class ?User?
12 ? ????{
13 ? ??????? public ?PermissionTypes?Permissions? = ?PermissionTypes.None;
14 ? ????}

??? 我們先試用一下,你就能感覺到神奇之處:

?1 ? // 創(chuàng)建一個用戶
?2 ? User?admin? = ? new ?User();
?3 ? admin.Permissions? = ?PermissionTypes.Read
?4 ? ???? | ?PermissionTypes.Write
?5 ? ???? | ?PermissionTypes.Delete;
?6 ?
?7 ? // 驗(yàn)證權(quán)限
?8 ? bool ?canRead? = ?((PermissionTypes.Read? & ?admin.Permissions)? == ?PermissionTypes.Read);
?9 ? bool ?canWrite? = ?((PermissionTypes.Write? & ?admin.Permissions)? == ?PermissionTypes.Write);
10 ? bool ?canCreate? = ?((PermissionTypes.Create? & ?admin.Permissions)? == ?PermissionTypes.Create);
11 ?
12 ? // 查看結(jié)果
13 ? Console.WriteLine(canRead);? // true
14 ? Console.WriteLine(canWrite);? // true
15 ? Console.WriteLine(canCreate);? // false
16 ?

??? 利用了' |' 和' & '兩個操作。但是這樣看起來很是很別捏,初始化權(quán)限和驗(yàn)證權(quán)限用了一長串'|'和'&'運(yùn)算的代碼。很不直觀。我在System.Enum中擴(kuò)展一些方法供你調(diào)用,代碼如下。

?

?1 ? ?? // 是否存在權(quán)限
?2 ? ???????? public ? static ? bool ?Has < T > ( this ?System.Enum?type,?T?value)
?3 ? ????????{
?4 ? ???????????? try
?5 ? ????????????{
?6 ? ???????????????? return ?((( int )( object )type? & ?( int )( object )value)? == ?( int )( object )value);
?7 ? ????????????}
?8 ? ???????????? catch
?9 ? ????????????{
10 ? ???????????????? return ? false ;
11 ? ????????????}
12 ? ????????}
13 ? ???????? // 判斷權(quán)限
14 ? ???????? public ? static ? bool ?Is < T > ( this ?System.Enum?type,?T?value)
15 ? ????????{
16 ? ???????????? try
17 ? ????????????{
18 ? ???????????????? return ?( int )( object )type? == ?( int )( object )value;
19 ? ????????????}
20 ? ???????????? catch
21 ? ????????????{
22 ? ???????????????? return ? false ;
23 ? ????????????}
24 ? ????????}
25 ? ???????? // 添加權(quán)限
26 ? ???????? public ? static ?T?Add < T > ( this ?System.Enum?type,?T?value)
27 ? ????????{
28 ? ???????????? try
29 ? ????????????{
30 ? ???????????????? return ?(T)( object )((( int )( object )type? | ?( int )( object )value));
31 ? ????????????}
32 ? ???????????? catch ?(Exception?ex)
33 ? ????????????{
34 ? ???????????????? throw ? new ?ArgumentException(
35 ? ???????????????????? string .Format(
36 ? ???????????????????????? " 不能添加類型?'{0}' " ,
37 ? ???????????????????????? typeof (T).Name
38 ? ????????????????????????),?ex);
39 ? ????????????}
40 ? ????????}
41 ?
42 ? ???????? // 移除權(quán)限
43 ? ???????? public ? static ?T?Remove < T > ( this ?System.Enum?type,?T?value)
44 ? ????????{
45 ? ???????????? try
46 ? ????????????{
47 ? ???????????????? return ?(T)( object )((( int )( object )type? & ? ~ ( int )( object )value));
48 ? ????????????}
49 ? ???????????? catch ?(Exception?ex)
50 ? ????????????{
51 ? ???????????????? throw ? new ?ArgumentException(
52 ? ???????????????????? string .Format(
53 ? ???????????????????????? " 不能移除類型?'{0}' " ,
54 ? ???????????????????????? typeof (T).Name
55 ? ????????????????????????),?ex);
56 ? ????????????}
57 ? ????????}

?

使用一下:

?1 ? ??????????? // 創(chuàng)建一個用戶
?2 ? ????????????User?admin? = ? new ?User();
?3 ? ????????????PermissionTypes?permissions? = ? new ?PermissionTypes();
?4 ? ????????????admin.Permissions? = ?permissions;
?5 ? ???????????? // 添加權(quán)限
?6 ? ????????????admin.Permissions? = ?admin.Permissions.Add(PermissionTypes.Create);
?7 ? ????????????admin.Permissions? = ?admin.Permissions.Add(PermissionTypes.Read);
?8 ? ????????????admin.Permissions? = ?admin.Permissions.Add(PermissionTypes.Write);
?9 ? ??????????? // 判斷權(quán)限
10 ? ???????????? bool ?canRead? = ?admin.Permissions.Has(PermissionTypes.Read);? // true
11 ? ???????????? bool ?canWrite? = ?admin.Permissions.Has(PermissionTypes.Write);? // true
12 ? ???????????? bool ?canDelete? = ?admin.Permissions.Has(PermissionTypes.Delete);? // false
13 ? ???????????? bool ?canCreate? = ?admin.Permissions.Has(PermissionTypes.Create);? // true
14 ?
15 ? ????????????Console.WriteLine(canRead);? // true
16 ? ????????????Console.WriteLine(canWrite);? // true
17 ? ????????????Console.WriteLine(canDelete);? // false
18 ? ????????????Console.WriteLine(canCreate);? // true
19 ? ????????????Console.Read();

SQL:

??? 大部分權(quán)限管理都是數(shù)據(jù)庫的操作,好依照上面的思路,我在sqlserver里面模擬一下以上的操作,在sql中與或運(yùn)算是很高效的。先設(shè)計(jì)兩張表User和Permission。

一種簡單的直觀的高效的權(quán)限設(shè)計(jì)

?

一種簡單的直觀的高效的權(quán)限設(shè)計(jì)

1、獲取有Read權(quán)限的所有用戶:

1 ? select ? * ? from ? [ User ] ? where ?PermissionTypes & 1 ? = 1 ?

Result:

一種簡單的直觀的高效的權(quán)限設(shè)計(jì)

2、獲取有Delete權(quán)限的所有用戶:

1 ? select ? * ? from ? [ User ] ? where ?PermissionTypes & 8 ? = 8

Result:

3、判斷麒麟是否有有Delete權(quán)限

1 ? if ?? exists ?( select ? * ? from ? [ User ] ? where ?Name = ' qilin ' ? and ??PermissionTypes & 8 ? = 8 )
2 ???? print ? ' true '
3 ? else
4 ???? print ? ' flase '

Result: flase

?

一種簡單的直觀的高效的權(quán)限設(shè)計(jì)


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論