各ユーザーに特定の役割を定義できます。たとえば、ユーザー「x」を SCHOOL に、ユーザー「y」を「STAFF」にすることができます。
class User(db.Model):
__tablename__ = 'User'
id = db.Column(db.Integer,primary_key=True)
username = db.Column(db.String(80),unique=True)
pwd_hash = db.Column(db.String(200))
email = db.Column(db.String(256),unique=True)
is_active = db.Column(db.Boolean,default=False)
urole = db.Column(db.String(80))
def __init__(self,username,pwd_hash,email,is_active,urole):
self.username = username
self.pwd_hash = pwd_hash
self.email = email
self.is_active = is_active
self.urole = urole
def get_id(self):
return self.id
def is_active(self):
return self.is_active
def activate_user(self):
self.is_active = True
def get_username(self):
return self.username
def get_urole(self):
return self.urole
ただし、Flask-login にはまだユーザー ロールの概念がなく、それをオーバーライドする独自のバージョンの login_required デコレータを作成しました。したがって、次のようなものを使用することをお勧めします。
def login_required(role="ANY"):
def wrapper(fn):
@wraps(fn)
def decorated_view(*args, **kwargs):
if not current_user.is_authenticated():
return current_app.login_manager.unauthorized()
urole = current_app.login_manager.reload_user().get_urole()
if ( (urole != role) and (role != "ANY")):
return current_app.login_manager.unauthorized()
return fn(*args, **kwargs)
return decorated_view
return wrapper
次に、次のようなビュー関数でこのデコレータを使用できます。
@app.route('/school/')
@login_required(role="SCHOOL")
def restricted_view_for_school():
pass