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)限進(jì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 ='http://www.piao2010.com/bcjs/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='http://www.piao2010.com/bcjs/{% 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ìn)行控制
三、后臺根據(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=Truebreak 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í)有所幫助,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. ThinkPHP5 通過ajax插入圖片并實時顯示(完整代碼)2. Python使用oslo.vmware管理ESXI虛擬機(jī)的示例參考3. 一篇文章帶你了解JavaScript-對象4. javascript設(shè)計模式 ? 建造者模式原理與應(yīng)用實例分析5. Java構(gòu)建JDBC應(yīng)用程序的實例操作6. IntelliJ IDEA設(shè)置條件斷點的方法步驟7. Express 框架中使用 EJS 模板引擎并結(jié)合 silly-datetime 庫進(jìn)行日期格式化的實現(xiàn)方法8. Ajax引擎 ajax請求步驟詳細(xì)代碼9. python flask框架快速入門10. 解決Python paramiko 模塊遠(yuǎn)程執(zhí)行ssh 命令 nohup 不生效的問題
