zoukankan      html  css  js  c++  java
  • 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('没有权限')


    四、后台Django 的权限项修改用户权限控制菜单访问

    https://www.douban.com/note/636370355/

  • 相关阅读:
    左偏树
    论在Windows下远程连接Ubuntu
    ZOJ 3711 Give Me Your Hand
    SGU 495. Kids and Prizes
    POJ 2151 Check the difficulty of problems
    CodeForces 148D. Bag of mice
    HDU 3631 Shortest Path
    HDU 1869 六度分离
    HDU 2544 最短路
    HDU 3584 Cube
  • 原文地址:https://www.cnblogs.com/yoyo008/p/9225352.html
Copyright © 2011-2022 走看看