一.RBAC概念
RBAC基于角色的权限访问控制(Role-Based Access Control)
在计算机系统安全中,基于角色的访问控制(RBAC)或基于角色的安全性是一种将系统访问限制在授权用户的方法。它被大多数员工超过500人的企业使用并且可以实现强制访问控制(MAC)或自由访问控制(DAC)。
基于角色的访问控制(RBAC)是围绕角色和权限定义的一种与策略无关的访问控制机制。RBAC的角色权限、用户角色和角色关系等组件使执行用户分配变得简单。NIST的一项研究表明,RBAC解决了商业和政府组织的许多需求。RBAC可以用于在拥有数百个用户和数千个权限的大型组织中促进安全管理。尽管RBAC不同于MAC和DAC访问控制框架,但它可以执行这些策略而不会造成任何复杂性。
二.项目中简单使用RBAC思想
需求:
给不同的用户分配不同的角色,不同的角色操作不同的功能。
表结构分析:
用户表(UserInfo):存储用户名密码,用户和角色是多对多关系,使用roles来创建第三张表
角色表(Role):存储角色名,角色和权限表是多对多关系,使用permissions来创建第三张表
权限表(Permission):存储url和title,用来控制用户可以访问的url路径
表结构架构图:
表结构实现:
用户表:
class UserInfo(models.Model):
name = models.CharField(max_length=32)
password = models.CharField(max_length=16)
roles = models.ManyToManyField(to='Role')
def __str__(self):
return self.name
角色表:
class Role(models.Model):
name = models.CharField(max_length=32)
Permissions = models.ManyToManyField(to='Permission')
def __str__(self):
return self.name
权限表:
class Permission(models.Model):
url = models.CharField(max_length=48)
title = models.CharField(max_length=32)
def __str__(self):
return self.title
数据库表生成结果:
三.权限认证
一.登录:
def login(request):
if request.method == 'GET':
return render(request,'login.html')
else:
uname = request.POST.get('username')
pwd = request.POST.get('password')
user_obj = models.UserInfo.objects.filter(name=uname,password=pwd).first()
if user_obj:
# 登录认证-放到session中
request.session['is_login'] = True
# 权限认证-放到session中
permissions_list = user_obj.roles.values('Permissions__url','Permissions__title')
request.session['permissions_list'] = list(permissions_list)
return redirect('app05:index')
else:
return redirect('app05:login')
二.使用中间件认证:
import re
from django.utils.deprecation import MiddlewareMixin
from django.urls import reverse
from django.shortcuts import HttpResponse,redirect
class PermissionAuth(MiddlewareMixin):
def process_request(self,request):
# 当前路劲
current_path = request.path
# 白名单
white_list = [reverse('app05:login'),'/admin/*']
for white_path in white_list:
if re.match(white_path,current_path):
return None
# 登录认证
is_login = request.session.get('is_login')
if not is_login: #不为真就重定向到登录页面
return redirect('app05:login')
# 权限认证
permission_path_list = request.session.get('permissions_list')
for permission_path in permission_path_list:
reg = '^%s$' % permission_path['Permissions__url']
if re.match(reg,current_path):
return None
# 循环路径进行一一匹配,匹配不到走else。
else:
return HttpResponse('没有权限操作此功能!!')
结果:
用户没有权限操作返回:没有权限操作此功能!!
有权限则正常显示:
中间件不要忘了注册:
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
# 注册中间件
'app05.rbac.mymiddllware.PermissionAuth'
]