背景:
…
CAS介绍:
CAS ( Central Authentication Service ),最初由耶鲁大学的Shawn Bayern
开发,后由Jasig社区维护,经过十多年发展,目前已成为影响最大、广泛使用的、基于Java实现的、开源SSO解决方案。cas旨在为 Web应用系统提供一种可靠的单点登录解决方法(属于 Web SSO )。 CAS 开始于 2001 年, 并在 2004 年 12 月正式成为JA-SIG 的一个项目。
CAS原理:
cas单点登录流程理解:
- 浏览器请求cas客户端(接入cas的系统)时,cas客户端对当前请求浏览器校验是否存在session(odoo系统中则校验当前cookie是否存在session_id值,根据session_id值判断/data/sessions文件夹内是否存在对应session。如启用redis管理session,则在redis中查询是否存在对应session_id的数据判断是否登录)。
- 如校验无登录cas客户端,则返回重定向到cas服务器。链接形如:https://localcas:8443/cas/login?service=http%3A%2F%2F192.168.99.102%3A8069%2Fweb%2Flogin。
其中https://localcas:8443/cas/login为cas服务器登录地址,service参数值为cas客户端登录地址 - 通过用户名密码登录cas认证系统,认证成功后携带ticket参数重定向到cas客户端登录 地址,形如:
http://192.168.99.102:8069/web/login?ticket=ST-17-3hA0-atfanDFWw4beSnHodOdMCY-DESKTOP-RAY - 浏览器请求重定向地址到cas客户端。
- cas客户端获取请求参数ticket,并携带ticket参数请求cas服务端换取用户。
- 成功获取用户名则创建session,设置cookie值。让浏览器重定向到cas客户端系统首页。
- 没有成功获取用户名则返回cas服务端登录地址。
PS:CAS认证系统通过cookie值中Jsession_id值判断是否通过CAS认证。
核心代码:
- 安装python-cas库
pip install python-cas
- 引入cas库 修改controllers里登录的方法
# -*- coding:utf-8 -*-
import cas
import odoo
import random
import werkzeug
import xmltodict
import configparser
from odoo import _
from odoo import http
from odoo.service import security
from odoo.addons.web.controllers import main
from odoo.tools import ustr, consteq, frozendict, pycompat
from odoo.http import request, Response, Root, OpenERPSession
class HomeFLih(main.Home):
# OA单点登录
@http.route('/web/login', type='http', auth="none",csrf=False, sitemap=False)
def web_login(self, redirect=None, **kw):
if 'logoutRequest' in kw:
return self.web_logout(redirect=redirect,**kw)
# 生成CAS客户端类实例
client = cas.CASClient(
# CAS 版本 ,V1,V2,V3 版本
version='3',
# CAS 服务端登录地址,有get_login_url方法拼接/login 生成
server_url='https://localcas:8443/cas/',
# CAS 客户端登录地址
service_url='http://192.168.99.102:8069/web/login',
# 是否校验ssl证书
verify_ssl_certificate=False
)
# 判断是否有ticket参数
if 'ticket' in request.params:
ticket = request.params.get('ticket','')
# 请求CAS服务端,使用ticket换取用户名
res = client.verify_ticket(ticket