1. 程式人生 > >django使用者認證元件

django使用者認證元件

使用者認證 

auth模組

1 from  django.contrib  import  auth

django.contrib.auth中提供了許多方法,這裡主要介紹其中的三個:

1.1 、authenticate()   

提供了使用者認證,即驗證使用者名稱以及密碼是否正確,一般需要username  password兩個關鍵字引數

如果認證資訊有效,會返回一個  User  物件。authenticate()會在User 物件上設定一個屬性標識那種認證後端認證了該使用者,且該資訊在後面的登入過程中是需要的。當我們試圖登陸一個從資料庫中直接取出來不經過authenticate()的User物件會報錯的!!

1 user 
=  authenticate(username = 'someone' ,password = 'somepassword' )

1.2 、login(HttpRequest, user)  

該函式接受一個HttpRequest物件,以及一個認證了的User物件

此函式使用django的session框架給某個已認證的使用者附加上session id等資訊。

1 2 3 4 5 6 7 8 9 10 11 12 13 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 'invalid login' error message.      ...

1.3 、logout(request) 登出使用者  

1 2 3 4 5 from  django.contrib.auth  import  logout     def  logout_view(request):    logout(request)    # Redirect to a success page.

該函式接受一個HttpRequest物件,無返回值。當呼叫該函式時,當前請求的session資訊會全部清除。該使用者即使沒有登入,使用該函式也不會報錯。

User物件

User 物件屬性:username, password(必填項)password用雜湊演算法儲存到資料庫 

2.1 、user物件的 is_authenticated()

如果是真正的 User 物件,返回值恆為 True 。 用於檢查使用者是否已經通過了認證。
通過認證並不意味著使用者擁有任何許可權,甚至也不檢查該使用者是否處於啟用狀態,這只是表明使用者成功的通過了認證。 這個方法很重要, 在後臺用request.user.is_authenticated()判斷使用者是否已經登入,如果true則可以向前臺展示request.user.name

要求:

1  使用者登陸後才能訪問某些頁面,

2  如果使用者沒有登入就訪問該頁面的話直接跳到登入頁面

3  使用者在跳轉的登陸介面中完成登陸後,自動訪問跳轉到之前訪問的地址

方法1:

1 2 3 def  my_view(request):    if  not  request.user.is_authenticated():      return  redirect( '%s?next=%s'  %  (settings.LOGIN_URL, request.path))

方法2:

django已經為我們設計好了一個用於此種情況的裝飾器:login_requierd()

1 2 3 4 5 from  django.contrib.auth.decorators  import  login_required        @login_required def  my_view(request):    ...

若使用者沒有登入,則會跳轉到django預設的 登入URL '/accounts/login/ ' (這個值可以在settings檔案中通過LOGIN_URL進行修改)。並傳遞  當前訪問url的絕對路徑 (登陸成功後,會重定向到該路徑)。

2.2 、建立使用者

使用 create_user 輔助函式建立使用者:

1 2 from  django.contrib.auth.models  import  User user  =  User.objects.create_user(username = ' ',password=' ',email=' ')

2.3 、check_password(passwd)

1 使用者需要修改密碼的時候 首先要讓他輸入原來的密碼 ,如果給定的字串通過了密碼檢查,返回  True

2.4 、修改密碼

使用 set_password() 來修改密碼

1 2 3 user  =  User.objects.get(username = '') user.set_password(password = '') user.save 

2.5 、簡單示例

註冊:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 def  sign_up(request):        state  =  None      if  request.method  = =  'POST' :            password  =  request.POST.get( 'password' , '')          repeat_password  =  request.POST.get( 'repeat_password' , '')          email = request.POST.get( 'email' , '')          username  =  request.POST.get( 'username' , '')          if  User.objects. filter (username = username):                  state  =  'user_exist'          else :                  new_user  =  User.objects.create_user(username = username, password = password,email = email)                  new_user.save()                    return  redirect( '/book/' )      content  =  {          'state' : state,          'user' None ,      }      return  render(request,  'sign_up.html' , content)  

修改密碼:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 @login_required def  set_password(request):      user  =  request.user      state  =  None      if  request.method  = =  'POST' :          old_password  =  request.POST.get( 'old_password' , '')          new_password  =  request.POST.get( 'new_password' , '')          repeat_password  =  request.POST.get( 'repeat_password' , '')          if  user.check_password(old_password):              if  not  new_password:                  state  =  'empty'              elif  new_password ! =  repeat_password:                  state  =  'repeat_error'              else :                  user.set_password(new_password)                  user.save()                  return  redirect( "/log_in/" )          else :              state  =  'password_error'      content  =  {          'user' : user,          'state' : state,      }      return  render(request,  'set_password.html' , content)