【Python】Django用户、认证、鉴权模块使用

时间:2021-09-02 06:33:45

此文是总结Django官方网站里面的Document的文章 User authentication in Django http://www.djangoproject.com/documentation/authentication/

该模块由 用户(Users) 权限(Permissions) 组(Groups) 消息(Messages)

这些从字面上也都很好的理解,但是我对消息(Messages)还不是很理解…………

1、安装 1)将'django.contrib.auth'添加到Setting.py的INSTALLED_APPS 中 2)安装数据库 manage.py syncdb. 其实用户权限模块是Django自己已经写好的app,所以他也具有自身的Models,所以需要同步数据库。

2、User 1)属性 其中他包含User类,他具有以下字段 username,first_name,last_name,email,password,is_staff(是否具有进入网站管理权限), is_active,is_superuser,last_login,date_joined.

这是Django自带的User的基本的信息,如果你要使用该权限模块,就必须要使用他的User类, 但是通常情况下,我们的用户信息还会有其他的属性,这时我们可以再增加一类来扩展,该类和User的关系是OneToOne。 如: #这是china-django中的代码

【Python】Django用户、认证、鉴权模块使用class Profile(models.Model): 【Python】Django用户、认证、鉴权模块使用    user = models.OneToOneField(User) 【Python】Django用户、认证、鉴权模块使用【Python】Django用户、认证、鉴权模块使用    blog = models.CharField(maxlength=128, blank=True) 【Python】Django用户、认证、鉴权模块使用    location = models.CharField(maxlength=128, blank=True) 【Python】Django用户、认证、鉴权模块使用    occupation = models.CharField(maxlength=64, blank=True) 【Python】Django用户、认证、鉴权模块使用     【Python】Django用户、认证、鉴权模块使用    reward = models.IntegerField(default=0, blank=True) 【Python】Django用户、认证、鉴权模块使用    topic_count = models.IntegerField(default=0, blank=True) 【Python】Django用户、认证、鉴权模块使用    post_count = models.IntegerField(default=0, blank=True) 【Python】Django用户、认证、鉴权模块使用     【Python】Django用户、认证、鉴权模块使用    class Admin: 【Python】Django用户、认证、鉴权模块使用        list_display = ('user', 'blog', 'location', 'occupation', 'reward', 'topic_count', 'post_count') 【Python】Django用户、认证、鉴权模块使用【Python】Django用户、认证、鉴权模块使用

2)方法 这里列举几个主要的方法 is_anonymous():是否为匿名用户,如果你已经login,则这个方法返回始终为false. is_authenticated():是否通过验证,也就是通过用户名和密码判断该用户是否存在. get_group_permissions():得到所有该用户所属组别的权限. get_all_permissions():得到该用户所有的权限. has_perm(perm):判断用户是否具有特定权限,perm的格式是appname.codename. email_user(subject, message, from_email=None):给某用户发送邮件

3) AnonymousUser AnonymousUser是继承自User接口,但是和User有不同处: id属性为None is_anonymous() 返回始终为True is_authenticated() 返回始终为False has_perm() 返回始终为False set_password(), check_password(), save(), delete(), set_groups()和set_permissions() 都会触发 NotImplementedError错误

3、User的验证 1)登陆(Login)

【Python】Django用户、认证、鉴权模块使用from django.contrib.auth import authenticate, login 【Python】Django用户、认证、鉴权模块使用【Python】Django用户、认证、鉴权模块使用def my_view(request): 【Python】Django用户、认证、鉴权模块使用    username = request.POST['username'] 【Python】Django用户、认证、鉴权模块使用    password = request.POST['password'] 【Python】Django用户、认证、鉴权模块使用    user = authenticate(username=username, password=password) 【Python】Django用户、认证、鉴权模块使用    if user is not None: 【Python】Django用户、认证、鉴权模块使用        login(request, user) 【Python】Django用户、认证、鉴权模块使用        # Redirect to a success page. 【Python】Django用户、认证、鉴权模块使用    else: 【Python】Django用户、认证、鉴权模块使用        # Return an error message. 【Python】Django用户、认证、鉴权模块使用【Python】Django用户、认证、鉴权模块使用

首先我们要验证这个用户,然后再登陆,登陆成功后,我们可以通过request.user 来得到当前登陆的用户对象。

2)注销(Logout)

【Python】Django用户、认证、鉴权模块使用from django.contrib.auth import logout 【Python】Django用户、认证、鉴权模块使用【Python】Django用户、认证、鉴权模块使用def logout_view(request): 【Python】Django用户、认证、鉴权模块使用    logout(request) 【Python】Django用户、认证、鉴权模块使用    # Redirect to a success page. 【Python】Django用户、认证、鉴权模块使用【Python】Django用户、认证、鉴权模块使用

3)限制非法用户访问 最普通的方法是通过request.user.is_authenticated()来判断

【Python】Django用户、认证、鉴权模块使用from django.http import HttpResponseRedirect 【Python】Django用户、认证、鉴权模块使用【Python】Django用户、认证、鉴权模块使用def my_view(request): 【Python】Django用户、认证、鉴权模块使用    if not request.user.is_authenticated(): 【Python】Django用户、认证、鉴权模块使用        return HttpResponseRedirect('/login/?next=%s' % request.path) 【Python】Django用户、认证、鉴权模块使用    # 【Python】Django用户、认证、鉴权模块使用【Python】Django用户、认证、鉴权模块使用【Python】Django用户、认证、鉴权模块使用

另外有一快捷的方法login_required

【Python】Django用户、认证、鉴权模块使用from django.contrib.auth.decorators import login_required 【Python】Django用户、认证、鉴权模块使用【Python】Django用户、认证、鉴权模块使用@login_required 【Python】Django用户、认证、鉴权模块使用def my_view(request): 【Python】Django用户、认证、鉴权模块使用    # 【Python】Django用户、认证、鉴权模块使用【Python】Django用户、认证、鉴权模块使用【Python】Django用户、认证、鉴权模块使用

这样当你访问my_view的时候,就需要用户需要通过验证.若不通过则跳转到 /accounts/login/?next=/polls/3/ 并将当前访问的页面作为他的一个参数,并且传递三个Context变量 form 一个FormWrapper 对象用来重构登陆表单 next 就是你访问的当前页面 site_name 当前站点名称,在Setting.py中设置SITE_ID的值

另外,我们还需要在你的urls里面配置/accounts/login路径 下面有两种两种,不同的是使用不同的模版,第一种默认使用registration/login.html 模版,第二种方式是我们自定义模版

【Python】Django用户、认证、鉴权模块使用(r'^accounts/login/$', 'django.contrib.auth.views.login'), 【Python】Django用户、认证、鉴权模块使用(r'^accounts/login/$', 'django.contrib.auth.views.login', {'template_name': 'myapp/login.html'}), 【Python】Django用户、认证、鉴权模块使用

一个login.html模版的实例:

【Python】Django用户、认证、鉴权模块使用{% extends "base.html" %} 【Python】Django用户、认证、鉴权模块使用【Python】Django用户、认证、鉴权模块使用{% block content %} 【Python】Django用户、认证、鉴权模块使用【Python】Django用户、认证、鉴权模块使用{% if form.has_errors %} 【Python】Django用户、认证、鉴权模块使用<p>Your username and password didn't match. Please try again.</p> 【Python】Django用户、认证、鉴权模块使用{% endif %} 【Python】Django用户、认证、鉴权模块使用【Python】Django用户、认证、鉴权模块使用<form method="post" action="."> 【Python】Django用户、认证、鉴权模块使用<table> 【Python】Django用户、认证、鉴权模块使用<tr><td><label for="id_username">Username:</label></td><td>{{ form.username }}</td></tr> 【Python】Django用户、认证、鉴权模块使用<tr><td><label for="id_password">Password:</label></td><td>{{ form.password }}</td></tr> 【Python】Django用户、认证、鉴权模块使用</table> 【Python】Django用户、认证、鉴权模块使用【Python】Django用户、认证、鉴权模块使用<input type="submit" value="login" /> 【Python】Django用户、认证、鉴权模块使用<input type="hidden" name="next" value="{{ next }}" /> 【Python】Django用户、认证、鉴权模块使用</form> 【Python】Django用户、认证、鉴权模块使用【Python】Django用户、认证、鉴权模块使用{% endblock %} 【Python】Django用户、认证、鉴权模块使用

4)用户是否有权限访问

当我们创建了一个带有class Admin:内类的类后,会自动add, create 和 delete三种权限,不过我们也可以自己定义权限。 如下:

【Python】Django用户、认证、鉴权模块使用class USCitizen(models.Model): 【Python】Django用户、认证、鉴权模块使用    #  【Python】Django用户、认证、鉴权模块使用    class Meta: 【Python】Django用户、认证、鉴权模块使用        permissions = ( 【Python】Django用户、认证、鉴权模块使用            ("can_drive", "Can drive"), 【Python】Django用户、认证、鉴权模块使用            ("can_vote", "Can vote in elections"), 【Python】Django用户、认证、鉴权模块使用            ("can_drink", "Can drink alcohol"), 【Python】Django用户、认证、鉴权模块使用        ) 【Python】Django用户、认证、鉴权模块使用

这样我们为USCitizen类定义了三种自定义的权限,其中第一项是codename,第二项是discription。 
当我们定义好权限后,我们可以通过user.has_perm来判断是否具有权限

【Python】Django用户、认证、鉴权模块使用def my_view(request): 【Python】Django用户、认证、鉴权模块使用    if not (request.user.is_authenticated() and request.user.has_perm('polls.can_vote')): 【Python】Django用户、认证、鉴权模块使用        return HttpResponse("You can't vote in this poll.") 【Python】Django用户、认证、鉴权模块使用

has_perm的参数应该是appname(packname) + . + codename

还有一种更简便的方式,如下: @user_passes_test(lambda u: u.has_perm('polls.can_vote')) 这样如果该用户没有权限,则自动跳转到/accounts/login/,也可以自定义跳转 @user_passes_test(lambda u: u.has_perm('polls.can_vote'), login_url='/login/')

4、template中的用户验证 Users

【Python】Django用户、认证、鉴权模块使用{% if user.is_authenticated %} 【Python】Django用户、认证、鉴权模块使用    <p>Welcome, {{ user.username }}. Thanks for logging in.</p>     【Python】Django用户、认证、鉴权模块使用{% else %} 【Python】Django用户、认证、鉴权模块使用    <p>Welcome, new user. Please log in.</p> 【Python】Django用户、认证、鉴权模块使用{% endif %}

Permissions {{ perms.foo }},一个已经登陆的用户对foo的app只要有任何的权限,{{ perms.foo }}就会等于True,反之为False {{ perms.foo.can_vote }}, 这个很清楚了... 实例如下:

【Python】Django用户、认证、鉴权模块使用{% if perms.foo %} 【Python】Django用户、认证、鉴权模块使用    <p>You have permission to do something in the foo app.</p> 【Python】Django用户、认证、鉴权模块使用    {% if perms.foo.can_vote %} 【Python】Django用户、认证、鉴权模块使用        <p>You can vote!</p> 【Python】Django用户、认证、鉴权模块使用    {% endif %} 【Python】Django用户、认证、鉴权模块使用    {% if perms.foo.can_drive %} 【Python】Django用户、认证、鉴权模块使用        <p>You can drive!</p> 【Python】Django用户、认证、鉴权模块使用    {% endif %} 【Python】Django用户、认证、鉴权模块使用{% else %} 【Python】Django用户、认证、鉴权模块使用    <p>You don't have permission to do anything in the foo app.</p> 【Python】Django用户、认证、鉴权模块使用{% endif %} 【Python】Django用户、认证、鉴权模块使用【Python】Django用户、认证、鉴权模块使用

5、authentication backends Django中队用户的验证都是通过自身的模块,也可以使用其他的模块。 默认的AUTHENTICATION_BACKENDS 是 ('django.contrib.auth.backends.ModelBackend',)

我们可以自己写一个不同的用户验证方式,但必须具有get_user 和authenticate方法 如:

【Python】Django用户、认证、鉴权模块使用from django.conf import settings 【Python】Django用户、认证、鉴权模块使用from django.contrib.auth.models import User, check_password 【Python】Django用户、认证、鉴权模块使用【Python】Django用户、认证、鉴权模块使用class SettingsBackend: 【Python】Django用户、认证、鉴权模块使用    """ 【Python】Django用户、认证、鉴权模块使用    Authenticate against the settings ADMIN_LOGIN and ADMIN_PASSWORD. 【Python】Django用户、认证、鉴权模块使用【Python】Django用户、认证、鉴权模块使用    Use the login name, and a hash of the password. For example: 【Python】Django用户、认证、鉴权模块使用【Python】Django用户、认证、鉴权模块使用    ADMIN_LOGIN = 'admin' 【Python】Django用户、认证、鉴权模块使用    ADMIN_PASSWORD = 'sha1$4e987$afbcf42e21bd417fb71db8c66b321e9fc33051de' 【Python】Django用户、认证、鉴权模块使用    """ 【Python】Django用户、认证、鉴权模块使用    def authenticate(self, username=None, password=None): 【Python】Django用户、认证、鉴权模块使用        login_valid = (settings.ADMIN_LOGIN == username) 【Python】Django用户、认证、鉴权模块使用        pwd_valid = check_password(password, settings.ADMIN_PASSWORD) 【Python】Django用户、认证、鉴权模块使用        if login_valid and pwd_valid: 【Python】Django用户、认证、鉴权模块使用            try: 【Python】Django用户、认证、鉴权模块使用                user = User.objects.get(username=username) 【Python】Django用户、认证、鉴权模块使用            except User.DoesNotExist: 【Python】Django用户、认证、鉴权模块使用                # Create a new user. Note that we can set password 【Python】Django用户、认证、鉴权模块使用                # to anything, because it won't be checked; the password 【Python】Django用户、认证、鉴权模块使用                # from settings.py will. 【Python】Django用户、认证、鉴权模块使用                user = User(username=username, password='get from settings.py') 【Python】Django用户、认证、鉴权模块使用                user.is_staff = True 【Python】Django用户、认证、鉴权模块使用                user.is_superuser = True 【Python】Django用户、认证、鉴权模块使用                user.save() 【Python】Django用户、认证、鉴权模块使用            return user 【Python】Django用户、认证、鉴权模块使用        return None 【Python】Django用户、认证、鉴权模块使用【Python】Django用户、认证、鉴权模块使用    def get_user(self, user_id): 【Python】Django用户、认证、鉴权模块使用        try: 【Python】Django用户、认证、鉴权模块使用            return User.objects.get(pk=user_id) 【Python】Django用户、认证、鉴权模块使用        except User.DoesNotExist: 【Python】Django用户、认证、鉴权模块使用            return None 【Python】Django用户、认证、鉴权模块使用

这个时候我们需要修改Setting AUTHENTICATION_BACKENDS = (  'sputnik.backends.ldapBackend.LDAPBackend', )

这里还有一片关于Authentication Backends的文章

LDAP Authentication in Django with Backends

全文结束,谈不上总结,因为缺少我的体会和心得,也谈不上翻译,因为my englishi is Poor.

See You!!!

参考资料:

[django]总结Django中的用户权限模块:http://maplye.iteye.com/blog/448960

[ios]将 django.contrib.auth.views.login 设置为 csrf_exempt:http://www.itstrike.cn/Question/85f57468-58d3-4a40-89d3-c865b63b0c02.html

【Python】Django用户、认证、鉴权模块使用的更多相关文章

  1. nginx 请求文件 进行用户认证&sol;鉴权&colon; internal&lpar;限制为内部调用&rpar;

    在进行WEB开发时, 必然会遇到向用户返回文件的场景(如图片, 文档等等), 当返回的文件较小时, 我们可以直接通过接口以数据流的形式向前台返回, 因为文件较小, 因此也不会太过于影响响应速度及服务器 ...

  2. Django 2&period;0 学习&lpar;17&rpar;:Django 用户认证&lpar;auth模块&rpar;

    Django 用户认证(auth模块) 一.认证登陆 在进行用户登陆验证的时候,如果是自己写代码,就必须要先查询数据库,看用户输入的用户名是否存在于数据库中:如果用户存在于数据库中,然后再验证用户输入 ...

  3. Django 用户认证及OneToOneField

    Django 用户认证如果自己不想写 就可以用django自带的认证 首选导入模块 models.py #!/usr/bin/env python #_*_ coding:utf8 _*_ from ...

  4. Django的认证系统—auth模块

    Django的认证系统 auth模块的知识点总结: 1. 创建超级用户 python manage.py createsuperuser from django.contrib import auth ...

  5. django用户认证系统——基本设置1

    网站提供登录.注册等用户认证功能是一个常见的需求.因此,Django 提供了一套功能完整的.灵活的.易于拓展的用户认证系统:django.contrib.auth.在本教程中,我将向你展示 auth ...

  6. Spring Security 接口认证鉴权入门实践指南

    目录 前言 SpringBoot 示例 SpringBoot pom.xml SpringBoot application.yml SpringBoot IndexController SpringB ...

  7. Mongodb 认证鉴权那点事

    [TOC] 一.Mongodb 的权限管理 认识权限管理,说明主要概念及关系 与大多数数据库一样,Mongodb同样提供了一套权限管理机制. 为了体验Mongodb 的权限管理,我们找一台已经安装好的 ...

  8. 基于Springboot集成security、oauth2实现认证鉴权、资源管理

    1.Oauth2简介 OAuth(开放授权)是一个开放标准,允许用户授权第三方移动应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方移动应用或分享他们数据的所有内容,OAu ...

  9. django用户认证系统——拓展 User 模型

    Django 用户认证系统提供了一个内置的 User 对象,用于记录用户的用户名,密码等个人信息.对于 Django 内置的 User 模型, 仅包含以下一些主要的属性: username,即用户名 ...

  10. django——用户认证组件

    用户认证 auth模块 1 from django.contrib import auth django.contrib.auth中提供了许多方法,这里主要介绍其中的三个: 1.1 .authenti ...

随机推荐

  1. JAVA hashmap知识整理

    HashMap和Hashtable的比较是Java面试中的常见问题,用来考验程序员是否能够正确使用集合类以及是否可以随机应变使用多种思路解决问题.HashMap的工作原理.ArrayList与Vect ...

  2. 日本DARTS 支撑的一系列应用项目

    DARTS是多学科空间科学数据平台,例如天体物理.太阳物理.太阳物理.月球与行星科学和微重力科学.在此数据支撑下,有许多应用. 1.http://wms.selene.darts.isas.jaxa. ...

  3. HtmlAgilityPack教程

    解析html教程(重点) http://www.cnblogs.com/kissdodog/archive/2013/02/28/2936950.html 完整的教程 http://www.cnblo ...

  4. spring与jpa整合 简化persistence&period;xml配置文件 使用属性文件 数据源dbcp访问数据库

    ===========appliction.xml配置文件======================= <?xml version="1.0" encoding=&quot ...

  5. C&num;多线程实践——创建和开始使用

    线程用Thread类来创建, 通过ThreadStart委托来指明方法从哪里开始运行.ThreadStart的声明如下: public delegate void ThreadStart(); 调用S ...

  6. springboot 热部署 idea版本(转)

    spring为开发者提供了一个名为spring-boot-devtools的模块来使Spring Boot应用支持热部署,提高开发者的开发效率,无需手动重启Spring Boot应用. devtool ...

  7. 内建模块 datetime使用

    #-*- coding:utf-8 -*- from datetime import datetime #获取当前日期和时间 now =datetime.now() print now # 2017- ...

  8. ASP&period;NET Core免费(视频)教程汇总

    最近才开始学习ASP.NET Core,发现社区的学习资料很多,但是相关的视频教程不是很多,52ABP官方有两个视频教程,但是ABP框架比较臃肿,初学者学起来有点吃力,所以还是推荐大家先啃书或者官方文 ...

  9. JMeter—后置处理器&lpar;十&rpar;

    参考<全栈性能测试修炼宝典JMeter实战>第六章 JMeter 元件详解中第五节后置处理器后置处理器是用来处理采样器发送的请求后得到的响应数据 一.Debug PostProcessor ...

  10. centOS7 修改DNS

    #显示当前网络连接 #nmcli connection show NAME UUID TYPE DEVICE eno1 5fb06bd0-0bb0-7ffb-45f1-d6edd65f3e03 802 ...