Django Auth登陆认证

Apr 28, 2015


之前研究了登录和登出逻辑,但是具体登陆处理函数没有给出,当不仅仅满足于Django自带的登录函数功能时,需要重写验证模式,自己研究并试用了下,暂时只更改改验证模式,而不更改user的属性,具体方式如下:


model

  • 我们使用新的model来进行用户验证,而代替Django自带的User model

  • 在任意app的model中加入新的账户类如account1类,同时定义一个类中的函数

    
     def is_authenticated(self):
          return True
      

认证函数

  • 认证过程中使用我们自己编写的model,但是返回时依旧返回User

  • 编写AuthBackend类,需要实现get_user和authenticate方法。

    
      class AuthBackend(object):
      def get_user(self,id):
          try:
              user=User.objects.get(pk=id)
          except:
              user=None
          return user
    
      def authenticate(self,username,password):
          try:
              user=Account1.objects.get(username=username)
              if password==user.shanyunji:
                  return User.objects.get(username=username)
              else:
                  return None
          except:
              return None
      

配置

  • 编写好的AuthBackend类需要加入到settings中,在AUTHENTICATION_BACKENDS中加入自己编写好的类。

  • AUTHENTICATION_BACKENDS中会依照顺序进行验证,如果第一个验证通过则通过,否则尝试下一个,只有所有认证都失败才失败。


另一种方法

  • 我们只需要更改Django默认登录验证中的authenticate函数即可,具体方法如下:

    
      from django.contrib import auth
    
      def login_view(request):
      username = request.POST.get('username', '')
      password = request.POST.get('password', '')
      user = auth.authenticate(username=username, password=password)
      if user is not None and user.is_active:
          auth.login(request, user)
          return HttpResponseRedirect("/account/loggedin/")
      else:
          return HttpResponseRedirect("/account/invalid/")
      
  • 登出方法更为简单:

    
              auth.logout(request)