跳转到内容

Python 认证授权

来自代码酷

Python认证授权[编辑 | 编辑源代码]

认证授权(Authentication and Authorization)是Web开发中保障系统安全的两个核心机制。认证(Authentication)用于验证用户身份(如用户名/密码),而授权(Authorization)则控制用户访问资源的权限。Python生态提供了多种工具实现这些功能。

核心概念[编辑 | 编辑源代码]

认证(Authentication)[编辑 | 编辑源代码]

确认用户身份的过程,常见方式包括:

  • 用户名/密码
  • OAuth(第三方登录)
  • JWT(JSON Web Tokens)

授权(Authorization)[编辑 | 编辑源代码]

定义已认证用户的操作权限,通常通过:

  • 角色(如管理员、普通用户)
  • 权限标签(如"read:data"、"write:data")

graph LR A[用户请求] --> B{认证?} B -->|是| C[检查权限] B -->|否| D[返回401错误] C -->|有权限| E[返回资源] C -->|无权限| F[返回403错误]

实现方式[编辑 | 编辑源代码]

Flask示例[编辑 | 编辑源代码]

使用Flask-HTTPAuth和Flask-JWT扩展:

from flask import Flask
from flask_httpauth import HTTPBasicAuth
from werkzeug.security import generate_password_hash, check_password_hash

app = Flask(__name__)
auth = HTTPBasicAuth()

users = {
    "admin": generate_password_hash("secret"),
    "guest": generate_password_hash("123456")
}

@auth.verify_password
def verify_password(username, password):
    if username in users and check_password_hash(users[username], password):
        return username

@app.route('/')
@auth.login_required
def index():
    return f"Hello, {auth.current_user()}!"

if __name__ == '__main__':
    app.run()

输入/输出示例

GET / → 401 Unauthorized
GET / -u admin:secret → 200 OK "Hello, admin!"

Django示例[编辑 | 编辑源代码]

Django内置认证系统:

from django.contrib.auth.decorators import login_required, permission_required

@login_required
@permission_required('polls.view_question')
def detail(request, question_id):
    return HttpResponse("You're viewing question %s." % question_id)

高级主题[编辑 | 编辑源代码]

JWT实现[编辑 | 编辑源代码]

JSON Web Tokens的Python实现:

import jwt
from datetime import datetime, timedelta

secret_key = "your-secret-key"

# 生成Token
token = jwt.encode({
    'user_id': 123,
    'exp': datetime.utcnow() + timedelta(minutes=30)
}, secret_key, algorithm='HS256')

# 验证Token
try:
    data = jwt.decode(token, secret_key, algorithms=['HS256'])
except jwt.ExpiredSignatureError:
    print("Token已过期")

权限模型[编辑 | 编辑源代码]

常见权限控制模型:

  • ACL(访问控制列表)
  • RBAC(基于角色的访问控制)
  • ABAC(基于属性的访问控制)

pie title 权限模型使用比例 "RBAC" : 65 "ABAC" : 25 "ACL" : 10

安全最佳实践[编辑 | 编辑源代码]

1. 始终使用HTTPS 2. 密码必须加盐哈希存储(如bcrypt) 3. 实施CSRF保护 4. 设置合理的Token过期时间 5. 遵循最小权限原则

数学上,密码哈希可以表示为: H(s+p)=h 其中:

  • s = 盐值
  • p = 密码
  • h = 哈希值

实际案例[编辑 | 编辑源代码]

电商网站权限设计: 1. 匿名用户:浏览商品 2. 注册用户:下单/评论 3. 客服人员:处理退货 4. 管理员:管理所有内容

通过Python装饰器实现:

def customer_required(f):
    @wraps(f)
    def decorated(*args, **kwargs):
        if not current_user.is_customer:
            abort(403)
        return f(*args, **kwargs)
    return decorated

常见漏洞与防护[编辑 | 编辑源代码]

漏洞类型 防护措施
会话固定 登录后更新Session ID
SQL注入 使用ORM或参数化查询
XSS攻击 输入过滤/输出编码
暴力破解 登录限速/验证码

总结[编辑 | 编辑源代码]

Python认证授权系统需要:

  • 正确选择认证协议(Basic/OAuth/JWT)
  • 合理设计权限模型
  • 实施纵深防御策略
  • 定期进行安全审计

随着Web应用复杂度增加,建议使用专业库如:

  • Authlib(OAuth)
  • Django Guardian(对象级权限)
  • PyCasbin(通用权限框架)