有人能说出这三个扩展之间是否存在根本区别,或者他们都做了类似的事情吗?我一直在阅读文档,似乎有很多交叉。我猜一些只是提供更多功能。
我想在我的应用中添加用户角色,以便某些用户具有某些权限。即level1用户可以创建5个资源,level2用户可以创建10个等等。我一直在寻找滚动我自己,它似乎并不太棘手。我正在考虑使用这个http://flask.pocoo.org/snippets/98/的装饰器,这个解决方案会有任何安全问题吗?我已经在使用Flask-login,所以我将它与它集成。
答案 0 :(得分:15)
Flask-Auth是身份验证和权限的单一解决方案,但我还没有看到它使用/引用太多。
Flask-Principal会做你想做的事,但它很简陋;滚动自己的工作不会多得多。
Flask-Security将Flask-Login,-Principal和其他一些扩展汇总成一个更连贯的整体,将它们作为依赖项安装。尽可能使用它提供的方法而不是各个扩展方法。我没有使用它,但似乎需要大量的手工劳动。
对于仅需要添加用户角色的特定用例,我建议坚持使用Flask-Principal。它运行良好,维护良好,并且足够通用,可以满足您的任何要求。
答案 1 :(得分:4)
一般来说,它们都很相似,但有些功能比其他功能更多。例如,Flask-Security非常繁重,具有许多额外的安全功能,例如加密。事实上,Flask-Security包含Flask-Principal作为子集。 Flask-Principal可以使用Flask-Login进行身份验证,即使这只是一个选项。所以你可以看到它们都是相关的,但有些是彼此的子集或超集。
现在在您的具体情况下,您已经在使用Flask-Login了,这非常棒。如果您需要添加Flask-Login不支持的用户角色,我建议您扩展用户模型以添加Roles列,然后覆盖login_required装饰器。如果您尝试使用Flask-Security等扩展程序,那么在您的情况下可能会有些过分。
例如,我将使用角色字段扩展我的User类。它可以具有“ANY”,“ADMIN”等值。任何方法都无关紧要。
class User(UserMixin):
def get_role():
return rolename
然后我将覆盖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_user.get_role()
if ( (urole != role) and (role != "ANY")):
logout_user()
return current_app.login_manager.unauthorized()
return fn(*args, **kwargs)
return decorated_view
return wrapper