markdown
# Python 中间件实现页面按钮权限控制方案
## 一、实现思路
通过中间件拦截请求,结合会话机制实现以下功能:
1. 已登录用户隐藏注册/登录按钮
2. 未登录用户展示注册/登录按钮
3. 根据用户状态自动跳转对应页面
## 二、具体实现(以Flask为例)
### 1. 创建中间件类
python
class AuthMiddleware:
def __init__(self, app):
self.app = app
self.excluded_paths = ['/register', '/login', '/static']
def __call__(self, environ, start_response):
path = environ.get('PATH_INFO', '')
# 跳过静态资源和认证相关路由
if any(path.startswith(p) for p in self.excluded_paths):
return self.app(environ, start_response)
# 检查会话中的登录状态
with self.app.request_context(environ):
session = environ.get('beaker.session')
if not session.get('logged_in'):
# 未登录重定向到登录页
redirect_response = redirect('/login')
return redirect_response(environ, start_response)
return self.app(environ, start_response)
### 2. 初始化中间件
python
from flask import Flask
from beaker.middleware import SessionMiddleware
app = Flask(__name__)
app.wsgi_app = AuthMiddleware(app.wsgi_app)
# 配置会话中间件
session_opts = {
'session.type': 'file',
'session.data_dir': './session',
'session.auto': True
}
app.wsgi_app = SessionMiddleware(app.wsgi_app, session_opts)
### 3. 模板控制逻辑(Jinja2示例)
html
## 三、关键配置说明
1. **中间件拦截策略**:
- 排除静态资源和认证相关路由
- 使用会话机制保持登录状态
- 自动重定向未授权请求
2. **会话管理**:
- 使用Beaker会话中间件
- 文件存储式会话(生产环境建议使用Redis)
- 自动维护会话有效期
3. **前端集成**:
- 通过模板变量控制元素显示
- 动态切换导航栏状态
- 支持多角色扩展(可添加`user.role`判断)
## 四、扩展建议
1. 添加CSRF保护中间件
2. 实现基于角色的访问控制(RBAC)
3. 集成JWT认证支持API访问
4. 添加访问频率限制中间件
5. 实现审计日志记录功能
> 注意:Django框架可使用`process_request`中间件实现类似功能,核心逻辑与Flask方案一致,主要差异在框架特定API的使用上。