请原谅我的天真,但我一直在研究 Flask 中角色身份验证的各种解决方案,似乎有几个扩展不再维护。这让我想知道除了 Flask Login 之外我是否还需要其中任何一个来实现我的目的。
在我的路线和模板中使用
if current_user.is_admin
来区分管理员和其他用户是否足够?如果是这样,与使用“Flask Security Too”之类的方法相比,这种方法是否存在任何安全问题或其他缺点需要考虑?我意识到这种方法会变得非常重复 - 我可以创建一个装饰器来执行此检查吗?我还没有掌握装饰器。
路线.py
@app.route('/students', methods=['GET', 'POST'])
@login_required
def students():
form = StudentForm()
if current_user.is_admin:
if form.validate_on_submit():
student = Student(student_name=form.student_name.data, last_name=form.last_name.data, \
student_email=form.student_email.data, parent_name=form.parent_name.data, \
parent_email=form.parent_email.data, secondary_email=form.secondary_email.data, \
timezone=form.timezone.data, location=form.location.data, status=form.status.data, \
tutor=form.tutor_id.data)
try:
db.session.add(student)
db.session.commit()
except:
db.session.rollback()
flash(student.student_name + ' could not be added', 'error')
return redirect(url_for('students'))
flash(student.student_name + ' added')
return redirect(url_for('students'))
return render_template('students.html', title="Students", form=form)
else:
flash('You must have administrator privileges to access this page.', 'error')
logout_user()
return redirect(url_for('login'))
模型.py
class User(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key=True)
...
is_admin = db.Column(db.Boolean)
admin_required
装饰器:
def admin_required(f):
@login_required
@wraps(f)
def wrap(*args, **kwargs):
if current_user.is_admin:
return f(*args, **kwargs)
else:
flash('You must have administrator privileges to access this page.', 'error')
logout_user()
return redirect(login_url('login', next_url=request.url))
return wrap
请注意,在登录视图中验证
next_url
以避免网络钓鱼重定向非常重要:
@app.route('/login', methods=['GET', 'POST'])
def login():
form = LoginForm()
if form.validate_on_submit():
...
next = request.args.get('next')
if not next or url_parse(next).netloc != '':
next = url_for('default_redirect')
return redirect(next)
return render_template('login.html', title="Login", form=form)