2016-12-18 3 views
1

Я хочу, чтобы пользователи не обращались к URL-адресу администратора, я уже обеспечил просмотр, но /admin/ по-прежнему доступен.Как запретить пользователям доступ к странице администратора?

admin.py

import os 

from flask import request, redirect, url_for 
from werkzeug import secure_filename 

from flask_admin import Admin, AdminIndexView 
from flask_admin import BaseView, expose 
from flask_admin.contrib.sqla import ModelView 
from flask_admin.contrib.fileadmin import FileAdmin 

from flask_login import current_user,login_required 

from develop.extentions import admin_permission 

from wtforms import FileField 

class AdminIndex(AdminIndexView): 
    @expose('/admin/') 
    def index(self): 
     if not current_user.is_authenticated: 
      return redirect(url_for('main.index')) 
     return self.render('admin/home.html') 

    def is_accessible(self): 
     return current_user.roles('admin') 

class CustomModelView(ModelView): 
    def is_accessible(self): 
     return current_user.is_authenticated and admin_permission.can 
    def inaccessible_callback(self, name, **kwargs): 
     return redirect(url_for('main.index', next=request.url)) 

class CustomFileView(FileAdmin): 

    allowed_extensions = (
     'txt', 
     'md', 
     'js', 
     'css', 
     'html', 
     'jpg', 
     'gif', 
     'png' 
    ) 

    editable_extensions = ('md','html','js','css','txt') 

    def is_accessible(self): 
     return current_user.is_authenticated and admin_permission.can 

class UserView(CustomModelView): 
    column_list = ('username', 'confirmed','joined') 

    column_searchable_list = ('username', 'id') 
    column_filters = ('joined', 'email', 'username') 

    path = os.path.abspath(
     os.path.join(
      os.path.dirname(__file__), 
      os.pardir 
     ) 
    ) 

    form_extra_fields = { 
     "image": FileField('Image') 
    } 

    def on_model_change(self, form, model, is_created): 
     path = os.path.abspath(
      os.path.join(
       os.path.dirname(__file__), 
       os.pardir 
      ) 
     ) 

     image_path = os.path.join(path, 'static', 'images') 
     photo_data = request.files.get(form.image.name) 

     if photo_data: 
      name = secure_filename(photo_data.filename) 
      model.image = '/static/images/' + name 
      photo_data.save(os.path.join(image_path, name)) 

К таким образом, все мои другие виды скрыты, но я до сих пор доступ к странице администратора, пожалуйста, как предотвратить неавторизованный пользователь даже от доступа к администратора.

+0

Это мне не ясно, после прочтения кода здесь и ваш комментарий на @ MrLeeh отвечают, включена ли ваша попытка использовать этот код в '@expose («/»)'. Ваш код не включает его. Если вы не украшаете свой индексный метод, я предполагаю, что метод index из родительского класса (flask_admin.AdminIndexView.index) по-прежнему служит вашей конечной точке '/ admin /'. – abathur

+0

код обновлен! – reznov11

+1

Учитывая, что в приведенном выше коде используется '@expose ('/ admin /')', до сих пор неясно, пытаетесь ли вы использовать '@expose ('/')'? Flask-admin уже добавляет '/ admin /' к этим конечным точкам, поэтому я думаю, что ваш декоратор выше будет обслуживать '/ admin/admin /'. – abathur

ответ

0

Обращайтесь к вашей проверке подлинности в своей функции index и сделайте перенаправление, если не аутентифицированы.

@expose('/') 
def index(self): 
    if not current_user.is_authenticated: 
     return redirect(url_for('main.index')) 
    return self.render('admin/home.html') 
+0

Я пробовал свой код, но без val, он все еще доступен, я предоставил ** admin.py ** код, чтобы он стал более понятным. – reznov11

+0

Как сказал @abathur: вам нужно использовать '@expose ('/')', а не '@expose ('/ admin /')' для этого. – MrLeeh