一.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'
]