Django 认证系统
Django的认证同时提供认证和授权功能,并统称为授权系统,因为这些特性在某些方面是重合的。
User_object
User object是认证系统的核心。它通常表示与站点进行交互的用户,并用于启用限制访问、注册用户信息和给创建者关联内容等。
在Django的认证框架中只存在一种类型的用户,因此诸如'superusers'或 admin 'staff' users只是具有特殊属性设置的user object,而不是不同类型的user object。
The primary attributes of the default user are:
- username
- password
- first_name
- last_name
当然我们也可以extend default user table for more attributes, i.e images ...
Create user
the most dirct way to create users is to use the included create_user() helper function:
>>>from django.contrib.auth.models import User
>>>user_obj = User.objects.create_user("alex", "alex@oldboy.com", "alexpassword")
>>>user_obj.last_name = "Lennon"
>>>user_obj.save()
Create superuser
$ python manage.py createsuperuser --username=joe --email=joe@example.com
Change password
Django不会在User model中存储原始(文明)密码,仅仅是一个hash密码。因此不要尝试直接对用户的密码进行操作,这就是为什么创建一个用户需要使用辅助函数。
修改用户的密码,你可以有几种选择:
1、manage.py changepassword *username*
2、你也可以使用程序来修改密码, set_password():
>>>from django.contrib.auth.models import User
>>>user_obj = User.objects.get(username="alex")
>>>user_obj.set_password("alex new password")
>>>user_obj.save()
3、使用make_password()方法来生成密码(from django.contrib.auth.hashers import make_password).
4、可以直接在admin管理界面修改密码。
认证 User
authenticate(**credentials)
使用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.")
Permission and Authorization
Django本身提供了一个简单的权限系统。它提供一种分配权限给特定的用户和用户组的方法。它被Django的admin site使用,但欢迎你在自己的代码中使用。
权限不但可以根据每个对象的类型,而且可以根据特定的对象实例设置。通过使用ModelAdmin类提供的has_add_permission()、has_change_permission()和has_delete_permission()方法,可以针对相同类型的不同对象实例自定义权限。
User对象具有两个多对多的字段:groups和user_permissions。User对象可以用和其它Django Model一样的方式访问它们相关的对象:
myuser.groups = [group_list] myuser.groups.add(group, group, ...) myuser.groups.remove(group, group, ...) myuser.groups.clear() myuser.user_permissions = [permission_list] myuser.user_permissions.add(permission, permission, ...) myuser.user_permissions.remove(permission, permission, ...) myuser.user_permissions.clear()
Authentication in Web requests
Django使用Session中间件来拦截request 对象到认证系统中。
它们在每个请求上提供一个request.user属性,表示当前的用户。如果当前的用户没有登入,该属性将设置成AnonymousUser的一个实例,否则它将是User的实例。
你可以通过is_authenticated()区分它们,像这样:
if request.user.is_authenticated(): # Do something for authenticated users. ... else: # Do something for anonymous users. ...
How to log a user in
如果你有一个认证了的用户,你想把它附带到当前的会话中 - 这可以通过login()函数完成。
- login()
-
从视图中登入一个用户,请使用login()。它接受一个HttpRequest对象和一个User对象。login()使用Django的session框架来将用户的ID保存在session中。
注意任何在匿名会话中设置的数据都会在用户登入后的会话中都会记住。
下面的示例向你演示如何使用authenticate() 和login():
from django.contrib.auth import authenticate, login def my_view(request): username = request.POST['username'] password = request.POST['password'] user = authenticate(request, username=username, password=password) if user is not None: login(request, user) # Redirect to a success page. ... else: # Return an 'invalid login' error message. ...
How to log a user out
logout
(request)-
To log out a user who has been logged in via
django.contrib.auth.login()
, usedjango.contrib.auth.logout()
within your view. It takes anHttpRequest
object and has no return value.
- 未完待续。。。
-