Djang之基于角色的权限控制(RBAC)

一、后端部分

1. models设计

实现:特定角色拥有访问特定url路径,角色关联用户,以此来控制用户的访问。

如:管理员:可以访问所有的url地址,甲关联了管理员,则甲拥有访问所有url地址的权限,普通用户:只拥有访问查看数据(查看某个页面)的url地址,乙关联普通用户,乙就只拥有普通用户的权限

2.models实现

class Permission(models.Model):
    url = models.CharField(max_length=64, verbose_name=‘权限‘)
    title = models.CharField(max_length=32, verbose_name=‘标题‘)

    def __str__(self):
        return self.title

    class Meta:
        verbose_name_plural = ‘权限管理‘

class Role(models.Model):
    name = models.CharField(max_length=32, verbose_name=‘角色‘)
    permissions = models.ManyToManyField(Permission, verbose_name=‘角色拥有的权限‘, blank=True)

    def __str__(self):
        return self.name

    class Meta:
        verbose_name_plural = ‘角色管理‘

class User(models.Model):
    username = models.CharField(max_length=32, verbose_name=‘用户名‘, unique=True)
    password = models.CharField(max_length=32, verbose_name=‘密码‘)
    roles = models.ManyToManyField(Role, verbose_name=‘用户的角色‘, blank=True)

    def __str__(self):
        return self.username

    class Meta:
        verbose_name_plural = ‘用户管理‘

models.py

3. 将登陆成功的用户的权限(url地址)写入到session中

from rbac import models
from django.shortcuts import redirect, render, HttpResponse
from django.conf import settings

def login(request):
    if request.method == ‘POST‘:
        username = request.POST.get(‘username‘)
        password = request.POST.get(‘password‘)
        obj = models.User.objects.filter(username=username, password=password).first()
        if not obj:
            error = ‘用户名或密码错误‘
            return render(request, ‘login.html‘, locals())

        # 获取权限的信息
        permission= obj.roles.all().filter(permissions__url__isnull=False).values(‘permissions__url‘,
                                                                            ‘permissions__title‘,
                                                                          ).distinct()

        # 获取登录用户的权限列表(能访问的url地址)
        request.session[‘permission‘] = list(permission)
        request.session[‘is_login‘] = 1
        return redirect(‘index‘)

    return render(request, ‘login.html‘, locals())    

views.py

4. 白名单与免认证名单

#白名单:无需登录,就可以访问的路径
WHITE_LIST = [
    r‘/login/‘,
    r‘^/admin/‘,
]

#免认证名单 登录之后的用户都可以访问的url
PUBLIC_LIST = [
    r‘/index/‘,
]

settings.py

5. 从中间件中获取request.session中的permission权限(url地址列表)

from django.utils.deprecation import MiddlewareMixin
from django.conf import settings
from django.shortcuts import redirect, HttpResponse
import re

class AuthMiddleware(MiddlewareMixin):
    def process_request(self, request):
        url = request.path_info  # 当前页面的url地址
        # 白名单 :登陆、注册、admin
        for i in settings.WHITE_LIST: # WHITE_LIST是配置在settings.py文件中的地址白名单
            if re.match(i, url):
                return

        # 登陆验证
        is_login = request.session.get(‘is_login‘)
        if is_login != 1:
            return redirect(‘login‘)

        # 免认证 登录之后所有人都能访问的地址如:后台首页
        for i in settings.PUBLIC_LIST:
            if re.match(i, url):
                return

        # 权限验证 我们在登录函数中将当前登录用户中的所有权限(url地址列表)都放入到了session中,这里拿出来和当前的url地址进行匹配。
        permission = request.session.get(‘permission ‘)
        for i in permission:
            if re.match(r‘^{}$‘.format(i[‘url‘]), url):
                return
        return HttpResponse(‘没有权限,请联系管理员!‘)

middlewares/rbac.py

二、前端部分

6.  自定模板标签,渲染数据

注意:模板标签存放的目录必须为tamplatetags

# -*- coding: utf-8 -*-
# __author__ = "maple"
from django import template
from django.conf import settings
import re
register = template.Library()
@register.inclusion_tag(‘menu_tag.html‘) # menu_tag.html文件时配合该函数做模板渲染的,是该标签的一部分
def menu(request):
    """
   当当前url地址与menu_list中的url地址能够匹配到时,给menu_list中
   的匹配到的地址添加一个键值对{"class":"active"}
    """
    url = request.path_info
    # 添加激活的样式
    for i in menu_list:
        if re.match(f‘^{i["url"]}$‘,url):
            i[‘class‘] = ‘active‘
            break
    return {‘menu_list‘:menu_list}

# menu_list的数据格式如:
#    [{‘url‘:‘/customer/list/‘},{‘url‘:‘/customer/add/‘},]
# 假如当前url地址为:/customer/list/时
#    则 menu_list中数据会变为:
#    [{‘url‘:‘/customer/list/‘,"class":"active"},{‘url‘:‘/customer/add/‘},]

my_tags.py

my_tags文件中通过装饰器渲染的标签内容

<div class="static-menu">
    {% for menu in menu_list %}
        <a href="{{ menu.url}}" class="{{menu.class}}">{{ menu.title}}</a>
    {% endfor %}
</div>

menu_tag.html

7. 应用自定义标签

    ...
<div class="left-menu">
   <div class="menu-body">
        {% load my_tags %}
        {% menu request %}
</div>
    ...    

顶级模板文件中

原文地址:https://www.cnblogs.com/kindvampire/p/12173525.html

时间: 2024-08-14 10:10:30

Djang之基于角色的权限控制(RBAC)的相关文章

使用Lync 2013 基于角色的权限控制:RBAC 给用户分配指定的操作权限

使用场景: 在大型的Lync统一沟通系统的日常运维中,我们需要为不同角色的管理员分配不同的Lync管理权限,在Lync Server 2013上面就使用了基于角色的权限控制:RBAC ,它里面分了多种权限角色,包括 CsAdministrator,CsUserAdministrator,CsVoiceAdministrator,CsServerAdministrator,CsViewOnlyAdministrator,CsHelpDesk等等,不同的角色有不同的Lync管理权限, 例如,当我们只

基于角色的权限控制

首先要明白的有一个表就是需要记录整个项目中控制器和方法,这样在权限检测的时候就可以检测数据库对应的角色有没有这个控制器或者方法的权限, 但是需要明白的是在开发的过程中当然需要把这种权限给取消,这样在开发过程是需要增加一个控制器或者方法就不需要验证权限,然后开发好了之后就需要 在权限表中增加该控制器和方法. 一般基于角色的权限控制,需要用到下面的几张表 1.用户表2,权限表,3.角色表,4权限角色关系表5用户角色关系表 这种方式是用户通过,用户角色关系表查询出自己的角色,然后通过权限角色关系表查出

webapi框架搭建-安全机制(三)-基于角色的权限控制

webapi框架搭建系列博客 上一篇已经完成了"身份验证",如果只是想简单的实现基于角色的权限管理,我们基本上不用写代码,微软已经提供了authorize特性,直接用就行. Authorize特性的使用方法 配置Authorize 比较简单,直接上代码 using System.Collections.Generic; using System.Net.Http; using System.Security.Claims; using System.Web.Http; using we

thinkphp基于角色的权限控制详解

一.什么是RBAC 基于角色的访问控制(Role-Based Access Control)作为传统访问控制(自主访问,强制访问)的有前景的代替受到广泛的关注. 在RBAC中,权限与角色相关联,用户通过成为适 基于角色的访问控制(Role-Based Access Control)作为传统访问控制(自主访问,强制访问)的有前景的代替受到广泛的关注. array( 'APP_AUTOLOAD_PATH'=>'@.TagLib', 'SESSION_AUTO_START'=>类型 1 登录认证 2

基于角色的权限控制在Drupal7中的实现

案例:某公司网站除默认的三个角色外,需要设置5个角色来实现权限控制. 1.内容发布员:新建内容.修改和删除自己发布的内容. 2.内容管理员:继承发布员的所有权限,并可修改和删除所有人发布的内容. 3.公司领导:查看指定给公司领导访问的内容. 4.公司中层:查看指定给公司中层访问的内容. 5.公司员工:查看指定给公司员工访问的内容. 实现步骤如下: 1.新建上述五个角色. 2.在用户权限管理界面中给内容发布员和内容管理员赋予相应的权限. 3.下载.安装.启用content_access模块,并重建

ASP.net MVC 基于角色的权限控制系统的实现

一.引言 我们都知道ASP.net mvc权限控制都是实现AuthorizeAttribute类的OnAuthorization方法. 下面是最常见的实现方式: public class CustomAuthorizeAttribute : AuthorizeAttribute { public override void OnAuthorization(AuthorizationContext filterContext) { if (!filterContext.RequestContext

ASP.NET MVC 基于角色的权限控制系统的示例教程

上一次在 .NET MVC 用户权限管理示例教程中讲解了ASP.NET MVC 通过AuthorizeAttribute类的OnAuthorization方法讲解了粗粒度控制权限的方法,接下来讲解基于角色的权限控制方法. 基于角色的权限控制方法概述 基于角色的权限控制系统RBAC(Role Based Access Control)是目前最流行,也是最通用的权限控制系统.所谓基于角色的权限控制,就是将各个操作权限分组,每一个组就是一个角色,举个例子:管理员拥有所有的权限,编辑就只拥有写文章和发布

基于角色的权限访问控制初步

基于角色的权限访问控制(Role-Based Access Control) 角色访问控制(RBAC)引入了role的概念,目的是为了隔离user(即动作主体,subject)与privilege(权限,表示对resource的一个操作,即operation+resource).role作为一个用户(user)与权限(privilege)的代理层,解耦了权限和用户的关系,所有的授权应该给予role而不是直接给user或 group.privilege是权限颗粒,由operation和resour

Spring Security(17)——基于方法的权限控制

目录 1.1     intercept-methods定义方法权限控制 1.2     使用pointcut定义方法权限控制 1.3     使用注解定义方法权限控制 1.3.1    JSR-250注解 1.3.2    @Secured注解 1.3.3    支持表达式的注解 1.4     方法权限控制的拦截器 1.4.1    MethodSecurityInterceptor 1.4.2    AspectJMethodSecurityInterceptor 之前介绍的都是基于URL