auth 模塊的知識點,javascript
一,用戶認證html
1,建立超級用戶(此步之因此這麼作,是用於將用戶名密碼使用命令寫入auth_user表中java
(此表不能手工寫,由於password是加密後的字串))python
python manage.py createsuperuser算法
輸入用戶名 xiaohei數據庫
輸入郵箱。。。。django
輸入密碼xiaohei1234session
去數據庫裏就能看到auth插件,auth_user表對應的信息了ide
二,views.py中的核心代碼函數
2.1導入模塊
from django.contrib import auth
2.2 驗證用戶名和密碼(若是驗證成功返回的是一個user對象,若是驗證失敗則獲得一個匿名用戶,此用戶全部屬性是null)
user=auth.authenticate(username=username1,password=pwd)
2.3 將以上經過驗證的user用戶ID保存在session中,供auth中間件使用
auth.login(request,user)
2.4
後面會用於中間件,將user封裝到request.user的屬性中
'django.contrib.auth.middleware.AuthenticationMiddleware', ------中間件
如下第二步驟代碼概括以下:
from django.contrib import auth def login(request): if request.method=='POST': username1=request.POST.get('username') pwd=request.POST.get('password') # 如何判斷用戶名和密碼呢 # 如下是使用auth模塊,去數據庫裏查詢用戶信息,驗證是否存在 user=auth.authenticate(username=username1,password=pwd) # 如下語句,其實仍是將以上得到認證的用戶ID保存在SESSION中,#用於後面每一個頁面根據此SESSION裏的ID,獲取用戶信息驗證,並給auth中間件使用 auth.login(request,user) # 用於之後在調用每一個視圖函數前,auth中間件會根據每次訪問視圖前請求所帶的SEESION裏面的ID,去數據庫找用戶對像,並將對象保存在request.user屬性中 # 中間件執行完後,再執行視圖函數 if user: return redirect('/index/') else: return redirect('/login/') return render(request,'login.html')
三,須要進行驗證頁面的驗證(使用auth模塊裏的裝飾器login_required)
from django.contrib.auth.decorators import login_required # 以上導入的就是一個裝飾器,用於驗證(咱們須要用戶登陸後,才能訪問,不然就跳轉到另外的頁面) # 這個另外的頁面就默認的是/accounts/login/ 咱們也也以自定義要跳轉的地方,在settins.py中LOGIN_URL # 例如如下頁面須要登陸成功才能訪問 @login_required def index(request): print(request.user.username) print('===='*12) return render(request,'index.html')
四,若是沒有登陸則跳轉到另外的頁面,這個頁面是能夠設置的,
# 這個另外的頁面就默認的是/accounts/login/ 咱們也也以自定義要跳轉的地方,在settins.py中LOGIN_URL settings.py文件中寫如下代碼,指定沒有登陸跳轉到登陸頁面 LOGIN_URL='/login/'
五,用戶註銷
如下是views.py註銷代碼
from django.contrib.auth.decorators import login_required # 以上導入的就是一個裝飾器,用於驗證(咱們須要用戶登陸後,才能訪問,不然就跳轉到另外的頁面) # 這個另外的頁面就默認的是/accounts/login/ 咱們也也以自定義要跳轉的地方,在settins.py中LOGIN_URL # 註銷,將session數據都刪除,而且coolies也失效,(即用戶退出登陸,並不銷戶清除數據庫裏user記錄哦。。) def logout(request): auth.logout(request) return redirect('/login')
六,註冊(建立用戶)
# 建立用戶,即註冊 def register(request): from django.contrib.auth.models import User User.objects.create_user(username='alex',password='alex1234') return HttpResponse('o98k')
調用register視圖函數後,即建立成功後,數據庫裏的auth_user表就有對應數據了,
User 對象屬性:
username, password(必填項)password用哈希算法保存到數據庫
is_staff : 用戶是否擁有網站的管理權限.
is_active : 是否容許用戶登陸, 設置爲``False``,能夠不用刪除用戶來禁止 用戶登陸
若是是真正的 User 對象,返回值恆爲 True 。 用於檢查用戶是否已經經過了認證。
經過認證並不意味着用戶擁有任何權限,這個方法甚至也不檢查該用戶是否處於激活狀態,只是代表用戶成功的經過了認證。
這個方法很重要, 在後臺用request.user.is_authenticated()判斷用戶是否已經登陸,若是true則能夠向前臺展現request.user.name
使用 create_user 輔助函數建立用戶:
from django.contrib.auth.models import User user = User.objects.create_user(username='',password='')
user = User.objects.create_superuser(username='',password='',email='')
## 說明:create_superuser參數必須有username,password,email不然會報錯,
## 建立普通用戶,參數只有username,password便可
check_password(passwd)
用戶須要修改密碼的時候,首先要讓其輸入原來的密碼 ,若是給定的值經過了密碼檢查,返回 True
使用 set_password() 來修改密碼
user = User.objects.get(username='') user.set_password(password='') user.save()
def register(request): from django.contrib.auth.models import User # 建立用戶 user_obj=User.objects.create_user(username='alex6',password='alex1234') # 檢查密碼(通常用於修改密碼前驗證) ret=user_obj.check_password('alex12345') print(ret) #返回False # 修改密碼 user_obj.set_password('alex12345') # 修改後保存 user_obj.save() # 修改後再檢查 ret=user_obj.check_password('alex12345') print (ret) # 返回True return HttpResponse('o98k')
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)
@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)