Django CAS 解決方案

原文地址: https://www.tony-yin.site/201...

cas

CAS單點登陸主要是爲了解決主系統和子系統的統一登陸問題,可以作到任意一個子系統登陸成功後,再登陸其餘子系統後再也不須要認證,讓用戶不用重複地進行登陸認證。CAS單點登陸的方案不少,而且大多數都是採用session的方式,而本文結合我的實踐,着重討論django cas token的解決方案。html

本方案中,cas客戶端和服務端都採用了開源項目,服務端是django-mama-cas,而客戶端是django-cas-ngpython

CAS Server

服務端相比於客戶端要簡單地多,根據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')),

Client

首先是一些基本的客戶端配置,好比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方案提供一個思路,若是集成進已有項目中,確定會遇到不少細節問題,不過萬變不離其宗,咱們首先要熟悉手中運用的工具,而後要善於在此基礎之上根據本身的定製需求進行開發,多看看文檔和源碼,每一次可能都會有新的發現。數組

Refer

  1. 使用django-mama-cas快速搭建CAS服務
  2. Django實現CAS+OAuth2
相關文章
相關標籤/搜索