2015-10-06 105 views
0

我正在使用Python 3.4。我有这样的路线:烧瓶登录无法检测匿名用户

@user.route('/manage_users', methods=['GET']) 
@login_required 
@any_administrator_required 
def manage_users(): 
    print('lkjrd') 

any_administrator_required是像这样定义我的一个装饰:

def any_administrator_required(f): 
    @wraps(f) 
    def decorated_function(*args, **kwargs): 
     if not current_user.data['primary_administrator'] and not current_user.data['secondary_administrator']: 
      abort(403) 
     return f(*args, **kwargs) 
    return decorated_function 

我的登录用户等级:

class LoggedInUser(UserMixin): 
    data = {} 
    def is_authenticated(self): 
     return True 
    def is_active(self): 
     return True 
    def is_anonymous(self): 
     return False 
    def get_id(self): 
     return str(self.data['user']) 

我能去我的登录页面或注销页面登录并正常注销,但是当我去一条装有login_required的路由未登录时,它不会重定向或用401终止。当我去/manage_users当未登录时,它会传递login_required修饰符并转到any_administrator_required,因为匿名用户类不具有self.data属性。我试着移动装饰器,以便它是这样的顺序:

@user.route('/manage_users', methods=['GET']) 
@any_administrator_required 
@login_required 
def manage_users(): 
    print('lkjrd') 

但它仍然有同样的结果。我unauthorized_callback

@login_manager.unauthorized_handler 
def unauthorized_callback(): 
    return redirect(url_for('login', next=request.path)) 

我登录的代码片段:

logged_in_user = LoggedInUser() 
logged_in_user.data = user_data  
login_user(logged_in_user) 
session['logged_in'] = True 

我的退出路线:

@logout.route('/logout', methods=['GET']) 
@login_required 
def logout(): 
    logout_user() 
    session.pop('logged_in', None) 
    return redirect(url_for('main')) 

,当然还有,要/logout而不是在刚登录重定向到主页面,没有401.

用户装载器:

@login_manager.user_loader 
def load_user(user_id): 
    r = REQUEST_USER_DATA_FROM_API 
    logged_in_user = LoggedInUser() 
    logged_in_user.data = r.json() 
    return logged_in_user 
+0

什么是你['user_loader'(https://flask-login.readthedocs.org/en/latest/#flask.ext.login.LoginManager.user_loader)看起来像? – dirn

回答

0

在通过flask_login.py模块追踪之后,login_manager._login_disabled为true,因为已启用测试。当_login_disabled为真时,装饰器login_required什么都不做。

代码login_required

@wraps(func) 
def decorated_view(*args, **kwargs): 
    if current_app.login_manager._login_disabled: 
     return func(*args, **kwargs) 
    elif not current_user.is_authenticated(): 
     return current_app.login_manager.unauthorized() 
    return func(*args, **kwargs)