others linux服务器运维 django3 监控 k8s golang 数据库 大数据 前端 devops 理论基础 java oracle 运维日志

CAS 单点登录 python django 案例演示

访问量:2028 创建时间:2021-02-24

参考文档:https://blog.csdn.net/u012887259/article/details/109635040

IP 角色
192.168.171.128 CAS server django3\ mariadb5.5
192.168.171.129 CAS client django3

环境安装

[root@cephadm ~]# yum -y install python36  gcc
[root@cephadm ~]# pip3 install django
[root@node1 ~]# yum -y install python3-devel mariadb-devel
[root@cephadm ~]# pip3 install mysqlclient
#192.168.171.128 机器yum 安装mariadb 5.5过程省略(可参考https://www.linuxsre.cn/wiki/django3/3#linuxmariadb)

CAS server安装

#128机器
[root@cephadm ~]# cd /opt/
[root@cephadm opt]# ll
total 0
[root@cephadm opt]# django-admin startproject django_cas_server
[root@cephadm opt]# pip3 install django-mama-cas


#配置django项目使用mama_cas
[root@cephadm opt]# cd django_cas_server/
[root@cephadm django_cas_server]# vim django_cas_server/settings.py 
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'mama_cas',  # < -------安装 mama_cas 应用
]
#.......省略其他内容


#配置 url,设置访问 cas 服务的路由
[root@cephadm django_cas_server]# vim django_cas_server/urls.py 
from django.contrib import admin
from django.urls import path,include #<----增加include方法
urlpatterns = [
    path('admin/', admin.site.urls),
    path('cas/', includ('mama_cas.urls')), #导入mama_cas的urls.py路由配置
]
####............省略其他行显示


###配置 CAS回调
[root@cephadm django_cas_server]# vim django_cas_server/settings.py
MAMA_CAS_SERVICES = [
    {
        ## 必填项,客户端允许访问的域名(客户端服务的地址,允许接入cas服务的客户端服务白名单,)
        #'SERVICE': '^https://[^\.]+\.example\.com',
        'SERVICE': 'http://192.168.171.129:8000',   #不要搞错IP否则会报403错误django.core.exceptions.PermissionDenied
        'CALLBACKS': [
            'mama_cas.callbacks.user_name_attributes',
        ],
        #'LOGOUT_ALLOW': True,
        #'LOGOUT_URL': 'https://www.example.com/logout',
        #'PROXY_ALLOW': True,
        #'PROXY_PATTERN': '^https://proxy\.example\.com',
    }
]

###创建数据库账号(在128服务器的mariadb上)
MariaDB [(none)]> create database cas DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> grant all on cas.* to 'cas'@'%' identified by 'mypassword';
Query OK, 0 rows affected (0.07 sec)

### 配置数据库
[root@cephadm django_cas_server]# vim django_cas_server/settings.py
ALLOWED_HOSTS = ['*']
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'cas',
        'USER': 'cas',
        'PASSWORD':'mypassword',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    }
}
###处理一个bug(初始化数据库报错:ImportError: cannot import name 'python_2_unicode_compatible')
[root@cephadm django_cas_server]# vim /usr/local/lib/python3.6/site-packages/mama_cas/models.py
#from django.utils.encoding import python_2_unicode_compatible  #<--注释
from six import python_2_unicode_compatible  #新增
[root@cephadm django_cas_server]# pip3 install six
###初始化数据库
[root@cephadm django_cas_server]# python3 manage.py migrate

####运行CASserver(这里演示不配置后台运行)
[root@cephadm django_cas_server]# python3 manage.py runserver 0.0.0.0:3000

####创建超级用户(也可以创建普通用户测试)
[root@cephadm django_cas_server]# python3  manage.py createsuperuser
Username (leave blank to use 'root'): root
Email address: 
Password: 
Password (again): 
This password is too short. It must contain at least 8 characters.
This password is too common.
This password is entirely numeric.
Bypass password validation and create user anyway? [y/N]: y
Superuser created successfully.

访问cas server测试(可以尝试登录), http://Cas Server IP:3000/cas/login

CAS 客户端演示

129 机器上创建cas客户端项目

[root@node1 ~]# cd /opt/
[root@node1 opt]# django-admin startproject django_cas_client
#安装client app,  官方文档https://djangocas.dev/docs/latest/configuration.html
[root@node1 opt]# pip3 install django-cas-ng


#修改setting.py
[root@node1 ~]# cd /opt/django_cas_client/
[root@node1 django_cas_client]# vim django_cas_client/settings.py 
ALLOWED_HOSTS = ['*']   ####此处修改
INSTALLED_APPS = [
    'django_cas_ng', #cas客户端应用
#...其他内容省略
]
MIDDLEWARE = [
#...其他内容省略
    'django_cas_ng.middleware.CASMiddleware', # 设置cas客户端的中间件类
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
# 指定授权认证的后端
AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.ModelBackend',
    'django_cas_ng.backends.CASBackend',
)
# CAS 服务的访问地址
CAS_SERVER_URL = 'http://192.168.171.128:3000/cas/'
# CAS 版本
CAS_VERSION = '3'
# 存入所有 CAS 服务端返回的 User 数据。
CAS_APPLY_ATTRIBUTES_TO_USER = True

###配置 cas客户端访问cas服务的视图 页面URl
[root@node1 django_cas_client]# vim django_cas_client/urls.py 
from django.contrib import admin
from django.urls import path
import django_cas_ng.views

urlpatterns = [
    path('login', django_cas_ng.views.LoginView.as_view(), name='cas_ng_login'),# 访问cas服务的登陆
    path('logout', django_cas_ng.views.LogoutView.as_view(), name='cas_ng_logout'),# 访问cas服务的登出
    path('admin/', admin.site.urls),
]

#####配置数据库,这一步省略,可以新建一个mysql库,然后初始化数据库python3 manage.py migrate
#####启动cas 客户端服务
[root@node1 django_cas_client]# python3 manage.py runserver 0.0.0.0:8000

说明:也就是说配置了这两个路径之后,具体操作过程如下: 访问客户端服务:http://192.168.171.129:8000/cas/login 判断如果未登陆服务,则自动重定向至 后台配置的 CAS 服务 http://192.168.171.128:3000/cas/login ,然后在 cas 服务器上登陆成功之后,重新重定向回客户端服务。 访问客户端服务:http://192.168.171.129:8000/cas/logout,则自动重定向至 后台配置的 CAS 服务 http://192.168.171.128:3000/cas/logout,则注销退出用户。

测试访问192.168.171.129:8000/login,会跳转到http://192.168.171.128:3000/ 登陆,等会后跳转会http://192.168.171.129:8000/,但是由于没写页面会报路由不存在问题,但是不影响测试。 再次访问http://192.168.171.129:8000/这个页面就不会再去登陆了; 129服务器上会自动创建在CAS登陆成功的用户。 如果退出用户, 访问http://192.168.171.128:3000/cas/logout即可。

登陆评论: 使用GITHUB登陆