07+. Django用户登录验证系统和登录注销
2017-03-08 00:12
585 查看
打开微信扫一扫,关注微信公众号【数据与算法联盟】
转载请注明出处:http://blog.csdn.net/gamer_gyt
博主微博:http://weibo.com/234654758
Github:https://github.com/thinkgamer
写在前边的话
一直以来对Django的用户权限登录保护模棱两可,最近由于在做一个django的项目,其中涉及到用户的权限登录保护,所以算是有些清楚了,总结下来,给还在模棱两可的你阅读。附上我最近一直在commit的github地址:https://github.com/Thinkgamer/CSMarket
环境说明
Django:1.10Python:3.5
用户登录验证
1:前提说明
以下所谈到的用户登录验证给予扩展Django 内置的User模型,以AbstractUser方式扩展User模型,Django中的用户扩展的两种方式可参考:http://blog.csdn.net/gamer_gyt/article/details/50499653以下代码为上边给的github地址中的实例,抽取其中用户验证为例。
2:以AbstractUser方式扩展内置User
models.py:from django.db import models from django.contrib.auth.models import AbstractUser # Create your models here. class User(AbstractUser): # 手机号 user_phone = models.CharField(blank=True, verbose_name='电话', max_length=11) #判断是否是认证通过的用户 user_isValid=models.BooleanField(blank=True,default=False) def __unicode__(self): return self.user.username
admin.py:
from django.contrib import admin from logre.models import User admin.site.register(User)
3:authenticate 进行用户验证
提供了用户认证,即验证用户名以及密码是否正确。一般需要username password两个关键字参数。如果认证信息有效,会返回一个 User 对象。authenticate()会在User 对象上设置一个属性标识那种认证后端认证了该用户,且该信息在后面的登录过程中是需要的。当我们试图登陆一个从数据库中直接取出来不经过authenticate()的User对象会报错的!!
user = authentica(username=’someone’,password=’somepassword’)
那么用户登录函数该怎么写呢?
views.py
#用户登录 @csrf_exempt def login(request): if request.method=='POST': uname=request.POST.get('username') pwd=request.POST.get('passwd') user = authenticate(username=uname,password=pwd) if user is not None: auth_login(request, user) # 更新最后登录时间 now_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) user.last_login=now_time user.save() return HttpResponseRedirect(referer) else: return render_to_response('login.html',{ 'error': '邮箱或者密码不正确', 'user_name': uname, 'user_pwd': pwd, }) else: return render_to_response('login.html',{})
注意事项:这里的authentica函数只能接受username和password,因为我在测试email的时候不好使(如果恰巧你看到了这里,并且验证可以用email和password验证的话,请留言)
AbstractUser扩展的User模型,在数据库中密码存储形式是经过转化的,所以我们并不能直接操作密码,幸好django提供了专门的函数来修改密码。
set_password 函数
eg:(由于我项目还没更新到这一步,所以这里就举这样一个简单的例子)
>>> from django.contrib.auth.models import User >>> u = User.objects.get(username='john') >>> u.set_password('new password') >>> u.save()
4:Permission
Django的auth系统提供了模型级的权限控制, 即可以检查用户是否对某个数据表拥有增(add), 改(change), 删(delete)权限。auth系统无法提供对象级的权限控制, 即检查用户是否对数据表中某条记录拥有增改删的权限。如果需要对象级权限控制可以使用django-guardian。
假设在博客系统中有一张article数据表管理博文, auth可以检查某个用户是否拥有对所有博文的管理权限, 但无法检查用户对某一篇博文是否拥有管理权限
user.has_perm方法用于检查用户是否拥有操作某个模型的权限
eg:
user.has_perm('blog.add_article') user.has_perm('blog.change_article') user.has_perm('blog.delete_article')
如果要添加权限的话,我们可以在后台管理中自己添加,当然也可以使用以下方法添加
user.user_permissions.add()
删除权限:
user.user_permissions.delete()
清空权限
user.user_permissions.clear()
用户拥有他所在用户组的权限, 使用用户组管理权限是一个更方便的方法。Group中包含多对多字段permissions, 在数据库中由auth_group_permissions数据表维护。
添加权限
group.permissions.add(permission)
删除权限
group.permissions.delete(permission)
清空权限
group.permissions.clear()
当然我们也可以自定义权限,可参考之前文章中的内容:http://blog.csdn.net/gamer_gyt/article/details/51023560
用户登录和注销
1:Http请求和回应
参考:http://djangobook.py3k.cn/appendixH/‘>HTTP请求(Request)和回应(Response)对象2:用户登录
该函数接受一个HttpRequest对象,以及一个认证了的User对象此函数使用django的session框架给某个已认证的用户附加上session id等信息。
其实在我们上边的views.py函数中也有看到就是 auth_login(request,user)
前提条件是扩展django的User用户模型,使用时需要导入django的login
from django.contrib.auth import login as auth_login
PS:我这里as为auth_login是因为我的views函数为login,否则会重名,会出现错误
使用:
uname=request.POST.get('username') pwd=request.POST.get('passwd') user = authenticate(username=uname,password=pwd) if user is not None: auth_login(request, user)
3:用户注销
logout:该函数接受一个HttpRequest对象,无返回值。当调用该函数时,当前请求的session信息会全部清除。该用户即使没有登录,使用该函数也不会报错from django.contrib.auth import logout as auth_logout def logout(request): auth_logout(request) return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/'))
4:登录之后保持会话状态
在其登录之后会将用户信息保存在request中,那么我们我进行一个views 函数前,可以先判断下request.user是否存在,如存在将数据传递给返回前端,如果不存在我们也可以添加一些其他的逻辑。def all(request): if request.user.is_authenticated: user_name=request.user else: user_name='' return render(request, 'news.html', { 'user_name': user_name, })
5:如何记录登录前的来源页面
这里我们使用的是:request.META[‘HTTP_REFERER’]
大概实现的思路是:在login函数内声明一个全局变量referer,在不是发生post请求的时候记录下来源页面赋值给referer,在是发生post请求后返回到原页面。代码如下:
#用户登录 @csrf_exempt def login(request): global referer if request.method=='POST': ... return HttpResponseRedirect(referer) else: try: referer = request.META['HTTP_REFERER'] # 获取网页访问来源 except: pass finally: return render_to_response('login.html',{})
总结
其实Django本身的用户验证系统和登录注销功能是十分强大的,在开发过程中如果能利用好这些技术点,必然会节约很多我们的开发时间。附本人的Django专栏:Django从零开始到项目优化
相关文章推荐
- Django学习笔记4 用户注册和身份验证、登录、注销、注册
- django用户注册、登录、注销和用户扩展
- 新闻管理系统中用户的登录与验证
- springmvc+mybatis登录验证2.0(更新了使用session来进行保存用户值,注销后清除session),并进行了拦截器的设定
- Django框架下使用ajax模拟用户登录验证
- django系统发送邮件到用户邮箱,完成验证
- Django实战之用户验证登录
- 解决Linux系统安装后,root用户无法登录,提示“无法验证用户”的错误问题
- Django笔记---用户注册和登录验证(2)--数据库储存
- EOS非Portal模式下,如何开发一个用户登录验证程序,用户只有在登录验证通过后,方可访问系统。
- 用户登录系统数据库验证
- python django 用户注册验证登录。。。
- 查看&备份 系统开/关机 & 用户登录/注销 记录――BootClos 0_0_0001_beta2
- SSM框架---二手教材交易系统之用户登录(包括表单提前验证,ajax)
- (转载)Linux 配置文件简介/登录注销,文件系统,系统管理,守护进程,用户程序配置文件/Understanding Linux configuration files
- 转载django用户注册、登录、注销和用户扩展
- linux系统下mysql跳过密码验证登录和创建新用户
- django-用户验证系统
- django 用户登录及验证
- 使用django-userena搭建用户登录系统