之前为某高校写的一个简易cas server,基于django实现,先上源码:django_cas_server_lite

Why

  • 不想折腾java/tomcat/apache,所以没选用apereo/cas
  • 利用django的认证机制易于与任何认证系统对接,包括数据库,以及jwt等
  • 没有历史负担,方便页面样式设计
  • 跟Open edX采用同一套技术栈
  • 默认不采用https,方便开发,需要的话,采用nginx反向代理来做https
  • why not

使用

把当前项目run起来后,访问/django_cas/login即可。具体细节如下

安装

  • git clone https://github.com/wwj718/django_cas_server_lite
  • virtualenv cas_env
  • . cas_env/bin/activate.fish
  • cd django_cas_server_lite
  • pip install -r requirements.txt //如果网络不便,也可以手动安装 requirements.txt里的依赖,我已经把依赖控制到最精简了
  • 跑起来
    • 开发调试状态:python manage.py runserver
    • 生产环节:gunicorn django_cas_server_lite.wsgi:application --bind 127.0.0.1:8001 -w 4 , -w 4 表示4个worker,之后用nginx反向代理。gunicorn可以先跑在tmux里,如果需要将其设为守护进程,使用Supervisor

nginx配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
:::text
server {
        listen 80;             #端口
        server_name cas.just4fun.site;   #访问域名
        access_log /tmp/access.log;
        error_log /tmp/access.log;
        location / {
                proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $http_host;
                proxy_redirect off;
                if (!-f $request_filename) {
                        proxy_pass http://127.0.0.1:8001;  #这里是django应用的gunicorn端口
                        break;
                }
        }
}

如果需要使用https(推荐),参考:使用Let’s Encrypt(certbot)为你的网站生成免费的 SSL 证书

nginx

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
:::text
server {
        listen 80;             #端口
        server_name cas.just4fun.site;   #访问域名
        #root /home/bob/dylan/;
        access_log /tmp/access.log;
        error_log /tmp/access.log;
        location / {
                proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $http_host;
                proxy_redirect off;
                if (!-f $request_filename) {
                        proxy_pass http://127.0.0.1:8001;  #这里是flask应用的gunicorn端口
                        break;
                }
        }
}

Open edX用户

如果你未使用Open edX,可以忽视这条

如果你使用Open edX,你可以利用Open edX的edxapp env,这样一来依赖都是完备的

1
2
3
4
git clone https://github.com/wwj718/django_cas_server_lite
cd django_cas_server_lite
. /edx/app/edxapp/edxapp_env
gunicorn django_cas_server_lite.wsgi:application --bind 127.0.0.1:8001 -w 4 # 这一步可选,推荐使用Supervisor,见下文

Supervisor配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
[program:cas]

command=/edx/app/edxapp/venvs/edxapp/bin/gunicorn django_cas_server_lite.wsgi:application

user=www-data
directory=/edx/app/edxapp/django_cas_server_lite
environment=PORT=8001,ADDRESS=127.0.0.1,LANG=en_US.UTF-8,PATH="/edx/app/edxapp/venvs/edxapp/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
stdout_logfile=/edx/var/log/supervisor/%(program_name)s-stdout.log
stderr_logfile=/edx/var/log/supervisor/%(program_name)s-stderr.log
killasgroup=true
stopasgroup=true

之后配置nginx即可,同上

设计

需求

  • 实现类似apereo/cas的功能,能对接到其他认证后端

思路

  • 采用django的Authenticate机制,写自己的认证后端
  • 关注REMOTE_USER,主要使用单点登录解决方案

核心依赖

  • django-mama-cas:A Django Central Authentication Service (CAS) single sign-on server

笔记

Authenticating

One or more authentication backends must be installed and configured based on your authoritative authentication sources

  • Django/用户认证
  • 在Django中自定义身份验证
    • AUTHENTICATION_BACKENDS 的顺序很重要,所以如果用户名和密码在多个后台中都是合法的,Django 将在第一个匹配成功后停止处理。如果后台引发PermissionDenied 异常,认证将立即失败。Django 不会检查后面的认证后台。

todo

  • 是remote database backend变为可选功能,采用配置文件实现
  • 与LDAP对接(LDAP 3.0)

相关项目