Django auth 用户认证系统
jianjian
这个人没写简介

在 Python Web 框架众多,其中 Django、Flask、Tornado 使用最为广泛。Django 的特点是大而全,包含模板、ORM、用户认证、缓存等功能,Web 开发中常用的模块应有尽有;Flask 的特点是小,容易上手而且插件多;Tornado 的特点是支持异步非阻塞IO,并发性能好,内置 Web server 可以直接部署,相比之下 Django 和 Flask 需要使用 uwsgi 或者 gunicron 来部署。究竟选用哪个框架,应该根据项目选择,如果是大项目推荐使用 Django,能够节省大量时间。这篇文章着重介绍 Django 核心特性之一的用户认证模块。

Django 的认证模块提供了用户、权限、分组、密码管理、会话管理、登录、登出、多语言等相对全面的功能,而且可以轻易根据需要扩展。


启用认证系统

使用 Django 创建项目时,会自动启用认证模块。

INSTALLED_APPS 中有两个相关应用:django.contrib.auth (包含认证所需要的核心内容),django.contrib.contenttypes (记录每个模块使用的 model ,并且能动态的访问model类型,Django 的另一高级特性)。创建项目之后需要创建这两个应用中的 model。

MIDDLEWARE 中有两个中间件:SessionMiddleware(管理会话)AuthenticationMiddleware (管理认证)。中间件的顺序很重要,认证依赖会话,SessionMiddleware 在前,AuthenticationMiddleware 在后。


用户

默认状态下,用户表是 django.contrib.auth.models.User,包括用户名、密码、邮箱、状态等字段。可以看到 User 类是继承自 AbstractUser ,这个类很重要,继承这个类可以扩展用户表的字段。AnonymousUser 特指匿名用户,不能进行任用用户操作。

  • Username 和 password 是必填字段而且username 是唯一的,登录时使用,UnicodeUsernameValidator 会检查用户名是否能用。
  • date_joined 和 last_login 是自动创建的,(默认值是 timezone.now,不是 datetime.now,要注意这两点的区别。 )当用户登录时,last_login 会自动更新。
  • 常用的用户登录,设置密码、检查密码、删除密码、发送邮件给用户(需要在配置中设置 SMTP 信息)等功能都能直接使用;

用户密码加密方法有 PBKDF2PasswordHasher、PBKDF2SHA1PasswordHasher、Argon2PasswordHasher、BCryptSHA256PasswordHasher。默认使用 PBKDF2PasswordHasher 来加密,支持四种方式来解密(如果密码是已经存在,而且加密方式不是 PNBKDF2)。更改配置 PASSWORD_HASHERS 中的顺序就能改变默认加密方式 。这四种常见的加密方式各有优点,其中 PNBKDF2 是计算力要求最大的方式。默认支持的加密方式都在django.contrib.auth.hashers,通过继承 BasePasswordHasher 也可以实现自己的加密方式。 另外,不推荐使用加 salt 之后直接计算哈希值的方式来存储密码。

密码验证器(AUTH_PASSWORD_VALIDATORS)是用来验证新密码的规则列表,在设置密码之前应该调用 validate_password 来检测密码,以防止使用简单密码。

User 表新增字段。只需要创建一个继承 AbstractUser 的 user model,并且在 配置文件中设置 AUTH_USER_MODEL = 'user.User' 就可以了。

如果需要自定义登录验证,可以配置 AUTHENTICATION_BACKENDS ,设置自定义的登录验证方式。默认是 django.contrib.auth.backends.ModelBackend 。


在 web 请求中操作用户信息

默认可以使用 request.user.is_authenticated 判断当前用户是否已经登录。

对于需要登录才能继续的 view 可以添加装饰器 login_required,或者继承 LoginRequiredMixin 强制用户登录。

登录 view 中,需要调用 authenticate,验证用户密码,如果成功则返回登录的用户,然后调用 login ,保存用户登录的 session,下次用户操作 request.user.is_authenticated 自动为 True。默认用户 session 是保存在 MySQL 中的,由于 session 的读取比较频繁而且 session 信息较为独立,设置 SESSION_ENGINE 可以指定管理 session 的工具,推荐使用 Redis 保存 session 信息。

用户退出,调用 logout 清除 session 信息。

如果没有特殊的要求,可以添加 path('accounts/', include('django.contrib.auth.urls')) 直接使用 django.contrib.auth 模块。只需要按照要求发送数据就可以了。


权限

Django 的权限系统涉及到 Permission、Group、User 三个 model。用户和权限,用户和组,权限和组都是多对多关系。对应的表名称分别是 auth_permission(权限)、auth_group(组)、auth_user(用户)、auth_group_permissions(组和权限关系表)、auth_user_groups(用户和权限关系表)、auth_user_permissions(用户和权限关系表)。

auth_permission 表中,根据创建的 model,Django 默认为每一个 model 提供了增删改查的权限,比如 User 对应的权限就是add_user、change_user、delete_user、view_user。另外,用户可以自定义权限的名称。

用户可以加入组,拥有分配给组的权限,也可以添加用户独有的权限(不经过组,直接拥有权限)。

可以通过 permission_required 或者继承 PermissionRequiredMixin 强制只有权限的用户才能继续。在 view 内,也可以调用 user.has_perm 检查用户是否有权限。



发布于 05月05日
chat 0 条评论 book mark 收藏 three dots