1. 程式人生 > >django web 自定義通用權限控制

django web 自定義通用權限控制

password del match sel 模型 tex rfi 所有 數據庫

需求: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 %}" >
{{ 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 web 自定義通用權限控制