我正在写有作为的用户此功能多类应用程序(例如,一个学校的帐户和员工帐户)。 我试图用瓶,登录,使这个容易,但我不太清楚如何使它,所以,当我在用户登录可以有我的应用程序检查,以查看用户名是否属于学校帐户或员工帐户,然后适当地登录。
我知道如何找出它属于哪种类型的账户来(因为所有的用户名必须是唯一的)。 但在那之后,我不知道如何告诉我希望它登录特定用户的应用程序。
现在,我只有一个通用的登录页面。 它是比较容易,如果我做职员帐户和学校账户单独登录页面? 我使用过的烧瓶SQLAlchemy的MySQL数据库。
您可以定义与特定角色的每个用户。 例如,用户的“x”可以是学院而用户的“y”可以是“职工”。
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
瓶登录但是不具有用户角色的概念还没有和我写我自己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
@codegeek我发现这是非常有用的,谢谢。 我不得不修改代码一点得到它为我工作,所以我想我会在这里掉落的情况下,它可以帮助别人:
from functools import wraps
login_manager = LoginManager()
...
def login_required(role="ANY"):
def wrapper(fn):
@wraps(fn)
def decorated_view(*args, **kwargs):
if not current_user.is_authenticated():
return login_manager.unauthorized()
if ((current_user.role != role) and (role != "ANY")):
return login_manager.unauthorized()
return fn(*args, **kwargs)
return decorated_view
return wrapper
这是你可以做一个例子。 我没有使用烧瓶SQLAlchemy的经验,但怎么也不应该更加不同。 下面的示例使用的SQLAlchemy直接。
首先定义从继承的用户类Base
,以便它可以通过ORM映射(声明)
class User(Base):
__tablename__ = 'user_table'
id = Column(Integer, primary_key=True)
email = Column(String(45), unique=True)
name = Column(String(45))
pwd = Column(String(8))
user_role = Column(String(15))
__mapper_args__ = {
'polymorphic_identity': 'user_table',
'polymorphic_on': user_role
}
一旦你的父类类是准备好了,为每个你想拥有的角色设定不同的类。
class SchoolAccount(User):
__tablename__ = 'school_account'
id = Column(Integer, ForeignKey('user_table.id'), primary_key=True)
representative_name = Column(String(45))
__mapper_args__ = {
'polymorphic_identity': 'school_account'
}
使用烧瓶登录您登录基于角色的用户身份和限制访问。
这里是一个登录系统的两个不同角色的例子。 这是烧瓶,烧瓶的SQLAlchemy,烧瓶登录一个很好的教程: http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-v-user-logins
看看从“角色管理” 瓶,安全 。 它可以与烧瓶登录轻松集成。
一种选择是将瓶用户通过@ LV10答复中提到。 它实现了一个抽象的用户,处理很多事情,其中之一就是基于角色的认证 。
该代码将保持基本相同@codegeek的答案,但在用户级“urole”属性应该被重新命名为“角色”和角色必须与“名”属性(你可以复制粘贴一类的文档 )。 你将不再需要定义login_required,因为作为roles_required它已经实现。 所以,与其@login_required(role='rolename')
我们@roles_required('rolename')
我刚开始使用这个API出于安全原因和它作为一个伟大的经验。 我强烈推荐给任何人与密码,用户认证和用户角色的问题。