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

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

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

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

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

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

本帖已被设为精华帖!
本帖由 Summer 于 1年前 加精
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 29
hareluya

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

1年前
MrJing

:+1:

1年前
Summer

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

file

1年前
ADKi

收藏了

1年前
overtrue

看起来不错

1年前

nice

1年前

winform程序能登录么?

1年前
leo

@just4test 目前只支持网页

1年前

这个非常赞

1年前

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

1年前
leo

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

1年前

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

1年前
leo

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

1年前

@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 就进入登录死循环了,我看了你的代码不知道为什么你就能正常运行。这个问题出在哪呢?

1年前
leo

@zmecust 你是在写哪个端?

1年前

@leo 服务端

1年前
leo

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

1年前

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

1年前
leo

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

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

1年前

@leo OK! 我试试,谢谢你

1年前

在哪能下载呢?

1年前
leo

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

1年前
AGD

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

1年前
leo

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

1年前
AGD

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

1年前
leo

@AGD 请使用 phpCAS 这个项目

1年前
AGD

@leo 好的,谢谢您

1年前
hihuangwei

@leo 不支持Laravel5.7吗

1周前
hihuangwei

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

3天前

  • 请注意单词拼写,以及中英文排版,参考此页
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,使用方法请见 Emoji 自动补全来咯,可用的 Emoji 请见 :metal: :point_right: Emoji 列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
  请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!