2016-12-18 23 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

それはそのコードを使用するように試みは '@expose(「/」)'を含めるかどうか、ここにあなたのコードを読んだ後、私にははっきりしていないと、@ MrLeehの答えにあなたのコメント。上記のコードには含まれていません。インデックスメソッドをデコレートしていない場合は、親クラス(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( '/ admin /')'ではなく '@expose( '/')'を使う必要があります。 – MrLeeh

関連する問題