Django用户认证系统使用总结

简介: Django用户认证系统使用总结

Django用户认证系统使用总结



 

测试环境

Win7

Django 1.11

 

 

 

 

使用Django认证系统

本文按默认配置讲解Django认证系统的用法。如果默认的认证无法满足项目,Django提供了对认证系统的扩展与定制。

Django身份验证同时提供身份验证和授权,通常称为身份验证系统,因为这些特性有些耦合。

 

用户对象

默认user对象主要属性:

  • username
  • password
  • email
  • first_name
  • last_name

 

创建用户对象

>>>fromdjango.contrib.auth.modelsimportUser

>>>user=User.objects.create_user('john', 'lennon@thebeatles.com', 'johnpassword')

 

#如上,此时用户对象已经被保存到数据库了,可以对它的属性进行修改

>>>user.last_name='Lennon'

>>>user.save()

如果已经安装了Django admin应用,可以直接创建用户

创建超级用户

使用createsuperuser 命令:

$ python manage.py createsuperuser --username=joe --email=joe@example.com

回车后,会提示输入密码,输入密码后回车,立即创建用户。如果命令行省略了--username--email 选项,则回车后还会提示输入这些选项的值。

 

修改密码

Django采用hash算法存储用户密码(参考documentation of how passwords are managed

通过命令行修改用户密码:

manage.py changepassword user_name

如果不提供user_name,则默认修改当前系统用户的密码.

 

通过api修改用户密码

>>>fromdjango.contrib.auth.modelsimportUser

>>>u=User.objects.get(username='john')

>>>u.set_password('new password')

>>>u.save()

注:这里new password为明文

如果已经安装了Django admin应用,也可以在认证系统管理页面修改用户密码

修改密码,将注销对应用户的所有会话。

 

用户认证

authenticate(request=None, **credentials)

使用authenticate()来确认一系列认证。函数携带了credentials关键词参数,默认情况为usernamepassword。如果认证通过,则返回对应的User对象,否则返回None:

fromdjango.contrib.authimportauthenticate

 

user=authenticate(username='john', password='secret')

ifuserisnotNone:

# A backend authenticated the credentials

else:

# No backend authenticated the credentials

 

 

除username,password参数之外,我们还可以添加其它条件:

例子,验证用户账号密码是否正确,同时要求被验证用户未被删除(is_delete=1),也就是说,验证用户账号密码前获取的用户数据时,自动已经被删除的用户

user=authenticate(username='john', password='secret',is_delete=1)

 

当然,除了是否删除,是否禁用等字段,其它字段一般不推荐这么做,可以在验证用户账号密码前进行其它前置条件的验证

 

注意:默认的,django会优先验证我们显示提供的参数,最后再验证is_active是否未1,如果为1,则返回None

 

权限和认证(Permissions and Authorization)

Web请求中的认证

Django为每个请求提供了 request.user属性,该属性代表当前用户。如果当前用户未登录,则该属性值将被设置为一个匿名用户AnonymousUser,否则将设置为User的一个实例。

ifrequest.user.is_authenticated:# 已登录

# Do something for authenticated users.

...

else:# 未登录

# Do something for anonymous users.

...

 

登录

login(request, user, backend=None)[source]

login函数会保存用户id到session.

注意:用户登录后,会话中依旧保留登录前的的任何匿名会话数据。

fromdjango.contrib.authimportauthenticate, login

defmy_view(request):

username=request.POST['username']

password=request.POST['password']

 

# 验证用户名和密码,返回用户对象

user=authenticate(request, username=username, password=password)

ifuserisnotNone:

login(request, user)

# do something 比如重定向到一个成功页面.

...

else:

# do something,比如返回一个登录错误消息

...

 

选择认证后端(backend)

略.

 

退出

logout(request)

 

例子:

fromdjango.contrib.authimportlogout

 

deflogout_view(request):

logout(request)

# do something 比如重定向到一个成功页面.

注意:如果用户未登录,执行logout函数并不会抛出任何异常。

调用logout函数,会清空当前请求的所有会话数据,移除所有已存在数据。

 

对登录用户的访问限制

原始方式

简单,原始的方式就是检查request.user.is_authenticated判断是否认证:

fromdjango.confimportsettings

fromdjango.shortcutsimportredirect

 

defmy_view(request):

ifnotrequest.user.is_authenticated:

returnredirect('%s?next=%s'% (settings.LOGIN_URL, request.path))

# ...

或者:

fromdjango.shortcutsimportrender

 

defmy_view(request):

ifnotrequest.user.is_authenticated:

returnrender(request, 'myapp/login_error.html')

# ...

 

login_required装饰器

login_required(redirect_field_name='next', login_url=None)

作为快捷方式,可以使用login_required():

fromdjango.contrib.auth.decoratorsimportlogin_required

 

@login_required

defmy_view(request):

...

login_required() 做以下事情:

  • 如果用户未登录,重定向到settings.LOGIN_URL变量指定的url,并把当前请求的绝对URL赋值给查询字符串。例: /accounts/login/?next=/polls/3/.
  • 如果用户已登录,正常执行视图。

默认的,查询字符串参数名称为“next”,如果想用其它名称,需要使用loging_required的可选参数redirect_field_name,举例如下

fromdjango.contrib.auth.decoratorsimportlogin_required

 

@login_required(redirect_field_name='my_redirect_field')

defmy_view(request):

...

对应的,html模板中也要使用对应参数名称。

 

login_required()还携带了可选参数 login_url。例:

fromdjango.contrib.auth.decoratorsimportlogin_required

 

@login_required(login_url='/accounts/login/')

defmy_view(request):

...

注意,如果不指定login_url参数,则需要配置settings.LOGIN_URL.

更多详情,参考官方文档。

 

一些常见的装饰器

@require_POST # 设置视图的http访问方法必须为POST

@require_GET  # 设置视图的http访问方法必须为GET

 

例子:设置视图的访问方法必须为POST

from django.views.decorators.http import require_POST,require_GET

 

@require_POST

def test_page(request):

return render(request, 'website/pages/mytest.html',{})

 

访问效果

 

 

 

The LoginRequired mixin

 

Limiting access to logged-in users that pass a test

 

The permission_required decorator

 

The PermissionRequiredMixin mixin

 

Redirecting unauthorized requests in class-based views

Session invalidation on password change

Authentication Views

Using the views

All authentication views

Helper functions

Built-in forms

 

模板中的认证数据

当使用RequestContext,并且开启了'django.contrib.auth.context_processors.auth'上下文处理器时(可在settings.py中配置),当前已登录用户和他们的权限都被存储为变量,存放在模板上下文中

Users

例子:

{%ifuser.is_authenticated%}

<p>Welcome, {{user.username}}. Thanks for logging in.</p>{%else%}

<p>Welcome, new user. Please log in.</p>{%endif%}

如果未使用RequestContext,则模板变量不可获取,比如上述的 {{ user }}

 

Permissions

Managing users in the admin

 

 

参考链接

https://docs.djangoproject.com/en/2.1/topics/auth/

 

目录
相关文章
|
1月前
|
Python
Django 框架的路由系统
Django 框架的路由系统
50 6
|
2月前
|
机器学习/深度学习 数据处理 数据库
基于Django的深度学习视频分类Web系统
基于Django的深度学习视频分类Web系统
66 4
基于Django的深度学习视频分类Web系统
|
2月前
|
数据库 数据库管理 Python
#736421#基于django的个人博客系统
#736421#基于django的个人博客系统
49 4
#736421#基于django的个人博客系统
|
2月前
|
机器学习/深度学习 监控 数据挖掘
基于Django和百度飞桨模型的情感识别Web系统
基于Django和百度飞桨模型的情感识别Web系统
47 5
|
2月前
|
数据库 数据库管理 Python
#73623#基于django的园区对比系统
#73623#基于django的园区对比系统
43 4
|
2月前
|
数据库 数据安全/隐私保护 数据库管理
#099473#基于django的毕业生信息管理招聘系统
#099473#基于django的毕业生信息管理招聘系统
45 4
|
2月前
|
监控 应用服务中间件 网络安全
#637481#基于django和neo4j的日志分析系统
#637481#基于django和neo4j的日志分析系统
41 4
|
2月前
|
数据库 数据安全/隐私保护 数据库管理
#765372#基于django和neo4j的通用数据展示系统
#765372#基于django和neo4j的通用数据展示系统
27 1
|
2月前
|
BI Python
基于django的代理商订单管理系统
基于django的代理商订单管理系统
25 0
|
2月前
|
数据可视化 NoSQL 数据库
#879273#基于django/neo4j的通讯录与QQ好友关系管理系统
#879273#基于django/neo4j的通讯录与QQ好友关系管理系统
23 0