通過django預設的權限管理來管理權限即可,我們在基礎上進行一些第三方擴充
下面給出一個權限控制的示例,這裡url路徑轉發的時候需要添加預設的 别名,我們需要修改的也是這些别名
models.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<code>class</code> <code>UserProfile(models.Model):</code>
<code> </code><code>user </code><code>=</code> <code>models.OneToOneField(User) </code>
<code> </code><code>name </code><code>=</code> <code>models.CharField(max_length</code><code>=</code><code>64</code><code>)</code>
<code> </code><code>school </code><code>=</code> <code>models.ForeignKey(</code><code>'School'</code><code>)</code>
<code> </code><code>def</code> <code>__unicode__(</code><code>self</code><code>):</code>
<code> </code><code>return</code> <code>self</code><code>.name</code>
<code> </code><code>class</code> <code>Meta:</code>
<code> </code><code>permissions </code><code>=</code><code>((</code><code>'view_customer_list'</code><code>, u</code><code>"可以檢視客戶清單"</code><code>),</code>
<code> </code><code>(</code><code>'view_customer_info'</code><code>,u</code><code>"可以檢視客戶詳情"</code><code>),</code>
<code> </code><code>(</code><code>'edit_own_customer_info'</code><code>,u</code><code>"可以修改自己的客戶資訊"</code><code>),</code>
<code> </code><code>(</code><code>'view_teacher_list'</code><code>,u</code><code>"可以檢視老師清單"</code><code>),</code>
<code> </code><code>(</code><code>'view_school_list'</code><code>,u</code><code>"可以檢視學校清單"</code><code>),</code>
<code> </code><code>)</code>
permissions.py 這邊采取的是裝飾的寫法
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
<code># -*- coding:utf-8 -*-</code>
<code># Author:Alex Li</code>
<code>from</code> <code>django.core.urlresolvers </code><code>import</code> <code>resolve</code>
<code>from</code> <code>django.shortcuts </code><code>import</code> <code>render</code>
<code>perm_dic </code><code>=</code> <code>{</code>
<code> </code><code>'view_customer_list'</code><code>: [</code><code>'customer_list'</code><code>,</code><code>'GET'</code><code>,[]],</code>
<code> </code><code>'view_customer_info'</code><code>: [</code><code>'customer_detail'</code><code>,</code><code>'GET'</code><code>,[]],</code>
<code> </code><code>''''''</code>
<code> </code><code>'''後端參數'''</code>
<code> </code><code>'edit_own_customer_info'</code><code>: [</code><code>'customer_detail'</code><code>,</code><code>'POST'</code><code>,[]],</code>
<code>}</code>
<code>def</code> <code>perm_check(</code><code>*</code><code>args,</code><code>*</code><code>*</code><code>kwargs):</code>
<code> </code><code>request </code><code>=</code> <code>args[</code><code>0</code><code>]</code>
<code> </code><code>url_resovle_obj </code><code>=</code> <code>resolve(request.path_info)</code>
<code> </code><code>current_url_namespace </code><code>=</code> <code>url_resovle_obj.url_name</code>
<code> </code><code>#app_name = url_resovle_obj.app_name #use this name later</code>
<code> </code><code>print</code><code>(</code><code>"url namespace:"</code><code>,current_url_namespace)</code>
<code> </code><code>matched_flag </code><code>=</code> <code>False</code> <code># find matched perm item</code>
<code> </code><code>matched_perm_key </code><code>=</code> <code>None</code>
<code> </code><code>if</code> <code>current_url_namespace </code><code>is</code> <code>not</code> <code>None</code><code>:</code><code>#if didn't set the url namespace, permission doesn't work</code>
<code> </code><code>print</code><code>(</code><code>"find perm..."</code><code>)</code>
<code> </code><code>for</code> <code>perm_key </code><code>in</code> <code>perm_dic:</code>
<code> </code><code>perm_val </code><code>=</code> <code>perm_dic[perm_key]</code>
<code> </code><code>if</code> <code>len</code><code>(perm_val) </code><code>=</code><code>=</code> <code>3</code><code>:</code><code>#otherwise invalid perm data format</code>
<code> </code><code>url_namespace,request_method,request_args </code><code>=</code> <code>perm_val</code>
<code> </code><code>print</code><code>(url_namespace,current_url_namespace)</code>
<code> </code><code>if</code> <code>url_namespace </code><code>=</code><code>=</code> <code>current_url_namespace: </code><code>#matched the url</code>
<code> </code><code>if</code> <code>request.method </code><code>=</code><code>=</code> <code>request_method:</code><code>#matched request method</code>
<code> </code><code>if</code> <code>not</code> <code>request_args:</code><code>#if empty , pass</code>
<code> </code><code>matched_flag </code><code>=</code> <code>True</code>
<code> </code><code>matched_perm_key </code><code>=</code> <code>perm_key</code>
<code> </code><code>print</code><code>(</code><code>'mtched...'</code><code>)</code>
<code> </code><code>break</code> <code>#no need looking for other perms</code>
<code> </code><code>else</code><code>:</code>
<code> </code><code>for</code> <code>request_arg </code><code>in</code> <code>request_args: </code><code>#might has many args</code>
<code> </code><code>request_method_func </code><code>=</code> <code>getattr</code><code>(request,request_method) </code><code>#get or post mostly</code>
<code> </code><code>#print("----->>>",request_method_func.get(request_arg))</code>
<code> </code><code>if</code> <code>request_method_func.get(request_arg) </code><code>is</code> <code>not</code> <code>None</code><code>:</code>
<code> </code><code>matched_flag </code><code>=</code> <code>True</code> <code># the arg in set in perm item must be provided in request data</code>
<code> </code><code>else</code><code>:</code>
<code> </code><code>matched_flag </code><code>=</code> <code>False</code>
<code> </code><code>print</code><code>(</code><code>"request arg [%s] not matched"</code> <code>%</code> <code>request_arg)</code>
<code> </code><code>break</code> <code>#no need go further</code>
<code> </code><code>if</code> <code>matched_flag </code><code>=</code><code>=</code> <code>True</code><code>: </code><code># means passed permission check ,no need check others</code>
<code> </code><code>print</code><code>(</code><code>"--passed permission check--"</code><code>)</code>
<code> </code><code>matched_perm_key </code><code>=</code> <code>perm_key</code>
<code> </code><code>break</code>
<code> </code><code>else</code><code>:</code><code>#permission doesn't work</code>
<code> </code><code>'''這邊如果 沒有定義url别名的話,那麼為了避免影響全局,就讓它預設就有權限'''</code>
<code> </code><code>return</code> <code>True</code>
<code> </code><code>if</code> <code>matched_flag </code><code>=</code><code>=</code> <code>True</code><code>:</code>
<code> </code><code>#pass permission check</code>
<code> </code><code>perm_str </code><code>=</code> <code>"crm.%s"</code> <code>%</code><code>(matched_perm_key) </code><code>#crm.view_customer_list</code>
<code> </code><code>if</code> <code>request.user.has_perm(perm_str):</code>
<code> </code><code>print</code><code>(</code><code>"\033[42;1m--------passed permission check----\033[0m"</code><code>)</code>
<code> </code><code>return</code> <code>True</code>
<code> </code><code>else</code><code>:</code>
<code> </code><code>print</code><code>(</code><code>"\033[41;1m ----- no permission ----\033[0m"</code><code>)</code>
<code> </code><code>print</code><code>(request.user,perm_str)</code>
<code> </code><code>return</code> <code>False</code>
<code> </code><code>else</code><code>:</code>
<code> </code><code>print</code><code>(</code><code>"\033[41;1m ----- no matched permission ----\033[0m"</code><code>)</code>
<code> </code><code>'''所有的為空的情況,也沒有放過'''</code>
<code> </code><code>return</code> <code>False</code>
<code>def</code> <code>check_permission(func):</code>
<code> </code><code>def</code> <code>wrapper(</code><code>*</code><code>args,</code><code>*</code><code>*</code><code>kwargs):</code>
<code> </code><code>print</code><code>(</code><code>'---start check perm---'</code><code>)</code>
<code> </code><code>if</code> <code>perm_check(</code><code>*</code><code>args,</code><code>*</code><code>*</code><code>kwargs) </code><code>is</code> <code>not</code> <code>True</code><code>:</code><code>#no permisssion</code>
<code> </code><code>return</code> <code>render(args[</code><code>0</code><code>],</code><code>'crm/403.html'</code><code>)</code>
<code> </code><code>return</code> <code>func(</code><code>*</code><code>args,</code><code>*</code><code>*</code><code>kwargs)</code>
<code> </code><code>return</code> <code>wrapper</code>
views.py
<code>'''這塊也在前端做了下權限劃分的顯示,成功了'''</code>
<code>@login_required</code>
<code>@check_permission</code>
<code>def</code> <code>teachers(req):</code>
<code> </code><code>teachers_list</code><code>=</code><code>models.UserProfile.objects.</code><code>all</code><code>()</code>
<code> </code><code>return</code> <code>render(req,</code><code>'crm/teachers.html'</code><code>,{</code><code>'teachers_list'</code><code>:teachers_list})</code>
◆ 權限驗證(1)
views 中驗證
<code>if</code> <code>not</code> <code>request.user.has_perm(</code><code>'crm.view_teachers_list'</code><code>) </code>
<code>return</code> <code>HttpResponse(</code><code>'Forbidden'</code><code>)</code>
◆ 權限驗證(2)
Template 中的權限檢查
<code>{</code><code>%</code> <code>if</code> <code>perms.crm.view_teachers_list </code><code>%</code><code>} </code>
<code>有權限 </code>
<code>{</code><code>%</code> <code>endif </code><code>%</code><code>}</code>
前端權限判斷截圖如下:
本文轉自 sjfbjs 51CTO部落格,原文連結:http://blog.51cto.com/11886896/2063972