flask許可權管理功能的實現

2021-07-24 10:41:44 字數 3495 閱讀 5082

許可權管理功能的實現可以分為以下幾個小塊:

1,新建資料庫表role,裡面包括id(integer,主鍵)name(string),permission(integer),default(boolean)。users是指向user模型的對外關係,反向賦給user模型乙個role屬性,這樣就可以同郭user.role來訪問role模型,這樣就建立了資料庫之間的關係。模型裡面還定義了乙個靜態方法(@staticmethod,可以直接通過類訪問這個方法而不需要建立例項之後才能訪問這個方法),它的作用是初始化role資料表中的資料,資料庫模型**如下:

class

role

(db.model):

#定義role的資料庫模型

__tablename__ = 'roles'

id = db.column(db.integer, primary_key=true)

name = db.column(db.string(64), unique=true)

permissions = db.column(db.integer)

default = db.column(db.boolean,default=false,index=true)

users = db.relationship('user', backref='role', lazy='dynamic')

def__repr__

(self):

return

'' % self.name

@staticmethod

definsert_role

():#這裡需要注意的是『|』的用法,以及python對各種進製的處理

roles =

for r in roles:

role = role.query.filter_by(name=r).first()

if role is

none:

role = role(name=r)

role.permissions = roles[r][0]

role.default = roles[r][1]

db.session.add(role)

db.session.commit()

permission類**如下:

class

permission

(): follow = 0x01

comment = 0x02

write_articles = 0x04

moderate_comments = 0x08

administer = 0x80

2,授予使用者許可權:因為user模型有role的屬性,可以通過user.role來獲取role資料庫中的內容,所以我們的思路是直接通過這一特性進行操作,直接在user模型中的初始化方法中實現預設許可權的賦予,是管理員給管理員許可權,不是給預設的使用者許可權。

def

__init__

(self,**kwargs):

super(user,self).__init__(**kwargs)

#繼承了父類的初始化方法,super等價於usermixin

if self.role is

none:

#驗證email是否為設定的管理員的email

self.role = role.query.filter_by(permissions=0xff).first()

if self.role is

none:

#如果經過了上一步許可權還為空,就給個預設的user許可權

self.role = role.query.filter_by(default=true).first()

以上只是針對於許可權為空的使用者,即剛註冊的使用者,若是使用者衝了乙個尊貴的會員就需要單獨賦予許可權了,所以我們可以在user模型裡建立乙個修改許可權的方法,需要的時候呼叫就可以。

3,用它來對使用者進行限制:

3.1,寫乙個用來判斷使用者許可權的方法,傳入使用者需要的許可權,進行驗證,符合返回true,否則為false。這個方法在user模型裡面:

def

can(self,permissions):

#這個方法用來傳入乙個許可權來核實使用者是否有這個許可權,返回bool值

return self.role is

notnone

and\

(self.role.permissions & permissions) == permissions

defis_administrator

(self):

#因為常用所以單獨寫成乙個方法以方便呼叫,其它許可權也可以這樣寫

return self.can(permission.administer)

3.2 將上面方法寫入修飾函式中

#encoding:utf8

from functools import wraps

from flask import abort

from flask_login import current_user

from .models import permission

defpermission_required

(permission):

defdecorator

(f):

@wraps(f)

defdecorated_function

(*args,**kwargs):

ifnot current_user.can(permission):

abort(403)

return f(*args, **kwargs)

return decorated_function

return decorator

defadmin_required

(f):

return permission_required(permission.administer)(f)

3.3 用修飾函式對有許可權要求的路由進行修飾:

@auth.route('/admin')

@admin_required

defadmin

():return

'你好,老公-_-'

實際操作過程中遇到的坑:

1,許可權存入資料庫中數值改變:它其實是以2進製的方式來處理的

0b00000001

0b00000010

0b00000100

0b10000000

如果只是第乙個許可權,它的值為1

如果是第二個許可權(0b00000001|0b00000010)即0b00000011,即3

第三個(0b00000010|0b00000010|0b00000010)即0b00000111即7

以此類推

它並不是以10進製來計算的

2,裝飾函式的理解存在問題。

PHP實現許可權管理功能

許可權管理系統,它主要是為了給不同的使用者設定不同的許可權,從而實現不同許可權的使用者登入之後使用的功能不一樣。首先先看下資料庫 總共有5張表,users,roles和roleswork 3張表與另外2張表形成 w 型的關係,也是比較常見的一種許可權資料庫的方式,首先先做許可權的設定,也就是管理層給...

給php許可權,PHP實現許可權管理功能的方法

許可權管理系統,它主要是為了給不同的使用者設定不同的許可權,從而實現不同許可權的使用者登入之後使用的功能不一樣。首先先看下資料庫 總共有5張表,users,roles和roleswork 3張表與另外2張表形成 w 型的關係,也是比較常見的一種許可權資料庫的方式,首先先做許可權的設定,也就是管理層給...

php 許可權設計檢查 PHP實現許可權管理功能示例

許可權管理系統,它主要是為了給不同的使用者設定不同的許可權,從而實現不同許可權的使用者登入之後使用的功能不一樣。首先先看下資料庫 總共有5張表,users,roles和roleswork 3張表與另外2張表形成 w 型的關係,也是比較常見的一種許可權資料庫的方式,首先先做許可權的設定,也就是管理層給...