2017-01-23 52 views
0

是否可以在Flask中設置多個登錄管理器?我有3個網頁包含不同內容的需要密碼保護:如何在Flask中設置多個登錄管理器?

mydomain.com/page1 
mydomain.com/page2 
mydomain.com/page3 

任何登錄和訪問第1頁應該訪問第2頁第三頁或(反之亦然)。

我想一種方法是在我的jinja2模板中指定username,並根據它顯示頁面結果。例如,我可以添加:

{% if current_user.is_authenticated and current_user.username == 'abc' %} 
<!-- show HTML for user 'abc' only --> 

但是使用這種方法,頁面2和頁面3仍然可以訪問。他們只是不會顯示任何內容,因爲在jinja2模板中沒有爲這些用戶定義任何內容。

以下是我目前擁有的LoginManager()設置:

lm = LoginManager() 
lm.init_app(app) 
lm.login_view = 'login' 

class User(): 
    def __init__(self, username): 
     self.username = username 

    def is_authenticated(self): 
     return True 

    def is_active(self): 
     return True 

    def is_anonymous(self): 
     return False 

    def get_id(self): 
     return self.username 

    @staticmethod 
    def validate_login(password_hash, password): 
     return check_password_hash(password_hash, password) 

@lm.user_loader 
def load_user(id): 
    user = myUsers.find_one({"User": id}) 
    if not user: 
     return None 
    return User(user['User']) 

@app.route('/login', methods=['GET', 'POST']) 
def login(): 
    form = LoginForm() 
    if current_user.is_authenticated: 
     return redirect(request.args.get("next") or url_for("dashboard")) 
     return redirect(url_for("dashboard")) 
    else: 
     if request.method == 'POST' and form.validate_on_submit(): 
      user = myUsers.find_one({"User": form.username.data}) 
      if user and User.validate_login(user['Password'], form.password.data): 
       user_obj = User(user['User']) 
       login_user(user_obj) 
       return redirect(request.args.get("next") or url_for("dashboard")) 
      flash("Wrong username or password. Please try again.", category='error') 
     return render_template('/login.html', title='Login', form=form) 
+0

添加[Flask-Principle](https://pythonhosted.org/Flask-Principal/)以使用Flask-Login。請參閱文檔中的[細粒度資源保護](https://pythonhosted.org/Flask-Principal/#granular-resource-protection)。 – pjcunningham

+0

@pjcunningham謝謝。我會看看。 – mapr

回答

0

這篇文章並沒有直接回答你的問題,但我希望它可以提供另一個角度來看,您的問題。我的解決方案是在您的User類中實現自定義view decoratorrole字段以限制用戶訪問。

+0

謝謝。我已經開始嘗試'角色'了。基本上它是另一個被稱爲User類的一部分。然後在我的jinja2模板中,我顯示了基於角色的內容,如'{%if current_user.is_authenticated and current_user.role =='admin'%} <! - 在此處添加內容 - > {%endif%}'。儘管如此,寧願在服務器端做到這一點。 – mapr

+0

查看裝飾是服務器端。在這個例子中,你可以看到如果用戶沒有登錄,視圖將不會被渲染。 – dvnguyen