許可權管理功能的實現可以分為以下幾個小塊:
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 型的關係,也是比較常見的一種許可權資料庫的方式,首先先做許可權的設定,也就是管理層給...