2016-03-29 37 views
1

我有一个烧瓶web应用程序,它有多个蓝图(restserver,webserver)。不同烧瓶蓝图的Differnet登录视图

webserver和restserver中的大多数端点都需要用户登录。我使用flask-login扩展,它提供了@login_required装饰器。

是否有可能有不同的蓝图

# for web blueprint 
login_mananger.login_view = '/web/login' 

.. so on 
+0

也许,但是重定向到休息终端的登录视图没有任何意义。如果用户未通过身份验证,则只会返回403。 – davidism

+0

是的。这正是我想要的。我如何确保仅为web服务器蓝图执行login_manager.login_view ='/ web/login'。 – user462455

回答

0

一个REST风格的最重要的特色是无国籍,这意味着服务器将不会“记住”从客户的任何信息,从不同的请求login_view客户应该已经包含了所有需要的信息,包括认证信息。

回到您的问题,您不必使用Flask-Login进行REST式服务验证,并且由于客户端的多样性,您不应使用Cookie或会话。你当然可以自己DIY HTTP认证,但Flask-HTTPAuth是你真正需要的。

这里是瓶,HTTPAuth的一个最简单的例子:

from flask.ext.httpauth import HTTPBasicAuth 
auth = HTTPBasicAuth() 

@auth.verify_password 
def verify_password(username, password): 
    user = User.query.filter_by(username=username).first() 
    if not user: 
     return False 
    g.current_user = user 
    # You should accomplish the verify_password function by yourself in the User model. 
    return user.verify_password(password) 

据烧瓶HTTPAuth商务部:

回调函数有两个参数,用户名和 密码必须返回True或False。

你应该注意到的初始化烧瓶HTTPAuth只是在蓝图,而不是因为这个认证只是在你的restserver蓝图使用的整个应用程序。

还有就像一个函数瓶登录的@login_required它通过烧瓶HTTPAuth提供:

@app.route('/private') 
@auth.login_required 
def private_page(): 
    return "Only for authorized people!" 

当认证成功的这种“login_required”回调函数将被调用。由于所有restserver的路由都应该受到保护,因此可以使用“before_request”处理程序将保护应用于整个蓝图。假设你restserver蓝图的名字是“休息”,并已保存在“G”的用户对象,就像我们做什么之前:

from flask import jsonify 

@rest.before_request 
@auth.login_required 
def before_request(): 
    if not g.current_user: 
     return jsonify({'error':'Unauthorized.'}) 

我认为这会做的伎俩。我上面写的只是最简单的例子,你可以用很多方式做得更好,比如在首次请求后用令牌替换用户凭证。我相信你会弄明白的。

如果我的回答很有帮助,如果您可以为此答案“upvote”,我将非常荣幸,谢谢。