原文地址: https://www.tony-yin.site/201...
CAS
單點登陸主要是爲了解決主系統和子系統的統一登陸問題,可以作到任意一個子系統登陸成功後,再登陸其餘子系統後再也不須要認證,讓用戶不用重複地進行登陸認證。CAS
單點登陸的方案不少,而且大多數都是採用session
的方式,而本文結合我的實踐,着重討論django cas token
的解決方案。html
本方案中,cas
客戶端和服務端都採用了開源項目,服務端是django-mama-cas,而客戶端是django-cas-ng。python
服務端相比於客戶端要簡單地多,根據github
步驟一步步下載和配置就好。git
pip install django-mama-cas
# settings.py INSTALLED_APPS = ( 'mama_cas', ) # 重要!,service是client的IP,是個數組,能夠在後面添加SERVICE的HOST:PORT。 MAMA_CAS_SERVICES = [ { 'SERVICE': 'http://127.0.1.1:8000', 'CALLBACKS': [ 'mama_cas.callbacks.user_model_attributes', # 返回除了password的全部Field # 'mama_cas.callbacks.user_name_attributes', # 只返回 username ], 'LOGOUT_ALLOW': True, 'LOGOUT_URL': 'http://127.0.1.1:8000/accounts/callback', }, ] # urls.py url(r'', include('mama_cas.urls')),
首先是一些基本的客戶端配置,好比server ip
等,可是django-cas-ng
默認是經過session
的方式認證的,而咱們須要經過token
的方式認證,因此若是想繼續用django-cas-ng
來解決問題,那要麼查看它是否有原生支持的接口,要麼改源碼。改源碼可能不大友好,因此我優先研究了一下django-cas-ng
的原生支持,無心中發現view-wrappers-example能夠繼承它原生的登陸接口作一些封裝,而咱們徹底經過繼承原生的登陸方法,而後加入咱們的token
相關代碼。因此urls.py
裏面登陸的方法咱們寫的是咱們寫在view.py
中封裝的登陸方法,而並不是默認的。github
# settings.py INSTALLED_APPS = ( # ... other installed apps 'django_cas_ng', ) AUTHENTICATION_BACKENDS = ( 'django_cas_ng.backends.CASBackend', ) # 注意:這是cas server的地址 CAS_SERVER_URL = 'http://127.0.0.1:8000' # 存入全部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
當中。django
本文主要爲CAS Token
方案提供一個思路,若是集成進已有項目中,確定會遇到不少細節問題,不過萬變不離其宗,咱們首先要熟悉手中運用的工具,而後要善於在此基礎之上根據本身的定製需求進行開發,多看看文檔和源碼,每一次可能都會有新的發現。數組