Blandskron/m6-l5-p1-login-logout-django
GitHub: Blandskron/m6-l5-p1-login-logout-django
一个 Django 认证与授权教学项目,通过完整的登录、注册、分组、权限和视图保护功能演示 Web 应用中的用户管理机制。
Stars: 1 | Forks: 0
# Django 的认证与授权
这是一个以简单直观的方式实现 Django Auth 模型的教学项目:包含登录、登出、注册、会话、基础权限、分组、装饰器和 mixins。
## 使用 Docker 运行
需要 Docker Desktop:
```
docker compose up --build
```
然后访问:
- 应用程序:http://localhost:8000/
- 后台管理:http://localhost:8000/admin/
- 教学用户名:`admin`
- 教学密码:`Admin12345!`
`sqlite_data` 卷用于持久化 SQLite 数据。`entrypoint.sh` 会执行数据库迁移,仅在超级用户不存在时创建它,并启动 Django。因此,安全地重启容器是没有问题的。
## 本地运行
```
python -m venv .venv
# Windows: .venv\Scripts\activate
# Linux/macOS: source .venv/bin/activate
pip install -r requirements.txt
cd loginlogout
python manage.py migrate
python manage.py runserver
```
## 什么是 Django Auth
`django.contrib.auth` 集成了用户、密码哈希处理、分组和权限功能。`AuthenticationMiddleware` 会暴露 `request.user`;session 用于在多次请求间识别用户,而 CSRF 则用于保护 POST 表单。Django 绝不会以明文形式存储密码,并且会应用在 `AUTH_PASSWORD_VALIDATORS` 中配置的验证器。
数据库迁移会创建 `auth_user`、`auth_group`、`auth_permission` 数据表、关系表、`django_content_type` 以及 `django_session`。由于不需要额外的字段,本项目使用了标准的 `User` 模型。
## 登录与登出
`/login/` 和 `/logout/` 路由使用了 `LoginView` 和 `LogoutView`。登出操作需要使用 POST 请求并附带 CSRF token。相关配置如下:
```
LOGIN_URL = "/login/"
LOGIN_REDIRECT_URL = "/dashboard/"
LOGOUT_REDIRECT_URL = "/"
```
`/registro/` 路由使用了 `UserCreationForm`,会对密码进行验证,对新用户进行认证,并将其添加到 `Lectores` 组中。
## 授权、权限与分组
认证回答的是“你是谁”;授权回答的则是“你能做什么”。在对 `RecursoEducativo` 模型进行迁移时,Django 会在 `auth_permission` 中创建基础权限:
- `view_recursoeducativo`
- `add_recursoeducativo`
- `change_recursoeducativo`
- `delete_recursoeducativo`
权限可以直接分配,也可以通过组来分配。`post_migrate` 信号会以幂等方式创建 `Lectores` 组,并为其分配 `view` 权限。你可以通过 `/permisos/` 查看已创建的权限;同时也可以在后台管理中对权限进行管理。
## 装饰器与 mixins
mixin 是一种可复用的类,用于为基于类的视图添加额外行为:
- `LoginRequiredMixin` 要求用户必须已登录,并将匿名用户重定向到登录页面(同时附带 `next` 参数)。
- `PermissionRequiredMixin` 要求用户具备一个或多个指定的权限。
`DashboardMixinView` 演示了第一种用法,而 `RecursosMixinView` 则同时结合了这两种用法。用于创建和编辑的函数视图使用了 `@permission_required` 装饰器。经过身份验证但缺乏权限的用户会看到 `403.html` 模板,而匿名用户则会被重定向到登录页面。
## 建议的演示流程
1. 注册一个账号,并检查是否能成功进入面板,以及是否属于 `Lectores` 组。
2. 打开 Recursos:通过组继承的权限允许你查看它们。
3. 尝试创建资源(Crear recurso):你会看到 403 错误,因为 `Lectores` 组没有 `add` 权限。
4. 以 `admin` 身份进入后台管理,分配权限或创建新组,然后重复上述操作。
5. 检查 `/permisos/`、`/dashboard-mixin/`,并通过 POST 请求登出。
## 测试
```
cd loginlogout
python manage.py check
python manage.py migrate
python manage.py test
```
测试覆盖了登录/登出、重定向、注册与分组、装饰器、两种 mixins 的使用、读取/创建/编辑权限,以及 403、404 错误和后台管理的访问情况。
标签:Django, Docker, Syscall, Web开发, 安全防御评估, 教学示例, 权限控制, 版权保护, 请求拦截, 逆向工具