Flask + MongoDB后台管理员授权功能
需求分析
- 实现后台不同角色的管理员授予不同的权限
- 超级管理员可以管理其他普通管理员的权限
数据库设计
> db.admin.find().limit(1).pretty()
{
"_id" : ObjectId("6054969580a74192995fa045"),
"email" : "caisi1735@163.com",
"is_effective" : 1,
"sign_count" : 0,
"password" : "pbkdf2:sha256:150000$iMLTwJbS$2eb5b6aea5a2943cfba0d8c2623702ec710d58d28df028bb18bab7bbb86a0183",
"last_signIn_time" : 1616227252,
"create_time" : 1616156309,
"auth" : [
"order_admin",
"book_admin",
"user_admin",
"admin"
]
}
使用auth
数组存储管理员的权限信息
装饰器模块
def admin_login_required(view):
@functools.wraps(view)
def wrapped_view(**kwargs):
if session.get('admin_id') is None:
return redirect(url_for('signIn.admin_login'))
return view(**kwargs)
return wrapped_view
def admin_auth(auth_list=list, *args, **kwargs):
"""权限管理装饰器"""
def admin_auth_m(func):
@functools.wraps(func)
def wrapped_view(*args, **kwargs):
if session.get('admin_id') is None:
return redirect(url_for('signIn.admin_login'))
else:
if not set(auth_list) & set(session.get('auth')):
flash('此菜单 [{}] 您没有权限访问!'.format(request.path))
return redirect(request.referrer)
return func(*args, **kwargs)
return wrapped_view
return admin_auth_m
这里使用第二个带参数的装饰器admin_auth
,第一个只是登录功能的装饰器。
在这里传入一个列表,与管理员登录成功后保存到session中的auth
,都转换为集合set
,再进行交集运算,以判断是否有权限。
- 登录成功后保存的管理员信息,如下
使用装饰器装饰路由函数
@bp.route('/', methods=('GET', 'POST'))
@admin_auth(['user_admin'])
def userAdmin():
"""加载用户管理页"""
page = request.args.get('page', 1, int)
page_size = 20
page_view = 5
try:
users, total = get_users_total(page, page_size)
except Exception as e:
logging.exception('admin userAdmin [Exception]: %s', e)
return abort(404) + str(e)
return render_template('admin/userAdmin.html',
page_active="userAdmin",
users=users,
active_page=page,
total=total,
page_size=page_size,
page_count=page_view,
)
这里是用户管理模块,授权给管理用户的后台管理员进行管理。