网站首页 > 博客文章 正文
在 Python 中实现用户鉴权,可以根据不同的应用场景选择适合的技术方案。以下是几种常见的方法,涵盖从简单的用户验证到复杂的基于 JWT 和 OAuth 的方案。
1.使用 Flask-Login 实现用户鉴权
Flask-Login 是一个用于处理用户登录、会话和权限控制的 Flask 扩展,适合 Web 应用。
步骤
- 安装 Flask-Login:
pip install flask-login
- 示例代码:
from flask import Flask, redirect, url_for, render_template
from flask_login import LoginManager, UserMixin, login_user, login_required, logout_user, current_user
app = Flask(__name__)
app.secret_key = 'your_secret_key'
login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = 'login'
# 用户模型
class User(UserMixin):
def __init__(self, id):
self.id = id
# 用户加载回调
@login_manager.user_loader
def load_user(user_id):
return User(user_id)
@app.route('/login')
def login():
user = User(id=1) # 假设用户 ID 为 1
login_user(user)
return redirect(url_for('dashboard'))
@app.route('/dashboard')
@login_required
def dashboard():
return f'Hello, {current_user.id}!'
@app.route('/logout')
@login_required
def logout():
logout_user()
return redirect(url_for('login'))
if __name__ == "__main__":
app.run(debug=True)
- 说明:
- login_user() 登录用户。
- @login_required 确保特定路由只有登录用户才能访问。
- 用户可以通过 session 管理登录状态。
2.基于 JWT 实现用户鉴权
JWT(JSON Web Token)是一种常用于无状态用户鉴权的方式,特别适合 API 和分布式系统中使用。常用库 Flask-JWT-Extended 可以帮助快速实现这一功能。
步骤
- 安装 Flask-JWT-Extended:
pip install flask-jwt-extended
- 示例代码:
from flask import Flask, jsonify, request
from flask_jwt_extended import JWTManager, create_access_token, jwt_required, get_jwt_identity
app = Flask(__name__)
app.config['JWT_SECRET_KEY'] = 'your_jwt_secret_key'
jwt = JWTManager(app)
@app.route('/login', methods=['POST'])
def login():
username = request.json.get('username')
password = request.json.get('password')
# 假设用户名和密码的验证逻辑
if username == 'test' and password == 'password':
access_token = create_access_token(identity=username)
return jsonify(access_token=access_token)
return jsonify({"msg": "Bad credentials"}), 401
@app.route('/protected', methods=['GET'])
@jwt_required()
def protected():
current_user = get_jwt_identity()
return jsonify(logged_in_as=current_user), 200
if __name__ == "__main__":
app.run(debug=True)
- 说明:
- create_access_token() 用于生成 JWT。
- @jwt_required() 确保访问此路由时,客户端提供有效的 JWT。
3.使用 Django 实现用户鉴权
在 Django 中,用户鉴权是内置的功能,Django Authentication 框架提供了便捷的方式处理用户登录和权限管理。
步骤
- Django 内置用户系统:
- Django 内置了用户模型和鉴权系统,可以直接使用。
- 使用 auth 模块的 authenticate() 和 login() 函数来验证用户身份并管理会话。
- 示例代码:
from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.decorators import login_required
def user_login(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
user = authenticate(request, username=username, password=password)
if user is not None:
login(request, user)
return redirect('dashboard')
else:
return render(request, 'login.html', {'error': 'Invalid login'})
return render(request, 'login.html')
@login_required
def dashboard(request):
return render(request, 'dashboard.html', {'user': request.user})
def user_logout(request):
logout(request)
return redirect('login')
- 说明:
- authenticate() 验证用户的用户名和密码。
- login() 将用户标记为已登录状态,并在会话中保存。
- @login_required 确保用户必须登录后才能访问特定视图。
4.OAuth 2.0 与 OpenID Connect
如果你需要第三方登录(如 Google、Facebook),可以使用 OAuth 2.0 和 OpenID Connect 协议。
使用 Authlib 库实现 OAuth 2.0
Authlib 是一个支持 OAuth 和 OpenID Connect 的库,能够集成第三方登录。
- 安装 Authlib:
pip install authlib
- 使用示例:
from flask import Flask, redirect, url_for, session
from authlib.integrations.flask_client import OAuth
app = Flask(__name__)
app.secret_key = 'your_secret_key'
oauth = OAuth(app)
google = oauth.register(
name='google',
client_id='your_client_id',
client_secret='your_client_secret',
access_token_url='https://accounts.google.com/o/oauth2/token',
authorize_url='https://accounts.google.com/o/oauth2/auth',
client_kwargs={'scope': 'openid profile email'},
)
@app.route('/')
def index():
return 'Welcome to OAuth 2.0 with Google'
@app.route('/login')
def login():
return google.authorize_redirect(redirect_uri=url_for('authorize', _external=True))
@app.route('/authorize')
def authorize():
token = google.authorize_access_token()
user_info = google.get('userinfo').json()
session['user'] = user_info
return f"Hello, {user_info['name']}"
if __name__ == '__main__':
app.run(debug=True)
- 说明:
- Authlib 帮助处理 OAuth 流程,允许用户通过 Google 登录。
- 用户登录后,google.get('userinfo') 获取用户信息。
5.手动管理用户鉴权
如果你想完全手动实现用户鉴权,可以通过 session、cookies 或 token 来存储和验证用户身份。以下是基于 session 的简单实现:
示例代码
from flask import Flask, session, redirect, url_for, request
app = Flask(__name__)
app.secret_key = 'your_secret_key'
@app.route('/login', methods=['POST', 'GET'])
def login():
if request.method == 'POST':
session['username'] = request.form['username']
return redirect(url_for('dashboard'))
return '''
<form method="post">
Username: <input type="text" name="username">
<input type="submit">
</form>
'''
@app.route('/dashboard')
def dashboard():
if 'username' not in session:
return redirect(url_for('login'))
return f'Hello, {session["username"]}!'
@app.route('/logout')
def logout():
session.pop('username', None)
return redirect(url_for('login'))
if __name__ == '__main__':
app.run(debug=True)
总结
- 简单的用户登录和会话管理:可以使用 Flask-Login 或 Django 自带的鉴权系统。
- API 的鉴权:推荐使用基于 JWT 的方案,如 Flask-JWT-Extended。
- 第三方登录集成:可以使用 OAuth 2.0 协议,通过库如 Authlib 来实现。
每天坚持学习一点点,不求有回报,只愿可以丰富自己!!!
猜你喜欢
- 2024-09-10 BI工具superset管理端的单点登录集成
- 2024-09-10 深圳社会志愿者服务管理平台的设计与实现技术方案
- 2024-09-10 web鉴权access_token、AK/SK、session/cookie
- 2024-09-10 如何用Python和Google“自动化”我的婚礼?
- 2024-09-10 Celery与Django:打造高效DevOps的定时任务与异步处理神器
- 2024-09-10 Python面试者必看!245道经典Python面试题及答案解析,可下载
- 2024-09-10 traefik hub配置与使用(traefik 设置客户端ip)
- 2024-09-10 Python 潮流周刊#67:uv 的重磅更新(摘要)
- 2024-09-10 聊一聊我认识的Python安全(python的安全性)
- 2024-09-10 cookie、session、token区别(cookiesessiontoken区别)
你 发表评论:
欢迎- 06-23MySQL合集-mysql5.7及mysql8的一些特性
- 06-23MySQL CREATE TABLE 简单设计模板交流
- 06-23MYSQL表设计规范(mysql设计表注意事项)
- 06-23MySQL数据库入门(四)数据类型简介
- 06-23数据丢失?别慌!MySQL备份恢复攻略
- 06-23MySQL设计规范(mysql 设计)
- 06-23MySQL数据实时增量同步到Elasticsearch
- 06-23MySQL 避坑指南之隐式数据类型转换
- 最近发表
- 标签列表
-
- powershellfor (55)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)