Django web自定義通用權(quán)限控制實現(xiàn)方法
需求:web系統(tǒng)有包含以下5個url,分別對于不同資源;
1、stu/add_stu/
2、stu/upload_homework/
3、stu/query_homework/
4、stu/add_record/
--------------------------------------------------------------------------------------------------------
學(xué)生可以訪問:2,3
老師可以訪問:1,4
可以通過基于角色對用戶權(quán)限進行控制:
一、數(shù)據(jù)模型
1、用戶表:用戶表和角色表為多對多關(guān)系,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): """動態(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ù)用戶生成菜單,但是如果用戶不是通過菜單方法,而是直接通過url訪問,后臺還是沒有對這些url進行控制
三、后臺根據(jù)用戶權(quán)限控制菜單訪問
裝飾器:
簡言之,python裝飾器就是用于拓展原來函數(shù)功能的一種函數(shù),這個函數(shù)的特殊之處在于它的返回值也是一個函數(shù),使用python裝飾器的好處就是在不用更改原函數(shù)的代碼前提下給函數(shù)增加新的功能。
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 不在當(dāng)前用戶權(quán)限之內(nèi) 返回login頁面 if not Permission_url_list: return redirect(settings.LOGIN_URL) current_url=request.path_info #由于數(shù)據(jù)庫的數(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('無權(quán)訪問您可以訪問%s'%url_html) else: return HttpResponse('沒有權(quán)限')
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python數(shù)據(jù)封裝json格式數(shù)據(jù)
本次內(nèi)容是小編在網(wǎng)上整理的關(guān)于如何python數(shù)據(jù)封裝json格式的內(nèi)容總結(jié),有興趣的讀者們參考下。2018-03-03使用Python實現(xiàn)XLS和XLSX之間的相互轉(zhuǎn)換
在日常工作中,我們經(jīng)常需要處理和轉(zhuǎn)換不同格式的Excel文件,以適應(yīng)不同的需求和軟件兼容性,Excel文件的兩種常見格式是XLS(Excel 97-2003)和XLSX(Excel 2007及以上版本),本文將詳細介紹如何使用Python在XLS和XLSX格式之間進行轉(zhuǎn)換,需要的朋友可以參考下2024-09-09關(guān)于Torch?torchvision?Python版本對應(yīng)關(guān)系說明
這篇文章主要介紹了關(guān)于Torch?torchvision?Python版本對應(yīng)關(guān)系說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-05-05Python異常處理:try、except、else、finally的全面解析
在Python中,異常是程序在運行時發(fā)生的錯誤,當(dāng)Python解釋器遇到一個它不能處理的錯誤時,它會拋出一個異常,異常處理的主要目的是在程序遇到錯誤時,提供一種方法來處理這些錯誤,而不是簡單地讓程序崩潰,本文介紹了Python異常處理:try、except、else、finally的全面解析2024-07-07python中ASCII碼字符與int之間的轉(zhuǎn)換方法
今天小編就為大家分享一篇python中ASCII碼字符與int之間的轉(zhuǎn)換方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07