溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Django web中怎么自定義通用權(quán)限

發(fā)布時(shí)間:2020-11-24 14:17:59 來(lái)源:億速云 閱讀:139 作者:Leah 欄目:開發(fā)技術(shù)

本篇文章為大家展示了Django web中怎么自定義通用權(quán)限,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。

需求:web系統(tǒng)有包含以下5個(gè)url,分別對(duì)于不同資源;

1、stu/add_stu/

2、stu/upload_homework/

3、stu/query_homework/

4、stu/add_record/

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

學(xué)生可以訪問:2,3

老師可以訪問:1,4

可以通過(guò)基于角色對(duì)用戶權(quán)限進(jìn)行控制:

一、數(shù)據(jù)模型

1、用戶表:用戶表和角色表為多對(duì)多關(guān)系,1個(gè)用戶可以有多個(gè)角色,1個(gè)角色可以被多個(gè)用戶劃分;

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='用戶登陸后請(qǐng)修改為真實(shí)名字')
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):
  """動(dòng)態(tài)菜單"""
  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

二、前端根據(jù)用戶權(quán)限生成菜單

<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 %}

這樣就可以根據(jù)用戶生成菜單,但是如果用戶不是通過(guò)菜單方法,而是直接通過(guò)url訪問,后臺(tái)還是沒有對(duì)這些url進(jìn)行控制

三、后臺(tái)根據(jù)用戶權(quán)限控制菜單訪問

裝飾器:

簡(jiǎn)言之,python裝飾器就是用于拓展原來(lái)函數(shù)功能的一種函數(shù),這個(gè)函數(shù)的特殊之處在于它的返回值也是一個(gè)函數(shù),使用python裝飾器的好處就是在不用更改原函數(shù)的代碼前提下給函數(shù)增加新的功能。

class Mddile1(MiddlewareMixin):
  def process_request(self,request):
    #如果用戶訪問的url是登錄、注冊(cè)頁(yè)面,記錄到白名單,放行
    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 不在當(dāng)前用戶權(quán)限之內(nèi) 返回login頁(yè)面
    if not Permission_url_list:
      return redirect(settings.LOGIN_URL)
    current_url=request.path_info
    #由于數(shù)據(jù)庫(kù)的數(shù)據(jù),可能是正則所有 一定要精確匹配
    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: #如果是程序調(diào)試應(yīng)該 顯示用戶可以訪問的權(quán)限
        url_html='<br/>'.join(Permission_url_list)
        return HttpResponse('無(wú)權(quán)訪問您可以訪問%s'%url_html)
      else:
        return HttpResponse('沒有權(quán)限')

上述內(nèi)容就是Django web中怎么自定義通用權(quán)限,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI