2016-11-10 11 views
0

Я создаю блог Flask и настраиваю интерфейс администратора. Я читал о настройке безопасности для Flask-Admin. Мне удалось настроить защиту (доступ ограничивается только зарегистрированным пользователям) для всех моих моделей, но пользователи все равно могут получить доступ к маршруту «/ admin», который имеет только голую домашнюю кнопку в нем.Hide Flask-Admin route

Мой вопрос: есть ли способ скрыть или защитить маршрут '/ admin', чтобы неавторизованный пользователь просто перенаправлялся на страницу входа/отказался?

Большое спасибо!

Прикрепление моей текущей настройки администратора:

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

Если скрыть маршрут, как бы вы к нему доступ? Почему вы не можете использовать перенаправление, если не аутентифицированы, как вы сказали? –

ответ

2

Я использую такую ​​конфигурацию, как вы описали это для всех моих сайтов. Используйте AdminIndexView. Ниже приведен пример того, как вход в систему, выход из системы и перенаправление, если пользователь не авторизовался.

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')) 

В вашем __init__.py где вы создаете свой объект администратора сделать это:

admin = Admin(index_view=FlaskyAdminIndexView())