2017-01-23 22 views
0

Flaskで複数のログインマネージャを設定することはできますか?Flaskで複数のログインマネージャを設定するには?

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

誰でもログインしてアクセスするページ1 がPAGE2またはPAGE3(またはその逆)へのアクセス権を持ってい必要があります。私は、パスワードで保護する必要が異なるコンテンツを持つ3ページを持っています。

私の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を操作します。ドキュメントの[Granular Resource Protection](https://pythonhosted.org/Flask-Principal/#granular-resource-protection)を参照してください。 – pjcunningham

+0

@pjcunninghamありがとうございます。私は見てみましょう。 – mapr

答えて

0

この投稿は直接あなたの質問に答えるが、私はそれがあなたの問題に別の視点を提供することを願っていません。私の解決策は、ユーザーのアクセスを制限するために、ユーザークラスにカスタムview decoratorフィールドとroleフィールドを実装することです。

+0

ありがとうございます。私はすでに 'role'を実験し始めました。基本的には 'User'クラスの一部として呼び出される別のものです。次に、私のjinja2テンプレートでは、 '{%if current_user.is_authenticated and current_user.role == 'admin'%} <! - ここにコンテンツを追加する - > {%endif%}'のようなロールに基づいてコンテンツを表示します。しかし、サーバー側でこれを行うことを好むだろう。 – mapr

+0

ビューデコレータはサーバー側です。この例では、ユーザーがログインしていない場合、ビューはレンダリングされないことがわかります。 – dvnguyen

関連する問題