2016-11-10 7 views
0

Ich baue jetzt einen Flask Blog und richte eine Admin-Oberfläche ein. Ich habe über das Einrichten der Sicherheit für Flask-Admin gelesen. Ich habe es geschafft, die Sicherheit für alle meine Modelle einzurichten (der Zugriff ist nur für eingeloggte Benutzer möglich), aber die Benutzer können immer noch auf die Route "/ admin" zugreifen, die nur einen leeren Home-Button enthält.Flask-Admin Route ausblenden

Meine Frage ist: Gibt es irgendeine Möglichkeit, die '/ Admin' Route zu verstecken oder zu schützen, so dass ein nicht authentifizierter Benutzer nur auf die Anmeldeseite/verweigert Zugriff umgeleitet wird?

Vielen Dank!

Anbringen meiner aktuellen Admin-Setup:

from flask_admin import Admin 
from flask_login import current_user 
from flask_admin.contrib import sqla 
from wtforms.widgets import TextArea 
from wtforms import TextAreaField 
from samo.models import User, Post, Tag 
from samo import app,db 

admin = Admin(app, name='Admin', template_mode='bootstrap3') 

class CKTextAreaWidget(TextArea): 
    def __call__(self, field, **kwargs): 
     if kwargs.get('class'): 
      kwargs['class'] += ' ckeditor' 
     else: 
      kwargs.setdefault('class', 'ckeditor') 
     return super(CKTextAreaWidget, self).__call__(field, **kwargs)  

class CKTextAreaField(TextAreaField): 
    widget = CKTextAreaWidget() 

class PostAdmin(sqla.ModelView): 
    form_overrides = dict(content=CKTextAreaField) 
    create_template = 'blog/ckeditor.html' 
    edit_template = 'blog/ckeditor.html' 
    form_excluded_columns = ('slug')  
    def is_accessible(self): 
     return current_user.is_authenticated 
admin.add_view(PostAdmin(Post, db.session)) 

class TagAdmin(sqla.ModelView): 
    def is_accessible(self): 
     return current_user.is_authenticated 
admin.add_view(TagAdmin(Tag, db.session)) 

class UserAdmin(sqla.ModelView): 
    def is_accessible(self): 
     return current_user.is_authenticated 
admin.add_view(UserAdmin(User, db.session)) 
+0

Wenn Sie eine Route zu verbergen, wie würden Sie es zugreifen? Warum können Sie Redirect nicht verwenden, wenn nicht authentifiziert, wie Sie sagten? –

Antwort

2

ich eine solche Konfiguration verwenden, wie Sie es für alle meine Websites beschrieben. Verwenden Sie eine AdminIndexView. Hier ist ein Beispiel für die Handhabung von Login, Logout und Redirection, falls der Benutzer nicht autorisiert ist.

class FlaskyAdminIndexView(AdminIndexView): 

    @expose('/') 
    def index(self): 
     if not login.current_user.is_authenticated: 
      return redirect(url_for('.login')) 
     return super(FlaskyAdminIndexView, self).index() 

    @expose('/login', methods=['GET', 'POST']) 
    def login(self): 
     form = LoginForm(request.form) 
     if helpers.validate_form_on_submit(form): 
      user = form.get_user() 
      if user is not None and user.verify_password(form.password.data): 
       login.login_user(user) 
      else: 
       flash('Invalid username or password.') 
     if login.current_user.is_authenticated: 
      return redirect(url_for('.index')) 
     self._template_args['form'] = form 
     return super(FlaskyAdminIndexView, self).index() 

    @expose('/logout') 
    @login_required 
    def logout(self): 
     login.logout_user() 
     return redirect(url_for('.login')) 

In Ihrem __init__.py, wo Sie Ihre Admin-Objekt erstellen, dies zu tun:

admin = Admin(index_view=FlaskyAdminIndexView())