使用蓝图与应用工厂时Flask-Admin鉴权失效问题排查
问题原因
鉴权不生效的核心问题是:你虽然编写了带权限判断的自定义AdminView类,但实际向admin实例注册模型视图时,用的还是原生不带鉴权逻辑的ModelView,自定义代码完全没有被挂载到运行的路由上。这个问题和类放在create_app()内外、蓝图机制没有直接关系。
修复步骤
1. 正确定义权限视图类
将自定义视图类放在__init__.py的全局区域(和db、login_manager等扩展实例同层级,不要写在create_app()函数内部避免循环导入),同时修正你之前写错的登录路由地址:
# 补充需要的导入 from flask import redirect, url_for, request from flask_admin import AdminIndexView from flask_admin.contrib.sqla import ModelView from flask_login import current_user # 通用模型管理页鉴权类 class AdminView(ModelView): def is_accessible(self): # 后续增加管理员判断直接在这里扩展即可,示例: # return current_user.is_authenticated and current_user.admin return current_user.is_authenticated def inaccessible_callback(self, name, **kwargs): # 你的登录路由属于users蓝图,必须加蓝图前缀,否则会报路由不存在错误 return redirect(url_for('users.login', next=request.url)) # 给/admin首页单独加鉴权,默认首页不会走模型视图的权限逻辑 class ProtectedAdminIndex(AdminIndexView): def is_accessible(self): return current_user.is_authenticated def inaccessible_callback(self, name, **kwargs): return redirect(url_for('users.login', next=request.url))
2. 修正Admin实例初始化配置
修改create_app()中初始化Admin的代码,绑定自定义的首页视图:
admin = Admin( app, name='SIMS Admin Portal', template_mode='bootstrap4', endpoint='admin', index_view=ProtectedAdminIndex() )
3. 替换模型视图注册的类
找到注册模型管理页的代码,把所有原生ModelView替换为你自定义的AdminView:
from SIMS_Portal.models import User, Assignment, Emergency, Portfolio, NationalSociety admin.add_view(AdminView(User, db.session)) admin.add_view(AdminView(Assignment, db.session)) admin.add_view(AdminView(Emergency, db.session)) admin.add_view(AdminView(Portfolio, db.session)) admin.add_view(AdminView(NationalSociety, db.session))
修改完成后重启应用,未登录状态访问/admin以及所有模型管理页都会自动跳转到登录页。后续要加管理员权限校验,只需要修改两个视图类中is_accessible方法的返回值,加上current_user.admin的判断即可。
内容的提问来源于stack exchange,提问作者MightyModest
相关产品推荐
相关产品推荐

