日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

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

系統(tǒng) 1767 0

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

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

C#:

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

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

??? 這里設(shè)計(jì)5個(gè)屬性來管控用戶的權(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)建一個(gè)用戶
?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 ?

??? 利用了' |' 和' & '兩個(gè)操作。但是這樣看起來很是很別捏,初始化權(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)建一個(gè)用戶
?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號(hào)聯(lián)系: 360901061

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

【本文對(duì)您有幫助就好】

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

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 巴青县| 辽阳县| 彰武县| 洪泽县| 玛纳斯县| 枣阳市| 鹤岗市| 桐庐县| 黑河市| 黎城县| 景宁| 会东县| 龙岩市| 乌海市| 慈利县| 财经| 丰都县| 天镇县| 普定县| 中山市| 台安县| 云梦县| 景谷| 苏州市| 茂名市| 稻城县| 昌黎县| 嵊州市| 中方县| 乌恰县| 长岛县| 益阳市| 永新县| 普陀区| 南丰县| 肃北| 尉氏县| 彰武县| 富民县| 宁德市| 会泽县|