Python中Flask如何实现多用户验证问题
如题:现有一个 Company 用户与一个 User 用户表, 如果登录 User 的话,能访问到 Company 的某些页面, 现在想加个 permission_require 裝式器,传两个参数,c and u 代码如下:
def permissions_required(user,company):
def decorator(f):
@wraps(f)
def decorated_function(*args,**kwargs):
if current_user.role.name == 'User':
if not current_user.can(user):
return jsonify(code=-10, msg='没有权限', data={})
elif current_user.role.name == 'Company':
if not current_user.can(company):
return jsonify(code=-10, msg='没有权限', data={})
return f(*args,**kwargs)
return decorated_function
return decorator
现存问题: 判断第一个为 Flase 后直接 return 了 不 Return 的话,又越权了。 有没有人解决过相关的问题?
Python中Flask如何实现多用户验证问题
这个用 else 不行?或者 if a=b and c=d:
这样不行?
在Flask中实现多用户验证,核心是使用Flask-Login扩展来管理用户会话,并结合数据库来区分不同用户角色(如普通用户、管理员)。下面是一个完整示例:
首先安装必要依赖:
pip install flask flask-login flask-sqlalchemy
然后创建应用文件 app.py:
from flask import Flask, render_template, redirect, url_for, request
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager, UserMixin, login_user, logout_user, login_required, current_user
from werkzeug.security import generate_password_hash, check_password_hash
app = Flask(__name__)
app.config['SECRET_KEY'] = 'your-secret-key-here'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db'
db = SQLAlchemy(app)
login_manager = LoginManager(app)
login_manager.login_view = 'login'
# 用户模型
class User(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
password_hash = db.Column(db.String(200), nullable=False)
role = db.Column(db.String(20), default='user') # 用户角色字段
def set_password(self, password):
self.password_hash = generate_password_hash(password)
def check_password(self, password):
return check_password_hash(self.password_hash, password)
@login_manager.user_loader
def load_user(user_id):
return User.query.get(int(user_id))
# 注册路由
@app.route('/register', methods=['GET', 'POST'])
def register():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
role = request.form.get('role', 'user')
if User.query.filter_by(username=username).first():
return '用户名已存在'
user = User(username=username, role=role)
user.set_password(password)
db.session.add(user)
db.session.commit()
return redirect(url_for('login'))
return render_template('register.html')
# 登录路由
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
user = User.query.filter_by(username=username).first()
if user and user.check_password(password):
login_user(user)
return redirect(url_for('dashboard'))
return '登录失败'
return render_template('login.html')
# 需要登录的页面
@app.route('/dashboard')
@login_required
def dashboard():
return f'欢迎 {current_user.username},你的角色是:{current_user.role}'
# 管理员页面示例
@app.route('/admin')
@login_required
def admin_page():
if current_user.role != 'admin':
return '需要管理员权限'
return '管理员页面'
@app.route('/logout')
@login_required
def logout():
logout_user()
return redirect(url_for('login'))
if __name__ == '__main__':
with app.app_context():
db.create_all()
app.run(debug=True)
需要创建两个简单的HTML模板:
templates/register.html:
<form method="POST">
<input type="text" name="username" placeholder="用户名" required>
<input type="password" name="password" placeholder="密码" required>
<select name="role">
<option value="user">普通用户</option>
<option value="admin">管理员</option>
</select>
<button type="submit">注册</button>
</form>
templates/login.html:
<form method="POST">
<input type="text" name="username" placeholder="用户名" required>
<input type="password" name="password" placeholder="密码" required>
<button type="submit">登录</button>
</form>
这个方案通过role字段区分用户类型,@login_required装饰器保护需要登录的路由,current_user对象在视图函数中提供当前用户信息。对于更复杂的权限控制,可以考虑使用Flask-Principal扩展。
总结:用Flask-Login做会话管理,数据库存用户角色,装饰器控制访问权限。
不行,if 进去判断 false 直接 return 了,不 return 的话,又越权了
为啥这个不是白名单机制,现在这个更像是黑名单,但是又不太懂你的设置规则
要更清晰应该是这样吧python<br>if <a target="_blank" href="http://current_user.role.name" rel="nofollow noopener">current_user.role.name</a> == 'User' and current_user.can(user):<br> return f(*args, **kwargs)<br>if <a target="_blank" href="http://current_user.role.name" rel="nofollow noopener">current_user.role.name</a> == 'Company' and current_user.can(company):<br> return f**args, **kwargs)<br>return jsonify(code=-10, msg='没有权限', data={})<br>

