2016-12-18 8 views
1

Ich möchte verhindern, dass die Benutzer auf die Admin-URL zugreifen, ich habe bereits die Ansichten gesichert, aber /admin/ ist immer noch zugänglich.Wie kann verhindert werden, dass Benutzer auf die Admin-Seite zugreifen?

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

Auf diese Weise, alle meine anderen Ansichten versteckt sind, aber ich immer noch die Admin-Seite zugreifen, bitte, wie nicht authentifizierte Benutzer verhindern, sogar die Admin-Zugriff.

+0

Es ist mir nicht klar, nachdem Sie Ihren Code hier und Ihren Kommentar zu @ MrLeehs Antwort gelesen haben, ob Ihr Versuch, diesen Code zu verwenden, das '@expose ('/')' enthielt. Ihr oben angegebener Code enthält es nicht. Wenn Sie Ihre Indexmethode nicht dekorieren, gehe ich davon aus, dass die Indexmethode der übergeordneten Klasse (flask_admin.AdminIndexView.index) immer noch Ihren '/ admin /' Endpunkt liefert. – abathur

+0

Code wurde aktualisiert! – reznov11

+1

Da der obige Code '@expose ('/ admin /')' verwendet, ist es immer noch nicht klar, ob Sie '@expose ('/')' '' '? Flask-admin setzt die '/ admin /' bereits diesen Endpunkten vor, daher würde ich meinen Decorator oben mit '/ admin/admin /' versehen. – abathur

Antwort

0

Behandeln Sie Ihre Prüfung zur Authentifizierung in Ihrer index Funktion und machen Sie eine Weiterleitung, wenn nicht authentifiziert.

+0

Ich habe versucht, Ihren Code, aber ohne ein val, es immer noch zugänglich, ich werde den ** admin.py ** Code zur Verfügung stellen, damit es klarer wird. – reznov11

+0

Wie @abathur sagte: Sie müssen '@expose ('/')', nicht '@expose ('/ admin /') verwenden, damit dies funktioniert. – MrLeeh

Verwandte Themen