lynhuang/laravel-cas-server is a Laravel package for 基于laravel实现的cas单点登录服务端.
It currently has 0 GitHub stars and 3 downloads on Packagist.
Install it with composer require lynhuang/laravel-cas-server.
Discover more Laravel packages by lynhuang
or browse all Laravel packages to compare alternatives.
Last updated
一个功能完整的 Laravel CAS (Central Authentication Service) 服务器实现,支持 CAS 1.0、2.0 和 3.0 协议,提供现代化的 JSON 响应格式和丰富的自定义选项。
laravel-cas-server/
├── src/ # 核心源代码
│ ├── CasServerServiceProvider.php # 服务提供者
│ ├── Http/ # HTTP 相关
│ │ ├── Controllers/ # 控制器
│ │ ├── Middleware/ # 中间件
│ │ └── Requests/ # 请求验证
│ ├── Models/ # 数据模型
│ ├── Services/ # 业务逻辑服务
│ ├── Events/ # 事件类
│ ├── Listeners/ # 事件监听器
│ ├── Contracts/ # 接口定义
│ ├── Migrations/ # 数据库迁移文件
│ ├── Routes/ # 路由定义
│ ├── config/ # 配置文件
│ └── resources/ # 资源文件
│ └── views/ # Blade 模板
├── resources/ # 项目资源文件
│ └── views/ # 自定义视图模板
├── composer.json # Composer 依赖配置
├── README.md # 项目说明文档
├── .gitignore # Git 忽略文件配置
└── LICENSE # 许可证文件
composer require lyn/laravel-cas-server
php artisan vendor:publish --provider="Lyn\LaravelCasServer\CasServerServiceProvider"
php artisan migrate
php artisan cas:create-client
编辑 config/casserver.php 文件:
return [
// 服务器基础配置
'server_name' => env('CAS_SERVER_NAME', 'CAS Server'),
'server_url' => env('CAS_SERVER_URL', 'https://cas.example.com'),
// 响应格式配置
'response' => [
'default_format' => env('CAS_RESPONSE_FORMAT', 'json'), // 'xml' 或 'json'
],
// 路由配置
'route' => [
'domain' => env('CAS_ROUTE_DOMAIN'),
'prefix' => env('CAS_ROUTE_PREFIX', 'cas'),
'middleware' => ['web'],
],
// 用户模型配置
'user' => [
'model' => env('CAS_USER_MODEL', App\Models\User::class),
'username_field' => env('CAS_USERNAME_FIELD', 'email'),
'custom_fields' => [
'name', 'email', 'roles', // 自定义返回字段
],
'custom_handler' => null, // 自定义用户信息处理器类
],
// 票据配置
'ticket' => [
'tgt_lifetime' => 7200, // TGT 生命周期(秒)
'st_lifetime' => 300, // ST 生命周期(秒)
'pt_lifetime' => 300, // PT 生命周期(秒)
'pgt_lifetime' => 7200, // PGT 生命周期(秒)
],
// 视图模板配置
'views' => [
'custom_enabled' => env('CAS_CUSTOM_VIEWS', false),
'custom_path' => env('CAS_CUSTOM_VIEW_PATH', 'cas'),
'templates' => [
'login' => 'casserver::login',
'logout' => 'casserver::logout',
'error' => 'casserver::error',
],
],
// 自定义交互接口配置
'interactions' => [
'user_login' => env('CAS_USER_LOGIN_CLASS', null),
'user_register' => env('CAS_USER_REGISTER_CLASS', null),
'user_password' => env('CAS_USER_PASSWORD_CLASS', null),
],
// 单点登出配置
'logout' => [
'enabled' => true,
'timeout' => 10, // 登出请求超时时间
'allowed_domains' => [], // 允许的登出重定向域名
],
];
用户 -> 客户端应用 -> CAS 服务器 -> 认证 -> 返回票据 -> 客户端验证票据 -> 登录成功
用户访问受保护资源
重定向到 CAS 服务器
https://cas.example.com/cas/login?service=https://app.example.com/callback
用户认证
生成服务票据 (ST)
https://app.example.com/callback?ticket=ST-1-abc123...
客户端验证票据
https://cas.example.com/cas/serviceValidate?service=https://app.example.com/callback&ticket=ST-1-abc123...
返回用户信息
XML 格式响应 (传统):
<cas:serviceResponse xmlns:cas='http://www.yale.edu/tp/cas'>
<cas:authenticationSuccess>
<cas:user>username</cas:user>
<cas:attributes>
<cas:email>[email protected]</cas:email>
<cas:name>User Name</cas:name>
</cas:attributes>
</cas:authenticationSuccess>
</cas:serviceResponse>
JSON 格式响应 (推荐):
{
"serviceResponse": {
"authenticationSuccess": {
"user": "username",
"attributes": {
"email": "[email protected]",
"name": "User Name",
"roles": ["user", "admin"]
}
}
}
}
用户登出 -> CAS 服务器 -> 通知所有客户端 -> 清理会话 -> 登出完成
用户发起登出
https://cas.example.com/cas/logout?service=https://app.example.com
CAS 服务器处理登出
通知客户端应用
<samlp:LogoutRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol">
<saml:NameID>username</saml:NameID>
<samlp:SessionIndex>session_id</samlp:SessionIndex>
</samlp:LogoutRequest>
清理服务器会话
重定向用户
代理认证允许一个应用代表用户访问另一个应用。
获取代理授予票据 (PGT)
https://cas.example.com/cas/serviceValidate?service=...&ticket=...&pgtUrl=https://app.example.com/pgtCallback
生成代理票据 (PT)
https://cas.example.com/cas/proxy?pgt=PGT-1-abc123...&targetService=https://api.example.com
使用 PT 访问目标服务
https://api.example.com/resource?ticket=PT-1-def456...
GET /cas/login?service={service_url}
POST /cas/login
GET /cas/logout?service={service_url}
# CAS 1.0
GET /cas/validate?service={service}&ticket={ticket}
# CAS 2.0
GET /cas/serviceValidate?service={service}&ticket={ticket}
GET /cas/proxyValidate?service={service}&ticket={ticket}
# CAS 3.0
GET /cas/p3/serviceValidate?service={service}&ticket={ticket}
GET /cas/p3/proxyValidate?service={service}&ticket={ticket}
GET /cas/proxy?pgt={pgt}&targetService={target_service}
GET /cas/admin/stats
GET /cas/admin/clients
POST /cas/admin/clients/{id}/toggle
POST /cas/admin/cleanup
POST /cas/api/v1/validate
{
"token": "ST-1-abc123..."
}
POST /cas/api/v1/batch-validate
{
"tokens": ["ST-1-abc123...", "PT-1-def456..."]
}
GET /cas/api/v1/user?ticket={ticket}
// 在路由中使用
Route::middleware('cas_auth')->group(function () {
Route::get('/protected', 'ProtectedController@index');
});
// 在控制器中使用
class ProtectedController extends Controller
{
public function __construct()
{
$this->middleware('cas_auth');
}
}
Route::middleware('cas_ticket_check')->group(function () {
Route::get('/api/data', 'ApiController@getData');
});
// 在 EventServiceProvider 中注册
protected $listen = [
\Lyn\LaravelCasServer\Events\CasUserLoggedOutEvent::class => [
\App\Listeners\UserLoggedOutListener::class,
],
];
// 创建监听器
class UserLoggedOutListener
{
public function handle(CasUserLoggedOutEvent $event)
{
// 处理用户登出事件
Log::info('User logged out', [
'user_id' => $event->getUserId(),
'reason' => $event->reason,
]);
}
}
CasUserLoggedOutEvent: 用户登出事件CasLogoutEvent: CAS 单点登出事件在 .env 文件中配置以下变量:
# 响应格式配置
CAS_RESPONSE_FORMAT=json
# 用户模型配置
CAS_USER_MODEL=App\Models\User
CAS_USERNAME_FIELD=email
# 自定义视图配置
CAS_CUSTOM_VIEWS=true
CAS_CUSTOM_VIEW_PATH=custom.cas
# 自定义交互类配置
CAS_USER_LOGIN_CLASS=App\Services\CustomUserLogin
CAS_USER_REGISTER_CLASS=App\Services\CustomUserRegister
CAS_USER_PASSWORD_CLASS=App\Services\CustomUserPassword
创建自定义用户模型:
use Illuminate\Foundation\Auth\User as Authenticatable;
class CustomUser extends Authenticatable
{
protected $fillable = [
'username', 'email', 'password', 'name', 'roles'
];
protected $casts = [
'roles' => 'array',
];
// 自定义用户信息获取方法
public function getCasAttributes()
{
return [
'email' => $this->email,
'name' => $this->name,
'roles' => $this->roles ?? [],
'department' => $this->department,
];
}
}
创建自定义用户信息处理器:
class CustomUserInfoHandler
{
public function handle($user)
{
return [
'id' => $user->id,
'username' => $user->username,
'email' => $user->email,
'name' => $user->name,
'roles' => $user->roles ?? [],
'permissions' => $user->getAllPermissions()->pluck('name'),
'last_login' => $user->last_login_at?->toISOString(),
];
}
}
实现 UserLogin 接口来自定义用户认证逻辑:
use Lyn\LaravelCasServer\Contracts\Interactions\UserLogin;
class CustomUserLogin implements UserLogin
{
public function showLoginPage(Request $request)
{
return view('custom.cas.login');
}
public function login(Request $request)
{
// 自定义登录逻辑
$credentials = $request->only('email', 'password');
if (Auth::attempt($credentials)) {
return Auth::user();
}
return false;
}
public function logout(Request $request)
{
Auth::logout();
$request->session()->invalidate();
$request->session()->regenerateToken();
}
}
创建自定义登录模板 resources/views/custom/cas/login.blade.php:
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row justify-content-center">
<div class="col-md-6">
<div class="card">
<div class="card-header">{{ __('CAS Login') }}</div>
<div class="card-body">
@if ($errors->any())
<div class="alert alert-danger">
{{ $errors->first() }}
</div>
@endif
<form method="POST" action="{{ route('cas.login') }}">
@csrf
<input type="hidden" name="service" value="{{ request('service') }}">
<div class="form-group mb-3">
<label for="email">{{ __('Email') }}</label>
<input type="email" class="form-control" name="email" required>
</div>
<div class="form-group mb-3">
<label for="password">{{ __('Password') }}</label>
<input type="password" class="form-control" name="password" required>
</div>
<button type="submit" class="btn btn-primary w-100">
{{ __('Login') }}
</button>
</form>
</div>
</div>
</div>
</div>
</div>
@endsection
## 安全建议
### 1. HTTPS 配置
生产环境必须使用 HTTPS
配置正确的 SSL 证书
### 2. 客户端验证
严格验证客户端 service URL
使用白名单机制
### 3. 票据安全
设置合理的票据过期时间
定期清理过期票据
### 4. 日志监控
启用详细的审计日志
监控异常登录行为
### 5. 会话管理
配置安全的会话设置
实施会话超时机制
## 故障排除
### 常见问题
#### 1. 票据验证失败
检查项:
#### 2. 单点登出不工作
检查项:
#### 3. 代理认证失败
检查项:
### 调试模式
启用详细日志:
```php
// config/casserver.php
'debug' => env('CAS_DEBUG', false),
'log_level' => env('CAS_LOG_LEVEL', 'info'),
// 使用 Redis 缓存
'cache' => [
'driver' => 'redis',
'prefix' => 'cas:',
'ttl' => 3600,
],
// 使用队列处理单点登出
'logout' => [
'use_queue' => true,
'queue_name' => 'cas-logout',
],
欢迎提交 Issue 和 Pull Request!
composer installvendor/bin/phpunitMIT License