天天看點

Django 權限控制初探

通過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("-----&gt;&gt;&gt;",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