1. 程式人生 > 程式設計 >Django web自定義通用許可權控制實現方法

Django web自定義通用許可權控制實現方法

需求:web系統有包含以下5個url,分別對於不同資源;

1、stu/add_stu/

2、stu/upload_homework/

3、stu/query_homework/

4、stu/add_record/

--------------------------------------------------------------------------------------------------------

學生可以訪問:2,3

老師可以訪問:1,4

可以通過基於角色對使用者許可權進行控制:

一、資料模型

1、使用者表:使用者表和角色表為多對多關係,1個使用者可以有多個角色,1個角色可以被多個使用者劃分;

email = models.EmailField(
  verbose_name='email address',max_length=255,unique=True,)
 password = models.CharField(_('password'),max_length=128,\
               help_text=mark_safe('''<a href ="password/" >修改密碼</a>'''))
name = models.CharField(max_length=32,help_text='使用者登陸後請修改為真實名字')
is_active = models.BooleanField(default=True)
is_admin = models.BooleanField(default=False)
role = models.ManyToManyField("Role")

def __str__(self):
  return self.email


2、角色表:

class Role(models.Model):
  """角色表"""
  name = models.CharField(unique=True,max_length=32)
  menus = models.ManyToManyField("Menu")
  def __str__(self):
    return self.name

3、選單表:

class Menu(models.Model):
  """動態選單"""
  name = models.CharField(unique=True,max_length=32)
  url_type = models.SmallIntegerField(choices=((0,'relative_name'),(1,'absolute_url')))
  url_name = models.CharField(unique=True,max_length=128)

  def __str__(self):
    return self.name

二、前端根據使用者許可權生成選單

<div class="container-fluid">
 <div class="row">
   {% block side-bar %}
  <div class="col-sm-3 col-md-2 sidebar">
   <ul class="nav nav-sidebar">
    {% block side-bar-menus %}
       {% for role in request.user.userprofile.roles.all %}
        <hr>
        {% for menu in role.menus.all %}
         <li>
           <a href="{% if menu.url_type == 0 %}{% url menu.url_name %}{% else %} {{ menu.url_name }}{% endif %}" rel="external nofollow"  >
           {{ menu.name }}
           </a>
         </li>
        {% endfor %}
      {% endfor %}
    {% endblock %}
    </ul>
  </div>
   {% endblock %}

這樣就可以根據使用者生成選單,但是如果使用者不是通過選單方法,而是直接通過url訪問,後臺還是沒有對這些url進行控制

三、後臺根據使用者許可權控制選單訪問

裝飾器:

簡言之,python裝飾器就是用於拓展原來函式功能的一種函式,這個函式的特殊之處在於它的返回值也是一個函式,使用python裝飾器的好處就是在不用更改原函式的程式碼前提下給函式增加新的功能。

class Mddile1(MiddlewareMixin):
  def process_request(self,request):
    #如果使用者訪問的url是登入、註冊頁面,記錄到白名單,放行
    for url in settings.PASS_URL_LIST:
      if re.match(url,request.path_info):
        return None
    Permission_url_list=request.session.get(settings.SESSION_PERMISSION_URL_KEY)
    #如果使用者訪問的url 不在當前使用者許可權之內 返回login頁面
    if not Permission_url_list:
      return redirect(settings.LOGIN_URL)
    current_url=request.path_info
    #由於資料庫的資料,可能是正則所有 一定要精確匹配
    flag=False
    for url in Permission_url_list:
      url='^%s$'%(url)
      if re.match(url,current_url):
        flag=True
        break
    if not flag:
      if settings.DEBUG: #如果是程式除錯應該 顯示使用者可以訪問的許可權
        url_html='<br/>'.join(Permission_url_list)
        return HttpResponse('無權訪問您可以訪問%s'%url_html)
      else:
        return HttpResponse('沒有許可權')

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。