前面我們在登入的時候,是通過輸入使用者名稱和密碼來進行認證
user=authenticate(username=cd['username'],password=cd['password'])
這個是通過後台設定的django.contrib.auth.backends.modelbackend來生效的。預設的modelbackend
通過資料庫使用
django.contrib.auth
中的user
模型(model
)來認證(
authentication
)使用者。
當你使用django.contrib.auth
的authenticate()
函式,django
會通過每乙個定義在
authentication_backends
中的後台乙個接乙個地嘗試認證(
authentication
)使用者,直到其中有乙個後台成功的認證該使用者才會停止進行認證。只有所有的後台都無法進行使用者認證(
authentication
),他或她才不會在你的站點中通過認證(
authentication
)。django提供了乙個簡單的方法來定義你自己的認證(
authentication
)後台。乙個認證(
authentication
)後台就是提供了如下兩種方法的乙個類:
但是如果我們想通過其他方式進行認證,比如註冊的郵箱來認證。我們就需要建立乙個認證(authentication
)後台讓使用者在我們的站點中使用他們
替代他們的使用者名稱來進行認證(
authentication
)。在blog
應用中新增乙個
authentication.py
檔案,**如下:
from django.contrib.auth.models import user
class emailauthbackend(object):
def authenticate(self,username=none,password=none):
try:
user_list=user.objects.filter(email=username)
print len(user_list)
if len(user_list) > 1:
user=user_list[0]
else:
user=user_list
if user.check_password(password):
return user
return none
except user.doesnotexist:
return none
def get_user(self,user_id):
try:
return user.objects.get(pk=user_id)
except user.doesnotexist:
pass
return none
在這裡通過user_list=user.objects.filter(email=username)得到所有通過email
註冊的使用者。這裡由於其面在新增使用者的時候都是通過輸入相同的
位址,所以這裡採用了
user.objects.filter
函式,如果每個使用者的郵箱位址不一樣,則通過
user.objects.get
函式來獲得使用者就可以了。
以上**完成了以下工作內容:
authentication_backends=(
'django.contrib.auth.backends.modelbackend',
'blog.authentication.emailauthbackend'
通過這種設定,我們保留預設的modelbacked
用來保證使用者仍然可以通過使用者名稱和密碼進行認證,接著我們包含進了我們自己的
email-based
認證(authentication
)後台那麼在登入介面中,在username
中輸入使用者名稱和郵箱都可以通過驗證。
下面介紹第三方認證:
'social_django', )
中新增應用(
settings.py
)更新資料庫:
python manage.py migrate
在認證後端新增qq
認證以及
qq互聯的
key和id(
settings.py
). 注意:這個
key和
id需要到
qq去申請
authentication_backends = (
'social_core.backends.qq.qqoauth2',
social_auth_qq_secret = 'you qq seckey ,combined by letter with number,for examle: f123bas324' # qq secrect_key
social_auth_qq_use_openid_as_username = true
新增根urls.py
的url
路由 urlpatterns = [
url('', include('social_django.urls', namespace='social'))
在需要登入的地方加上如下**:
qq登入
settings.py中的tempaltes如下:
templates = [
'options': {
'context_processors': [
'social_django.context_processors.backends',
'social_django.context_processors.login_redirect',
SpringSecurity自定義登入認證
spring security預設的登入表單只有username和password,但實際業務中我們可能需要使用其他的字段校驗,因此需要重寫認證部分。springsecurityfilterchain org.springframework.web.filter.delegatingfilterpr...
Django 之自定義頭部資訊
當我們使用 django 來搭建一套網頁系統,有時候我們會需要在網頁裡加入一些資訊,比如宣示版權之類的資訊,而如果在每乙個需要渲染的頁面都加上這些資訊,會比較麻煩。而在 django 裡有乙個中介軟體 middleware 可以幫助我們實現這個功能而不需要在每乙個返回的 html 頁面都手動加上。使...
Django之自定義分頁元件
from django.utils.safestring import mark safe mark safe 安全字串 class mypage def init self,page num,page num count,req path,per page num,page num show se...