cas單點登入主要是為了解決主系統和子系統的統一登入問題,能夠做到任意乙個子系統登入成功後,再登入其他子系統後不再需要認證,讓使用者不用重複地進行登入認證。cas單點登入的方案很多,並且大多數都是採用session的方式,而本文結合個人實踐,著重討論django cas token的解決方案。
本方案中,cas客戶端和服務端都採用了開源專案,服務端是django-而客戶端是django-cas-ng。
cas server
服務端相比於客戶端要簡單地多,根據github步驟一步步**和配置就好。
**pip install django-mama-cas
配置# setting
installed_apps = (
'mama_cas',
)# 重要!,service是client的ip,是個陣列,可以在後面新增service的host:port。
mama_cas_services = [
,]# urls.py
url(r'', include('mama_cas.urls')),
client
首先是一些基本的客戶端配置,比如server ip等,但是django-cas-ng預設是通過session的方式認證的,而我們需要通過token的方式認證,所以如果想繼續用django-cas-ng來解決問題,那要麼檢視它是否有原生支援的介面,要麼改原始碼。改原始碼可能不大友好,所以我優先研究了一下django-cas-ng的原生支援,無意中發現view-wrappers-example可以繼承它原生的登入介面做一些封裝,而我們完全通過繼承原生的登入方法,然後加入我們的token相關**。所以urls.py裡面登入的方法我們寫的是我們寫在view.py中封裝的登入方法,而並非預設的。
# settings.py
installed_apps = (
# ... other installed apps
'django_cas_ng',
)authentication_ba = (
'django_cas_ng.backends.casbackend',
)# 注意:這是cas server的位址
cas_server_url = ''
# 存入所有cas 服務端返回的user資料。
cas_apply_attributes_to_user = true
# urls.py
import view import *
url(r'^accounts/login$', cas_login, name='cas_login'),
#view.py
from django_cas_ng import views as baseviews
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def cas_login(request, **kwargs):
r = baseviews.login(request, **kwargs)
if not request.user.is_anonymous():
token = get_token(request)
if token:
r.set_cookie('token', token)
else:
print 'get token error'
else:
print('user is anonymous')
return r
def get_token(request, *args, **kwargs):
user = request.user
try:
request_hash = authtoken.get_request_hash(request)
try:
token = generate_token() # function used to geneate token, this place won't show more detail codes
token.refresh()
except indexerror:
pass
except exception as e:
print e
return false
return token.key
生成token的方法我就不詳細描述了,這邊主要提供了乙個思路,我們將django-cas-ng原生的登入方法進行了繼承,然後生成token並放到了session當中。
總結本文主要為cas token方案提供乙個思路,如果整合進已有專案中,肯定會遇到很多細節問題,不過萬變不離其宗,我們首先要熟悉手中運用的工具,然後要善於在此基礎之上根據自己的定製需求進行開發,多看看文件和原始碼,每一次可能都會有新的發現。
refer
使用django-mama-cas快速搭建cas服務
django實現cas+oauth2
本文標題: 詳解django cas 解決方案
本文位址:
mysql 解決方案 Mysql解決方案
mysql解決方案 一 centos7安裝mysql5.7 wget rpm uvh mysql80 community release el7 3.noarch.rpm yum repolist all grep mysql 發現預設mysql8.0是預設安裝的,然而我們要安裝的是mysql5.7...
OSSIM解決方案
大多數主流安全產品針對的是計算機單一安全缺陷,他們更多的是提供某一單獨的安全保護功能。目前安全領域內還沒有一套相對完整系統安全解決方案,而且由於主流商業安全軟體的閉源特性,讓我們對其自身的安全特性也不能夠完全信服。隨著軟體開源趨勢的不斷推進,現在出現了很多甚至可以說效能毫不遜色於任何商業軟體的安全工...
android OOM解決方案
解決oom的常用方案 記憶體限制是android對應用的乙個系統級限制,作為應用層開發人員,沒有辦法徹底去消滅這個限制,但是可以通過一些手段去合理使用記憶體,從而規避這個問題。以下是個人總結的一些常用方法 1 快取影象到記憶體,採用軟引用快取到記憶體,而不是在每次使用的時候都從新載入到記憶體 2 調...