2017-12-01 30 views
0

私はFlask-Adminを初めて利用しており、私はそれを自分のアプリに実装することができました。すべてがうまくいきます。管理者ビューが設定され、データを表示および作成/削除できます。Flask-Admin with Custom Security

私がセキュリティオプションを探すとき、私は自分自身をロールすることができます。しかし、それはクラスベースのビューの例を示しています(私は関数ベースです)。Flask-Loginを使用する必要があります。私はそれを使用したくない。私はすでに次のような必要なパスの認可チェックを受けています。

def login_required(something): 
    @wraps(something) 
    def wrap(*args, **kwargs): 
     if 'logged_in' in session: 
      return test(*args, **kwargs) 
     else: 
      return redirect(url_for('main.login')) 

    return wrap 


@main_blueprint.route('/') 
@login_required 
def index(): 
    form = MessageForm(request.form) 
    return render_template('index.html', form=form) 


@main_blueprint.route('/login', methods=['GET', 'POST']) 
def login(): 
    error = None 
    form = LoginForm(request.form) 

    if request.method == 'POST': 
     if form.validate_on_submit(): 
      user = User.query.filter_by(name=request.form['name']).first() 
      if user is not None and bcrypt.check_password_hash(user.password, request.form['password']): 
       session['logged_in'] = True 
       session['user_id'] = user.id 
       session['role'] = user.role 
       session['user'] = user.name 
       flash('Welcome') 

       return redirect(url_for('main.index')) 
      else: 
       error = 'Invalid Username or Password.' 
       flash('Invalid Username/Password Combination') 
    return render_template('login.html', form=form, error=error) 

私は

@main_blueprint.route('/admin') 
@login_required 
def admin(): 
    return render_template('admin/master.html') 

しかし、明らかにそれは働いていない次の操作を行うために何をしてきました。

Flask-LoginまたはFlask-Securityまたはその他の追加モジュールを使用せずに、Flask-Adminパスに独自のセキュリティを実装するにはどうすればよいですか?

答えて

0

私は私の答えを見つけたと思う。 https://danidee10.github.io/2016/11/14/flask-by-example-7.htmlの助けを借りて、私はそれを私のアプリに実装することができました。

class AdminView(sqla.ModelView): 

    def __init__(self, *args, **kwargs): 
     super().__init__(*args, **kwargs) 
     self.static_folder = 'static' 

    def is_accessible(self): 
     return session.get('role') == 'admin' 

    def inaccessible_callback(self, name, **kwargs): 
     if not self.is_accessible(): 
      return redirect(url_for('main.login', next=request.url)) 

とにadmin = Admin(app)を変更:

admin = Admin(app, name='Dashboard', index_view=AdminView(User, db.session, url='/admin', endpoint='admin'))