django web 自定义通用权限控制
生活随笔
收集整理的這篇文章主要介紹了
django web 自定义通用权限控制
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
需求:web系統(tǒng)有包含以下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):"""動態(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
二、前端根據用戶權限生成菜單
<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 %}" >
{{ 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('沒有權限')
四、后臺Django 的權限項修改用戶權限控制菜單訪問
https://www.douban.com/note/636370355/
?
轉載于:https://www.cnblogs.com/yoyo008/p/9225352.html
總結
以上是生活随笔為你收集整理的django web 自定义通用权限控制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 剑指offer 面试32题
- 下一篇: 频繁梦到自己恋爱意味着什么