默认情况下Django认证系统的使用
- Django支持扩展和自定义认证
- Django的认证同时提供认证和授权,并通常统一称为认证系统,因为这些功能某些地方是耦合的
Use对象
User对象是认证系统的核心。它们通常表示与你的站点进行交互的用户,并用于启用限制访问、注册用户信息和给创建者关联内容等。在Django的认证框架中只存在一种类型的用户,因此诸如’superusers’或管理员’staff’用户只是具有特殊属性集的user对象,而不是不同类型的user对象。
默认user的基本属性有:
- username
- password
- first_name
- last_name
创建users
- 创建users最直接的方法就是使用create_user()辅助函数:
>>> from django.contrib.auth.models import User
>>> user = User.objects.create_user('john', 'lennon@thebeatles.com', 'johnpassword')
# At this point, user is a User object that has already been saved
# to the database. You can continue to change its attributes
# if you want to change other fields.
>>> user.last_name = 'Lennon'
>>> user.save()
- 如果你已经安装了Django admin,你也可以交互式地创建users.
创建superusers
使用createsuperuser命令创建superusers:
$ python manage.py createsuperuser --username=joe --email=joe@example.com
将会提示你输入一个密码。在你输入一个密码后,该user将会立即创建。如果不带–username和–email选项,将会提示你输入这些值。
修改密码
修改密码有以下几种选择:
- manage.py changepassword * uername *提供一种命令行修改User密码的方法。它提示你修改一个给定user的密码,你必须输入两次。如果它们匹配,新的密码将会立即修改。如果你没有提供user,命令行将尝试修改与当前系统用户匹配的用户名的密码。
- 你也可以通过程序修改密码,使用set_password():
>>> from django.contrib.auth.models import User
>>> u = User.objects.get(username='john')
>>> u.set_password('new password')
>>> u.save()
Django中User的一些常用的方法
认证Users
authenticate(**credentials)[source]
- 请使用authenticate(),认证一组给定的用户名和密码。它接收关键字参数形式的凭证,使用默认配置时参数是username和password,如果密码能够匹配给定的用户名,它将返回一个User对象。如果密码无效,authenticate()返回None。例子:
from django.contrib.auth import authenticate
user = authenticate(username='john', password='secret')
if user is not None:
# the password verified for the user
if user.is_active:
print("User is valid, active and authenticated")
else:
print("The password is valid, but the account has been disabled!")
else:
# the authentication system was unable to verify the username and password
print("The username and password were incorrect.")
- 注意:这是认证一系列凭证的初级的方法;例如,它被RemoteUserMiddleware使用。除非你正在编写你自己的认证系统,否则你可能不会使用到它。当然如果你在寻找一种登录user的方法,请参见login_required()装饰器。
Web请求中的认证
- Django使用会话和中间件来拦截request对象到认证系统中。
- 它们在每个请求上提供一个request.user属性,表示当前的用户。如果当前的用户没有登入,改属性将设置User的实例。
你可以通过is_authenticated()区分它们,像这样:
if request.user.is_authenticated():
# Do something for authenticated users.
...
else:
# Do something for anonymous users.
...
如何登录一个用户
如果你有一个authenticated(认证:即经过了登录校验)了的用户,你想把它附着到当前的session(会话)中-这可以通过**login()**函数完成
login()[source]
- 从view(视图)中登入一个用户,请使用login()。它接收一个HttpRequest对象和一个User对象。login()使用Django的session框架来将用户的ID进行保存在session中。
- 注意:任何在匿名session中设置的数据,都会在用户登入后被保留在session总。
下面的实例向你演示如何使用authenticate()和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:
if user.is_active:
login(request, user)
# Redirect to a success page.
else:
# Return a 'disabled account' error message
...
else:
# Return an 'invalid login' error message.
...
- 先调用authenticate():
- 当你是手动(即非自动的,通过人工输入)登入一个用户时,你必须在调用login()之前通过authenticate()确认该用户已经成功登陆。authenticate()在用户上设置一个属性,通过这个属性,authentication backend(后端认证程序)可以验证该用户已经成功地登陆(相关的详细信息,请参阅后端文档),并且,这个信息在后面的登录过程中仍然需要。如果你试图(不经认证)直接login(登入)一个从数据库中取出的user object(用户对象),将会有出错提示。
如何登出一个用户
logout()[source]
- 若要登出一个已经通过django.contrib.auth.login()登入的用户,可以在你的视图中使用django.contrib.auth.logout()。 它接收一个HttpRequest对象且没有返回值。例如:
from django.contrib.auth import logout
def logout_view(request):
logout(request)
# Redirect to a success page.
- 注意,即使用户没有登入,logout()也不会抛出任何错误。
- 当你调用logout()时,当前请求的会话数据将被完全清除。所有存在的数据都将清除。这是为了防止另外一个人使用相同的Web浏览器登入并访问前一个用户的会话数据。如果你想在用户登出之后>可以立即访问放入会话中的数据,请在调用django.contrib.auth.logout()之后放入。
只允许登录的用户访问
- 如果是函数的话,可以使用Django的login_required装饰器
- 如果是类的话,可以使用Django中mixin的as_view()方法