基于 Laravel 的 CAS 服务端程序(总算把文档写差不多了)

CAS是一个业内著名的单点登录协议,Client端各个语言版本都有,但Server端只有java版本,这让我很不爽,因为对java不是很熟悉,想在那基础上二次开发会比较蛋疼,所以一直以来就想写一个基于PHP的CAS服务端。

之前在github上开了一个坑 simple_cas_server ,然而在设计时没有考虑清楚定位,既想实现CAS协议的服务端逻辑,又想加入用户管理、服务管理等等一堆东西。而这种类型开源项目的受众基本是中小型企业,他们是需要一个CAS的服务端,但用户管理这类的周边需求不尽相同,有的可能还要求集成第三方登录,功能做多做少都不合适,所以决定拆分成两个项目:一个专注于实现CAS服务端逻辑,不包含任何与用户交互的前端代码;另一个依赖于前者,对外提供用户、服务管理的入口,并尽可能的插件化,使用者可以根据自己的情况定制。

于是在一个月前重新开了两个坑:

laravel_cas_server 负责实现CAS协议的逻辑。单测已经比较完善,代码覆盖率超过90%。目前并没有实现proxy相关的逻辑,这是接下来要做的事情。

php_cas_server 负责与用户的交互,包括用户管理、服务管理,可通过插件的方式增加用户登录方式,如微信扫一扫登录。今天把文档写差不多了,欢迎入坑。

本帖已被设为精华帖!
本帖由 Summer 于 7年前 加精
leo
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 36
黄威

@leo 不支持Laravel5.7吗

5年前 评论

@leo OK! 我试试,谢谢你

7年前 评论
leo

@大地母亲在忽悠着你 https://github.com/leo108/php_cas_server

6年前 评论

@leo 您好,我是第一次接触 CAS 的新手,我目前已经把项目搭建完成并且能够正常访问了,
但是我现在想使用其他域名来接入这个登录系统,请问应该怎么做呢?

6年前 评论
leo

@AGD 这和 CAS 无关,自行学习 Nginx 或者 Apache 的配置。

6年前 评论

@leo 我的意思是,比如我现在在 account.site.com 里面搭建好了这个项目
然后我想在 site.com 里面登录跳转到 account.site.com 然后实现单点登录的功能,应该如何处理呢?

6年前 评论
leo

@AGD 请使用 phpCAS 这个项目

6年前 评论
leo

@zmecust 单点登出在cas协议里也只提到server端会逐一请求client端告知用户退出,但没有说明client端应该如何处理,实际上也没法规范统一,因为每个客户端的会话保持逻辑是不一样的。

网页上保持会话基本上都是通过token机制,session/cookie本质上也都是token,一个可行的方案就是给浏览器发送token的同时在在数据库中也保存一份,只有浏览器的token和数据库中的token一致时才算登录状态,当cas server告知该用户已经全局登出,这个时候就把该用户在数据库中的token刷掉,这样这个用户再次访问客户端站点时,系统发现浏览器提交的token和数据库中的不一致,就告诉用户已登出。

7年前 评论
黄威

@leo 大神 可以支持下 Laravel 5.7 吗

5年前 评论

弱弱地问一句,这个也会和之前的 电子书 《Laravel 教程 - 电商实战》 一样售卖吗?还是做一个免费的文档供社区里的萌新学习? (其实我没有接触过这个。。)

5年前 评论
leo

@ericdemon 这个项目和课程没有关系

5年前 评论

@leo 不是,我是说会出 类似于这种电子书一样的文档教程吗

5年前 评论
leo

@ericdemon 不会

5年前 评论

客户端用什么扩展来做,目前用 Subfission/cas 但是app('cas')得时候报错:Error: Internal script failure

4年前 评论

php artisan migrate运行报错,,,php版本7.4,mysql5.7

2年前 评论

请问,我照着这个服务端做,结合 phpCas,怎么只能得到 username,可以返回用户的其它信息吗?比如我使用 phpCas:getAttribute('email'); 返回的 NULL。

7年前 评论
Summer

CAS是Central Authentication Service的缩写,中央认证服务,一种独立开始指令协议。CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目。

file

7年前 评论
DukeAnn

收藏了

7年前 评论

看起来不错

7年前 评论

winform程序能登录么?

7年前 评论
leo

@just4test 目前只支持网页

7年前 评论

这个非常赞

7年前 评论
hareluya

好,第一坑我占了。 马上准备投入生产鸟~

7年前 评论
leo

@zmecust client端初始化的时候协议选V3就可以了

7年前 评论

@leo Thanks for your help!管理员就是牛,我还有一个问题,为什么我认证成功了,也返回了数据,可是 cas_tickets 这张表一直是空的,难道 ticket 没储存在这张表中?

7年前 评论
leo

@zmecust ticket在校验成功之后就会从数据库里删除

7年前 评论

@leo 您好,我照着你的代码自己简单试了一下 server,发现从 client 跳转到 server 进行登录时,会出现Trying to get property of non-object 登录方法代码如下:
public function login(Request $request) { $service = $request->get('service', ''); if (!empty($service)) { $url = parse_url($service, PHP_URL_HOST); $service = Service::where('service_name', $url)->first(); if (is_null($service) && $service->enabled) { dd('has error...'); } } $user = $request->user(); if ($user) { return $this->authenticated($request, $user, $service); } return view('auth.login'); }
很显然问题出在 $user = $request->user(); ,得不到 user 数据,加上 auth middleware 就进入登录死循环了,我看了你的代码不知道为什么你就能正常运行。这个问题出在哪呢?

7年前 评论
leo

@zmecust 你是在写哪个端?

7年前 评论
leo

@zmecust 你这个代码里完全没有登录的逻辑啊,当然$request->user()拿到的是空

7年前 评论

@leo 时隔几天,又来打扰你了,见谅!实在是想把整个流程走通,这是我的第一个学习项目。
我参考你的 cas server,写了一个 cas client,但是无法实现同步退出,同步退出的思路是这样的:就是服务端用户退出时,会用 guzzlehttp 给客户端发送一个请求,客户端接收到请求,让客户端登录的用户退出。可是该怎么让登录的用户退出呢?求解。还是这样的思路行不通啊?有什么办法吗?

7年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!