權(quán)限管理

low版權(quán)限管理結(jié)構(gòu)

圖片.png

1.創(chuàng)建rbac應(yīng)用

1.先看配置文件合適不,給創(chuàng)建的rbac在配置文件里面設(shè)置一下找到
INSTTLED_APPs=['rbac']


圖片.png

2.配置靜態(tài)文件


圖片.png

2.在models中創(chuàng)建對象

models
from django.db import models

class Permission(models.Model):
    """
    權(quán)限表
    """
    title = models.CharField(verbose_name='標題',max_length=32)
    url = models.CharField(verbose_name="含正則URL",max_length=64)
    is_menu = models.BooleanField(verbose_name="是否是菜單")

    class Meta:
        verbose_name_plural = "權(quán)限表"

    def __str__(self):
        return self.title

class User(models.Model):
    """
    用戶表
    """
    username = models.CharField(verbose_name='用戶名',max_length=32)
    password = models.CharField(verbose_name='密碼',max_length=64)
    email = models.CharField(verbose_name='郵箱',max_length=32)

    roles = models.ManyToManyField(verbose_name='具有的所有角色',to="Role",blank=True)

    class Meta:
        verbose_name_plural = "用戶表"

    def __str__(self):
        return self.username

class Role(models.Model):
    """
    角色表
    """
    title = models.CharField(max_length=32)
    permissions = models.ManyToManyField(verbose_name='具有的所有權(quán)限',to='Permission',blank=True)
    class Meta:
        verbose_name_plural = "角色表"

    def __str__(self):
        return self.title

models

3.基于Django admin錄入權(quán)限數(shù)據(jù)

注意錄入信息要先創(chuàng)建個超級用戶

 python3 manage.py createsuperuser
-用戶名 root
-密碼:peak2345

注意税稼;需要在admin.py中做如下操作(只針對從用admin導入數(shù)據(jù)的時候配置疲扎,當然也可以直接添加)

from django.contrib import admin
from . import models
admin.site.register(models.Permission)
admin.site.register(models.User)
admin.site.register(models.Role)

4.用戶登錄程序

根據(jù)輸入的用戶名和密碼的到相應(yīng)的user
根據(jù)user對象獲取其擁有的角色和權(quán)限并去重并將權(quán)限表的url放入session中拒垃,將這部分操作的代碼抽取到service包下的init_permission.py下的init_permission(request,user)方法中宴卖,然后在views中調(diào)用該方法既可

  • 獲取當前用戶具有的所有權(quán)限(去重)
  • 獲取權(quán)限中的url,放置到session中
def init_permission(user,request):
    """
    初始化權(quán)限信息捏悬,獲取權(quán)限信息并放置到session中。
    :param user:
    :param request:
    :return:
    """
    permission_list = user.roles.values('permissions__title', 'permissions__url', 'permissions__is_menu').distinct()
    url_list = []
    for item in permission_list:
        url_list.append(item['permissions__url'])
    print(url_list)
    request.session['permission_url_list'] = url_list

init_permission.py

4.中間件的使用

如果不用中間件會有好多個函數(shù)润梯,就有許多重復的代碼过牙,這樣我們可以用中間件來完成
中間件和裝飾器的區(qū)別:

  • 中間件用來做批量處理
  • 如果函數(shù)不多的話可以用加裝飾器的方法
import re
#:用re去匹配的時候,re.match(/userinfo/,/userinfo/add) #都能匹配到
from django.shortcuts import redirect,HttpResponse
from django.conf import settings

class MiddlewareMixin(object):
    def __init__(self, get_response=None):
        self.get_response = get_response
        super(MiddlewareMixin, self).__init__()

    def __call__(self, request):
        response = None
        if hasattr(self, 'process_request'):
            response = self.process_request(request)
        if not response:
            response = self.get_response(request)
        if hasattr(self, 'process_response'):
            response = self.process_response(request, response)
        return response


class RbacMiddleware(MiddlewareMixin):

    def process_request(self,request):
        # 1. 獲取當前請求的URL
        # request.path_info
        # 2. 獲取Session中保存當前用戶的權(quán)限
        # request.session.get("permission_url_list')
        current_url = request.path_info

        # 當前請求不需要執(zhí)行權(quán)限驗證(白名單)
        for url in settings.VALID_URL:
            if re.match(url,current_url):
                return None

        permission_list = request.session.get("permission_url_list")
        if not permission_list:
            return redirect('/login/')

        flag = False
        for db_url in permission_list:
            regax = "^{0}$".format(db_url)
           #:那么要記得在匹配正則的時候加個起始符和終止符regex = "^{0}$".format(url)
            if re.match(regax, current_url):
                flag = True
                break

        if not flag:
            return HttpResponse('無權(quán)訪問')

rbac.py

a.獲取當前訪問的路徑 request.path_info
b.在setting中配置不需要驗證的url--白名單(人人登錄后都能訪問如login admin)然后調(diào)用

VALID_URL = [
    "/login/",
    "/admin.*"
]

根據(jù)正則判斷當前路徑是否在白名單中纺铭,白名單中的路徑要嚴格控制以什么開頭和什么結(jié)尾寇钉,如果有白名單return none繼續(xù)執(zhí)行后面代碼如果不是直接跳轉(zhuǎn)到登錄
c.不是白名單的話,則要判斷是否登錄舶赔,最簡單的方法就是獲取session
看里面是否為空扫倡,如果為空的話說明沒有登錄直接跳轉(zhuǎn)到登錄,不讓他執(zhí)行后續(xù)的操作
d.url list不為空的話就說明已經(jīng)登陸了,進一步看當前的訪問路徑是否在是否在urllist中竟纳,在的話就說明用戶具有操作該url的權(quán)限否則就說明該用戶沒有
訪問權(quán)限撵溃,直接return HttpResponse("無權(quán)訪問")
注意:中間件創(chuàng)建完成之后疚鲤。需要在settings中的MIDDLEWARE最后添加'rbac.middlewares.rbac.RbacMiddleware',

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',
    'rbac.middlewares.rbac.RbacMiddleware',
]
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市缘挑,隨后出現(xiàn)的幾起案子石咬,更是在濱河造成了極大的恐慌,老刑警劉巖卖哎,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鬼悠,死亡現(xiàn)場離奇詭異,居然都是意外死亡亏娜,警方通過查閱死者的電腦和手機焕窝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來维贺,“玉大人它掂,你說我怎么就攤上這事∷萜” “怎么了虐秋?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長垃沦。 經(jīng)常有香客問我客给,道長,這世上最難降的妖魔是什么肢簿? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任靶剑,我火速辦了婚禮,結(jié)果婚禮上池充,老公的妹妹穿的比我還像新娘桩引。我一直安慰自己,他們只是感情好收夸,可當我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布坑匠。 她就那樣靜靜地躺著,像睡著了一般卧惜。 火紅的嫁衣襯著肌膚如雪厘灼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天序苏,我揣著相機與錄音手幢,去河邊找鬼。 笑死忱详,一個胖子當著我的面吹牛围来,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼监透,長吁一口氣:“原來是場噩夢啊……” “哼桶错!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起胀蛮,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤院刁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后粪狼,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體退腥,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年再榄,在試婚紗的時候發(fā)現(xiàn)自己被綠了狡刘。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡困鸥,死狀恐怖嗅蔬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情疾就,我是刑警寧澤澜术,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站猬腰,受9級特大地震影響鸟废,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜漆诽,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一侮攀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧厢拭,春花似錦、人聲如沸撇叁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽陨闹。三九已至楞捂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間趋厉,已是汗流浹背寨闹。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留君账,地道東北人繁堡。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親椭蹄。 傳聞我的和親對象是個殘疾皇子闻牡,可洞房花燭夜當晚...
    茶點故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內(nèi)容