赞
踩
Django 用户认证(Auth)组件一般用在用户的登录注册上,用于判断当前的用户是否合法,并跳转到登陆成功或失败页面。
Django 用户认证(Auth)组件需要导入 auth 模块
# 认证模块
from django.contrib import auth
# 对应数据库
from django.contrib.auth.models import User
create():创建一个普通用户,密码是明文的。
create_user():创建一个普通用户,密码是密文的。
create_superuser():创建一个超级用户,密码是密文的,要多传一个邮箱 email 参数。
Auth 权限控制,其实就是对表的增删改查。 权限添加模式:给用户直接设置权限,给组绑定权限。默认在命名规则:权限名-类名
User、Group、Permission三个模块及它们之间的关系。
Auth 的三个Model类,6张表 如下图:
django.contrib.auth.models.User
django.contrib.auth.models.Group
django.contrib.auth.models.Permission
auth模块是Django提供的标准权限管理系统,可以提供用户身份认证, 用户组和权限管理。
auth可以和admin模块配合使用, 快速建立网站的管理系统。
在INSTALLED_APPS中添加’django.contrib.auth’使用该APP, auth模块默认启用。
Django用user, group和permission完成了权限机制,这个权限机制是将属于model的某个permission赋予user或group,可以理解为全局的权限。
结合Django自带权限机制和object permission,博客系统中作者的权限控制迎刃而解:系统全局上不允许作者编辑文章,而对于属于作者的具体文章,赋予编辑权限即可。Django其实包含了object permission的框架,但没有具体实现,object permission的实现需要借助第三方app django-guardian,我们在开发中用调用django guradian封装好的方法即可。
auth中提供的实用方法:
# authenticate()会在该 User 对象上设置一个属性来标识后端已经认证了该用户, # 且该信息在后续的登录过程中是需要的。 user = authenticate(username='theuser',password='thepassword') # login(request,user)该函数接受一个HttpRequest对象,以及一个经过认证的 # User对象。该函数实现一个用户登录的功能。它本质上会在后端为该用户生成相关 # session数据 from django.contrib.auth import authenticate, login def my_view(request): username = request.POST['username'] password = request.POST['password'] user = authenticate(username=username, password=password) if user is not None: login(request, user) # Redirect to a success page. ... else: # Return an 'invalid login' error message. # logout(request) 该函数接受一个HttpRequest对象,无返回值。当调用该函数 # 时,当前请求的session信息会全部清除。该用户即使没有登录,使用该函数也不 # 会报错。 from django.contrib.auth import logout def logout_view(request): logout(request) # Redirect to a success page. # is_authenticated()用来判断当前请求是否通过了认证 def my_view(request): if not request.user.is_authenticated(): return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path)) # login_requierd()auth 给我们提供的一个装饰器工具,用来快捷的给某个FBV # 视图添加登录校验。 from django.contrib.auth.decorators import login_required @login_required def my_view(request): ...
从某个页面跳转后的登录页面的url就成了:http://127.0.0.1:8000/login/?next=/page1/
def login(request): if request.method == "POST": user = request.POST.get("user") pwd = request.POST.get("pwd") # if 验证成功返回user对象,否则返回None user=auth.authenticate(username=user,password=pwd) if user: auth.login(request,user) # request.user:当前登录对象 next_url=request.GET.get("next","/index/") return redirect(next_url) return render(request,"login.html"
from django.contrib.auth.models import AbstractUser
class UserInfo(AbstractUser):
"""
用户信息表
"""
nid = models.AutoField(primary_key=True)
phone = models.CharField(max_length=11, null=True, unique=True)
def __str__(self):
return self.username
注意:按上面的方式扩展了内置的auth_user表之后,一定要在settings.py中告诉Django,我现在使用我新定义的UserInfo表来做用户认证。写法如下:
AUTH_USER_MODEL = "app名.UserInfo"
或直接修改源码
model.py admin.py
department = models.CharField(_('部门'), max_length=150, blank=True)
Django的auth系统提供了模型级的权限控制, 即可以检查用户是否对某个数据表拥有增(add), 改(change), 删(delete)权限。
auth系统无法提供对象级的权限控制, 即检查用户是否对数据表中某条记录拥有增改删的权限。如果需要对象级权限控制可以使用django-guardian.
假设在博客系统中有一张article数据表管理博文, auth可以检查某个用户是否拥有对所有博文的管理权限, 但无法检查用户对某一篇博文是否拥有管理权限。
添加用户额外权限
# Create your models here.
class Device_Hl(models.Model):
device_id = models.CharField(verbose_name="设备标识", max_length=20)
device_name = models.CharField(verbose_name="设备名称", max_length=50)
device_ip = models.CharField(verbose_name="设备ip", max_length=20)
mask = models.CharField(verbose_name="子网掩码", max_length=20)
gate = models.CharField(verbose_name="网关", max_length=20)
device_top = models.CharField(verbose_name="上联设备", max_length=50)
region_name = models.CharField(verbose_name="地区", max_length=50)
remark = models.+(verbose_name="备注", max_length=50)
class Meta:
verbose_name = '交换机'
verbose_name_plural = '交换机'
permissions = [('codename', 'name')]
自定义权限,在定义Model时可以使用Meta自定义权限:
class Discussion(models.Model):
...
class Meta:
permissions = (
("create_discussion", "Can create a discussion"),
("reply_discussion", "Can reply discussion"),
)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。