1. 程式人生 > >python3.5+django+django_cas_ng+python_cas 接入cas server(https)

python3.5+django+django_cas_ng+python_cas 接入cas server(https)

這兩天廢了九牛二虎之力完成了python3.5接入cas server, 廢話少說,步驟如下:

1.基礎環境

python 3.5.4
django 2.0
對接的cas server  3.5.2
     注:cas對外提供的是https python的環境算是比較新的了,所以坑比較多。cas我偷懶了用了個老版本

2、django對接cas環境的安裝

  (1)安裝python-cas,這個建議下載1.2.0版本以上的     1.2.0版本的連結:https://pypi.python.org/pypi/python-cas/1.2.0     然後 解壓---> python setup.py install   (2)安裝django_cas_ng 這個建議3.5.8以上,這時候坑就來了    3.5.8版本的連結: https://pypi.python.org/pypi/django-cas-ng    然後 解壓 ---> python setup.py install    -------------------------------------------------------------------------------------------------
   這時候你要看django的日誌了,因為很可能會報錯的     1、如果出現ImportError: cannot import name 'CASClient'       說明你的python-cas安裝不成功,或者是版本太低     2、TypeError: __init__() missing 1 required positional argument: 'on_delete'         找到你的python安裝包的路徑下的site-packages/django_cas_ng-3.5.0-py3.5.egg/django_cas_ng/models.py         修改為:    
unique_together = ('session_key', 'user')
    session_key = models.CharField(max_length=255, blank=True, null=True)
    user = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        related_name="+",
        null=True,
        blank=True,on_delete=models.PROTECT
    )
   3、django_cas_ng.ProxyGrantingTicket.date: (fields.E160) The options auto_now, auto_now_add, and default are       mutually exclusive. Only one of these options may be present.      找到你的python安裝包的路徑下的site-packages/django_cas_ng-3.5.0-py3.5.egg/django_cas_ng/models.py      修改:         找到31行,刪除前面的add_now部分,最後:       
pgtiou = models.CharField(max_length=255, null=True, blank=True)
pgt = models.CharField(max_length=255, null=True, blank=True)
date = models.DateTimeField(auto_now_add=True)
   4、AttributeError: module 'django_cas_ng' has no attribute 'views'     找到你報錯的url.py,     修改:     import django_cas_ng.views    -------------------------------------------------------------------------------------------------  (3)配置的setting.py,其中AUTHENTICATION_BACKENDS可能沒有,需要你自行新增
INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django_cas_ng',
    ...
)

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    ...
)

AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.ModelBackend',
    'django_cas_ng.backends.CASBackend',
)
新增 CAS_SERVER_URL="cas server的地址"
新增 CAS_REDIRECT_URL="你網站的主頁"
  (4)配置url.py,增加  
    url(r'^accounts/login$', django_cas_ng.views.login, name='cas_ng_login'),
    url(r'^accounts/logout$', django_cas_ng.views.logout, name='cas_ng_logout'),
url(r'^accounts/callback$', django_cas_ng.views.callback, name='cas_ng_proxy_callback'),
  (5)配置資料庫      首先檢視你的資料庫是否有,下表:         auth_group                
        auth_group_permissions    
        auth_permission           
        auth_user                 
        auth_user_groups          
        auth_user_user_permissions      要是沒有的話請執行:      python manager.py makemigrations      python manager.py migrate      然後檢視是否有:      django_cas_ng_proxygrantingticket      django_cas_ng_sessionticket      要是沒有的話,請執行:      python manager.py makemigrations  django_cas_ng      python manager.py migrate    django_cas_ng   (6)    要是你的cas server 是http的,現在你就可以訪問http://django的ip+port/accounts/login,要是轉到cas上,就說明你成功了    要是你的cas server 是https的,請在django的主機是新增環境變數    export REQUESTS_CA_BUNDLE="證書的路徑"    這裡的證書必須是PEM格式的,否則會報requests.exceptions.SSLError: unknown error (_ssl.c:3165)    如果你的證書使用keytool轉換的,請再用下面的命令把之前的證書轉換為PEM格式的
openssl x509 -inform der -in server.cer -out server.pemaccounts/login
   到此配置完畢,你可以訪問http://django的ip+port/accounts/login,要是轉到cas上,就說明你成功了