此文是总结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中的代码
class Profile(models.Model):
user = models.OneToOneField(User)
blog = models.CharField(maxlength=128, blank=True)
location = models.CharField(maxlength=128, blank=True)
occupation = models.CharField(maxlength=64, blank=True)
reward = models.IntegerField(default=0, blank=True)
topic_count = models.IntegerField(default=0, blank=True)
post_count = models.IntegerField(default=0, blank=True)
class Admin:
list_display = ('user', 'blog', 'location', 'occupation', 'reward', 'topic_count', 'post_count')
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)
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 error message.
首先我们要验证这个用户,然后再登陆,登陆成功后,我们可以通过request.user 来得到当前登陆的用户对象。
2)注销(Logout)
from django.contrib.auth import logout
def logout_view(request):
logout(request)
# Redirect to a success page.
3)限制非法用户访问
最普通的方法是通过request.user.is_authenticated()来判断
from django.http import HttpResponseRedirect
def my_view(request):
if not request.user.is_authenticated():
return HttpResponseRedirect('/login/?next=%s' % request.path)
#
另外有一快捷的方法login_required
from django.contrib.auth.decorators import login_required
@login_required
def my_view(request):
#
这样当你访问my_view的时候,就需要用户需要通过验证.若不通过则跳转到
/accounts/login/?next=/polls/3/
并将当前访问的页面作为他的一个参数,并且传递三个Context变量
form 一个FormWrapper 对象用来重构登陆表单
next 就是你访问的当前页面
site_name 当前站点名称,在Setting.py中设置SITE_ID的值
另外,我们还需要在你的urls里面配置/accounts/login路径
下面有两种两种,不同的是使用不同的模版,第一种默认使用registration/login.html 模版,第二种方式是我们自定义模版
(r'^accounts/login/$', 'django.contrib.auth.views.login'),
(r'^accounts/login/$', 'django.contrib.auth.views.login', {'template_name': 'myapp/login.html'}),
一个login.html模版的实例:
{% extends "base.html" %}
{% block content %}
{% if form.has_errors %}
<p>Your username and password didn't match. Please try again.</p>
{% endif %}
<form method="post" action=".">
<table>
<tr><td><label for="id_username">Username:</label></td><td>{{ form.username }}</td></tr>
<tr><td><label for="id_password">Password:</label></td><td>{{ form.password }}</td></tr>
</table>
<input type="submit" value="login" />
<input type="hidden" name="next" value="{{ next }}" />
</form>
{% endblock %}
4)用户是否有权限访问
当我们创建了一个带有class Admin:内类的类后,会自动add, create 和 delete三种权限,不过我们也可以自己定义权限。
如下:
class USCitizen(models.Model):
#
class Meta:
permissions = (
("can_drive", "Can drive"),
("can_vote", "Can vote in elections"),
("can_drink", "Can drink alcohol"),
)
这样我们为USCitizen类定义了三种自定义的权限,其中第一项是codename,第二项是discription。
当我们定义好权限后,我们可以通过user.has_perm来判断是否具有权限
def my_view(request):
if not (request.user.is_authenticated() and request.user.has_perm('polls.can_vote')):
return HttpResponse("You can't vote in this poll.")
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
{% if user.is_authenticated %}
<p>Welcome, {{ user.username }}. Thanks for logging in.</p>
{% else %}
<p>Welcome, new user. Please log in.</p>
{% endif %}
Permissions
{{ perms.foo }},一个已经登陆的用户对foo的app只要有任何的权限,{{ perms.foo }}就会等于True,反之为False
{{ perms.foo.can_vote }}, 这个很清楚了...
实例如下:
{% if perms.foo %}
<p>You have permission to do something in the foo app.</p>
{% if perms.foo.can_vote %}
<p>You can vote!</p>
{% endif %}
{% if perms.foo.can_drive %}
<p>You can drive!</p>
{% endif %}
{% else %}
<p>You don't have permission to do anything in the foo app.</p>
{% endif %}
5、authentication backends
Django中队用户的验证都是通过自身的模块,也可以使用其他的模块。
默认的AUTHENTICATION_BACKENDS 是
('django.contrib.auth.backends.ModelBackend',)
我们可以自己写一个不同的用户验证方式,但必须具有get_user 和authenticate方法
如:
from django.conf import settings
from django.contrib.auth.models import User, check_password
class SettingsBackend:
"""
Authenticate against the settings ADMIN_LOGIN and ADMIN_PASSWORD.
Use the login name, and a hash of the password. For example:
ADMIN_LOGIN = 'admin'
ADMIN_PASSWORD = 'sha1$4e987$afbcf42e21bd417fb71db8c66b321e9fc33051de'
"""
def authenticate(self, username=None, password=None):
login_valid = (settings.ADMIN_LOGIN == username)
pwd_valid = check_password(password, settings.ADMIN_PASSWORD)
if login_valid and pwd_valid:
try:
user = User.objects.get(username=username)
except User.DoesNotExist:
# Create a new user. Note that we can set password
# to anything, because it won't be checked; the password
# from settings.py will.
user = User(username=username, password='get from settings.py')
user.is_staff = True
user.is_superuser = True
user.save()
return user
return None
def get_user(self, user_id):
try:
return User.objects.get(pk=user_id)
except User.DoesNotExist:
return None
这个时候我们需要修改Setting
AUTHENTICATION_BACKENDS = (
'sputnik.backends.ldapBackend.LDAPBackend',
)
这里还有一片关于Authentication Backends的文章
LDAP Authentication in Django with Backends
全文结束,谈不上总结,因为缺少我的体会和心得,也谈不上翻译,因为my englishi is Poor.
See You!!!
分享到:
相关推荐
这个是一个权限控制模块,使用python3写的,可以导入(permission)直接使用。写了一个中间件实现权限控制,可以在后台分配权限。具体使用方式看文件里的readme.md。
如果你想快速开发一套应用系统,不管你有没有Python(Django、Vue)经验,只要你花点时间,了解此系统(此系统适合大部分应用系统开发),定能快速开发出老板要的系统。此系统是大部分应用系统开发的奠基石及脚手架...
一 导言 设计一个好的用户系统往往不是...如配置了Django的用户系统,仅需调用Django提供的几个函数,便可实现用户的登录,注销,权限验证等功能。例如以下情景 1.登录 # some_view.py from django.contrib.auth impo
django数据库记录前端增删改查,可以直接修改完善使用。
用django框架来做一些后台管理的web页面简直太方便了,django自带模块级的权限系统,用来做一些内部的系统非常合适,可以大大的减少开发量。但是django自带的权限系统还不支持行级的权限控制,如果要实现行级的权限...
(1)网站首页浏览:用户登录网站之后可以在首页中查看系统内的所有功能,网站首页使用简介大方的设计风格,可以给用户很好的使用体验。 (2)个人信息查看:用户可以查看网站内自己的个人信息,包括自己的ID、姓名...
这个是一个权限控制模块,使用python3写的,可以导入直接使用。写了一个中间件实现权限控制,可以在后台分配权限。文件里的readme.md有详细说明
django-guardian ... 在设置模块INSTALLED_APPS guardian放入您的INSTALLED_APPS中: INSTALLED_APPS = ( ... ' guardian ', ) 将额外的授权后端添加到您的settings.py : AUTHENTICATION_BACKENDS =
(1)系统首页浏览:用户登录系统之后可以在首页中查看系统内的所有功能,网站首页使用简介大方的设计风格,可以给用户很好的使用体验。 (2)个人信息查看:用户可以查看网站内自己的个人信息,包括自己的ID、姓名...
django-guardian:Django 1.2+ 实现了单个... 将监护人放入设置模块的 INSTALLED_APPS 中: INSTALLED_APPS = ( ... 'guardian', ) 向 settings.py 添加额外的授权后端: AUTHENTICATION_BACKENDS = ( 'django.contrib.
基于RBAC模型权限控制的中小型应用的基础开发平台,前拆分,替代采用django + django-rest-framework,前端采用vue + ElementUI,移动端采用uniapp + uView(可发布h5和小程序)。 JWT认证,可使用simple_history...
【用户模块】 模型:采用Django原生的AbstractUser模型,添加了level和avatar2个字段 认证:采用第三方库simplejwt生成token,序列化用的djoser中的序列化 权限:采用Django原生的IsAuthenticated 筛选:采用第三方...
ORM与数据库:学习Django中ORM的使用、常用数据库操作和其他数据库工具。 Form表单:交互式表单设计,包括数据验证和与数据库的交互。 Admin的使用:管理后台的基本配置和功能开发。 用户权限管理:用户注册、登录、...
Cerberus访问控制 基于Django本体的访问控制模块 执照 根据许可获得许可的软件。 安装 pip install django-cerberus-ac 文献资料 发展 要运行所有测试: tox
它处理用户帐户,组,权限和基于cookie的用户会话。 Django身份验证系统同时处理身份验证和授权。 简要地说,身份验证将验证用户是他们声称的身份,而授权则确定允许经过身份验证的用户执行的操作。 基本上,我们将...
* 更改了用户部分的代码,将原来手动设置session的方式去掉了,替换为Django用户模块默认的登录态保存方式. * 修复了注册用户时用户提交空密码可能造成的安全漏洞。 * 做了对python3的支持。改动不多。 ### 项目...
django-spms django-spms是一个基于Django + AdminLTE的框架,集成了RBAC权限管理,账户管理, JWT认证, 多站点统一登录CAS,基于DRF的API等模块,并集成第三方Celery,pycharts, ckeditor,mdeditor模块,拥有...
(3)临时订单:临时订单中用户可以查看订单,但并无操作权限,需要更高级别权限便可操作审核 (4)正式订单:正式订单包括货物id,状态,产品名等,用户可以进行具体的订单修改 货物管理模块:用户可以对公司货物...
登录后,用户可以根据自己的角色和权限,访问相应的功能模块。 电子产品信息展示:系统中展示了各种电子产品的信息,比如产品名称、型号、描述、价格等。用户可以在系统中浏览并查看详情。 检索查询:用户可以使用...