django身份认证学习笔记

  • 创建superuser

python manage.py createsuperuser --username=joe [email protected]

  • 修改密码

1
2
3
4
5

>>> from django.contrib.auth.models import User
>>> u = User.objects.get(username='john')
>>> u.set_password('new password')
>>> u.save()
  • 认证Users

authenticate

使用默认配置时的参数是username 和 password, 如果密码能够匹配给定的用户名,他就返回一个User对象. 如果密码无效,那么authenticate 就返回None.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

username, password = request.POST['username'], request.POST['password']

user = authenticate(username=username, password=password)



# 判断账号密码是否匹配

if user is not None:

#判断用户是否被激活

if user.is_active:

# 登录user

login(request, user)

return render(request, "index.html", {"Auth": request.user})

return HttpResponse("User not active!Concat the website administrator!")

return HttpResponse("Not Current User!")
  • Web请求中的认证

djang在请求(request)上, 提供一个request.user属性,表示当前用户,如果用户没有登入,

该属性将设置成匿名用户(AnonymousUser)的一个实例, 可以用is_authenticated()来判断是否登入.

1
2
3
4
5
6

if request.user.is_authenticated():

return render(request, "index.html", {"Auth": request.user})

return render(request, "login.html")
  • 用户的登入与登出

login(HttpResponse对象, User对象) 与 logout(HttpResponse对象, User对象)

from django.contrib.auth import login, logout

登入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

user = authenticate(username=username, password=password)

if user is not None:

if user.is_active:

login(request,user)

else:

......

else:

...

登出

logout(request)

  • 只允许登入用户访问

login_required 装饰器

此处用Decorating the class 装饰类, 此处不直接用login_required() 函数装饰器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

from django.contrib.auth.decorators import login_required

from django.utils.decorators import method_decorator



class UserLook(View):



@method_decorator(login_required(login_url='/'))

def get(self, request):

return render(request, 'login.html', )

如果此处没有对login_url 进行定义, 那就需要确保settings.LOGIN_URL与你的登录视图正确关联, 例如,使用默认值,可以添加下面几行到你的URLconf种:

    from django.contrib.auth import views as auth_views

url(r'^accounts/login/$', auth_views.login),
  • 给已验证的用户添加访问限制 (只允许特定用户访问某些特定页面)

    request.user.email.endswith('@example.com') 返回True/False
    或者使用 user_pass_test(func[,login_url=None,....])
    1
    2
    3
    4
    5
    6
    7
    8
    from django.contrib.auth.decorators import user_passes_test

    def email_check(user):
    return user.email.endswith('@example.com')

    @user_passes_test(email_check)
    def my_view(request):
    ...