django web 自定义通用权限控制

需求: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(‘没有权限‘)

原文地址:https://www.cnblogs.com/yoyo008/p/9225352.html

时间: 2024-11-05 21:44:37

django web 自定义通用权限控制的相关文章

3YAdmin-专注通用权限控制与表单的后台管理系统模板

3YAdmin基于React+Antd构建.GitHub搜索React+Antd+Admin出来的结果没有上百也有几十个,为什么还要写这个东西呢? 一个后台管理系统的核心我认为应该是权限控制,表单以及错误信息收集这三大块,前两个最为重要.而GitHub上的大多数项目关注点都不在这里,各种第三方组件堆砌在一起,看起来很炫酷,但是实用性没多大,改起来也麻烦(如果是vue,可以看我的另一个项目vue-quasar-admin). 有人可能会有疑问:权限控制,不同系统实现不一样,根本没法做到通用.权限控

Web Service学习-CXF开发Web Service的权限控制(二)

Web Service如何进行权限控制? 解决思路:服务器端要求input消息总是携带有用户名,密码信息,如果没有用户名和密码信息,直接拒绝调用 解决方案:拦截器 为了让程序员能访问,并修改CXF框架所生成的SOAP消息,CXF提供了拦截器 CXF(Celtix +XFire)说明: 如果不用CXF等框架,SOAP消息的生成,解析都是由程序员负责.无论是添加用户名,密码信息还是提取用户名,密码信息,都可由程序员代码完成. 如果使用CXF等框架,SOAP消息的生成,解析都是由CXF等框架来完成.

Django web框架之权限管理二

1. login登录 def login(request): if request.method=="GET": return render(request,'login.html') else: username=request.POST.get('user') password=request.POST.get('pwd') user=models.User.objects.filter(username=username,password=password).first() if

基于MVC4+EasyUI的Web开发框架形成之旅--权限控制

我在上一篇随笔<基于MVC4+EasyUI的Web开发框架形成之旅--框架总体界面介绍>中大概介绍了基于MVC的Web开发框架的权限控制总体思路.其中的权限控制就是分为"用户登录身份验证"."控制器方法权限控制"."界面元素权限控制"三种控制方式,可以为Web开发框架本身提供了很好用户访问控制和权限控制,使得用户界面呈现菜单.Web界面的按钮和内容.Action的提交控制,均能在总体权限功能分配和控制之下. 本篇文章主要细化这三个方面

基于MVC4+EasyUI的Web开发框架形成之旅(7)--权限控制

我在上一篇随笔<基于MVC4+EasyUI的Web开发框架形成之旅--框架总体界面介绍>中大概介绍了基于MVC的Web开发框架的权限控制总体思路.其中的权限控制就是分为“用户登录身份验证”.“控制器方法权限控制”.“界面元素权限控制”三种控制方式,可以为Web开发框架本身提供了很好用户访问控制和权限控制,使得用户界面呈现菜单.Web界面的按钮和内容.Action的提交控制,均能在总体权限功能分配和控制之下. 本篇文章主要细化这三个方面的介绍,重点介绍“控制器方法权限控制”.“界面元素权限控制”

struts2拦截器加自定义注解实现权限控制

https://blog.csdn.net/paul342/article/details/51436565 今天结合Java的Annotation和Struts2进行注解拦截器权限控制. 功能需求:添加.查找.删除三个功能,添加.查找功能需进行权限拦截判断,删除功能则不需进行权限拦截判断. 操作流程如下:客户未登录或登录已超时,提示"客户还没登陆或登陆已超时!!!",终止执行,然后跳转到某页面:否则继续往下执行. 以下模拟案例大概实现如上需求,接下来废话少说,直接copy代码 项目地

django中的权限控制

Django默认提供了权限控制,但只能对使用了其自带的登录认证的用户进行权限控制,说白了就是只能对存储在auth_user表中的用户进行权限控制,但不能对未登录过的用户进行权限控制.但如果通过集成LDAP认证后的用户,其用户也会被缓存到该表中,即变相实现了AD用户也能进行权限控制. 权限是auth 应用中定义的Permission类型:User与Permission是many-to-many的关系. Django对于每个模型类,自动增加add.change.delete三种权限,以便于权限控制.

Spring+MyBatis实践—登录和权限控制

1.实现用户登录功能: 通过session来实现用户登录功能.在用户登录时,将用户的相关信息放在HttpSession对象用,其中HttpSession对象可以通过HttpServletRequest的getSession方法获得.同时,HttpSession对象对应Jsp内置对象session,在jsp页面中也可以通过session来访问,如通过jstl标签库来访问session中的内容: <c:if test="${sessionScope.username == null}"

Spring+MyBatis实践——登录与权限控制

Spring+MyBatis实践--登录与权限控制 1.实现用户登录功能: 通过session来实现用户登录功能.在用户登录时,将用户的相关信息放在HttpSession对象用,其中HttpSession对象可以通过HttpServletRequest的getSession方法获得.同时,HttpSession对象对应Jsp内置对象session,在jsp页面中也可以通过session来访问,如通过jstl标签库来访问session中的内容: Html代码   <c:if test="${