Lasaas 是一个基于 Laravel 生态构建的现代化多租户 SaaS 平台,采用独立数据库隔离方案,为每个租户提供完全独立的数据存储空间。项目整合了 Livewire、Filament、Spatie Permission 和 Stancl/Tenancy 等优秀组件,提供了完整的用户管理、团队协作、权限控制和多租户解决方案。
- SaaS 应用开发:快速构建多租户 SaaS 产品
- 企业级应用:需要数据隔离的多客户系统
- 团队协作平台:支持多团队、多角色的协作工具
- 白标解决方案:可为不同客户提供独立域名和品牌
- 独立数据库隔离:每个租户拥有独立的数据库,确保数据安全和隐私
- 独立域名支持:每个租户可配置专属域名访问(如 tenant.example.com)
- 自动租户初始化:创建租户时自动完成数据库创建、迁移等流程
- 资源隔离:缓存、文件系统、队列等资源按租户隔离
- 租户状态管理:支持租户激活、过期、禁用等状态管理
- 灵活的数据库驱动:支持 MySQL、PostgreSQL、SQLite 等多种数据库
- 用户注册/登录(支持双因素认证、Passkeys 无密码登录)
- 个人资料管理(头像、姓名、邮箱等)
- 安全设置(密码修改、两步验证、会话管理)
- 团队管理
- 创建和管理多个团队
- 邀请成员加入团队
- 角色权限分配(Admin/Member)
- 团队成员管理(移除、角色变更)
- 团队切换功能
- 外观偏好设置(主题、语言等)
- 团队邀请链接接受
-
用户管理
- 查看所有注册用户列表
- 用户状态管理(激活/禁用)
- 用户详情查看与编辑
- 用户角色分配
-
租户管理
- 创建新租户(自动生成数据库)
- 租户列表查看与筛选
- 租户域名配置与管理
- 租户状态管理(激活/过期/禁用)
- 租户数据统计
- 租户信息维护(名称、联系方式等)
-
团队管理
- 全局团队视图
- 团队数据统计
- 团队成员查询
-
权限管理(Filament Shield)
- 角色定义与管理
- 权限分配与控制
- 访问控制策略
- 细粒度权限管理
每个租户拥有独立的 Filament 管理后台,通过专属域名访问:
-
用户管理
- 租户内部用户 CRUD(创建、读取、更新、删除)
- 用户角色分配与管理
- 用户激活/禁用控制
- 用户数据隔离
-
团队管理
- 团队信息维护
- 团队成员管理
- 团队权限配置
- 团队邀请管理
-
权限管理
- 基于 Spatie Permission 的 RBAC(角色基于访问控制)
- 细粒度权限控制
- 角色继承与组合
- 权限中间件保护
-
可扩展性
- 支持自定义业务模块
- 租户级别的配置定制
- 独立的数据库迁移
- Laravel 13.x - PHP Web 应用框架
- PHP 8.3+ - 编程语言
- Livewire 4.x - 全栈 Reactivity 框架,无需编写 JavaScript
- Flux UI 2.x - 专业的 Livewire 组件库
- Alpine.js - 轻量级 JavaScript 框架
- Tailwind CSS 4.x - 实用优先的 CSS 框架
- Vite 8.x - 现代前端构建工具
- Filament 5.x - Laravel 管理面板构建器
- Forms - 强大的表单构建器
- Tables - 数据表格展示与筛选
- Notifications - 实时通知系统
- Widgets - 数据可视化组件
- Filament Shield - 权限管理集成
- Stancl/Tenancy 3.x - Laravel 多租户解决方案
- 数据库自动隔离
- 域名路由识别
- 资源自动隔离(缓存、文件系统、队列)
- 租户生命周期管理
- Spatie Laravel Permission 7.x - 角色和权限管理
- RBAC(角色基于访问控制)
- 多模型权限支持
- 权限缓存优化
- Laravel Fortify - 无头认证后端
- 双因素认证(2FA)
- Passkeys 无密码登录支持
- 邮箱验证
- 密码重置
- Laravel Lang - 多语言支持
- 中文(简体)
- 英文
- 易于扩展其他语言
- Pest 4.x - 优雅的 PHP 测试框架
- Laravel Pint - 代码风格修复工具(PHP-CS-Fixer)
- DDEV - 本地开发环境管理
- Laravel Pail - 日志查看工具
- Concurrently - 并行任务执行
lasaas/
├── app/
│ ├── Actions/ # 业务逻辑动作类(Fortify、Teams)
│ ├── Concerns/ # Traits(可复用特性)
│ ├── Enums/ # 枚举类(TeamRole、TeamPermission、TenantStatus)
│ ├── Filament/ # Filament 管理面板资源
│ │ ├── Resources/ # 资源管理(Users、Tenants、Teams、Roles)
│ │ ├── Pages/ # 自定义页面
│ │ └── Widgets/ # 数据小组件
│ ├── Http/ # HTTP 相关(Controllers、Middleware、Responses)
│ ├── Livewire/ # Livewire 组件
│ ├── Models/ # Eloquent 数据模型(User、Team、Tenant、Membership等)
│ ├── Notifications/ # 通知类
│ ├── Policies/ # 授权策略类
│ ├── Providers/ # 服务提供者
│ ├── Rules/ # 自定义验证规则
│ └── Support/ # 辅助类
├── config/ # 配置文件(tenancy、fortify、filament、permission等)
├── database/
│ ├── migrations/ # 中央数据库迁移
│ │ └── tenant/ # 租户数据库迁移模板
│ ├── seeders/ # 数据填充器
│ └── factories/ # 模型工厂(测试用)
├── resources/
│ ├── views/ # Blade 视图模板
│ │ ├── components/ # Blade 组件
│ │ ├── layouts/ # 布局模板
│ │ ├── pages/ # 页面视图(auth、teams、profile)
│ │ └── flux/ # Flux UI 组件覆盖
│ ├── js/ # JavaScript 文件
│ └── css/ # CSS 样式文件
├── routes/ # 路由定义
│ ├── web.php # 中央应用路由
│ ├── tenant.php # 租户应用路由
│ ├── settings.php # 设置相关路由
│ └── console.php # Artisan 命令路由
├── tests/ # 测试文件
│ ├── Feature/ # 功能测试
│ └── Unit/ # 单元测试
├── public/ # 公共资源目录(入口文件、构建产物)
├── storage/ # 存储目录(app、framework、logs)
├── lang/ # 多语言文件(en、zh_CN)
├── .ddev/ # DDEV 开发环境配置
├── .env.example # 环境变量示例
├── composer.json # Composer 依赖配置
├── package.json # NPM 依赖配置
├── vite.config.js # Vite 构建配置
└── artisan # Laravel Artisan 命令行工具
- PHP 8.3+
- Composer
- Node.js & NPM
- MySQL/MariaDB 或 PostgreSQL
- DDEV(可选,推荐用于本地开发)
- 克隆项目
git clone <repository-url> lasaas
cd lasaas- 启动 DDEV 环境
ddev start- 安装依赖并初始化
ddev composer install
ddev npm install
ddev artisan key:generate
ddev artisan migrate
ddev npm run build- 访问应用
- 中央应用:
https://lasaas.ddev.site - 租户应用:
https://{tenant-id}.lasaas.ddev.site
- 克隆项目并安装依赖
git clone <repository-url> lasaas
cd lasaas
composer install
npm install- 配置环境变量
cp .env.example .env
php artisan key:generate编辑 .env 文件,配置数据库连接:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=lasaas_central
DB_USERNAME=root
DB_PASSWORD=- 运行数据库迁移
php artisan migrate- 编译前端资源
npm run build- 启动开发服务器
# 方式一:使用 Laravel 内置命令
php artisan serve
# 方式二:使用完整开发环境(推荐)
composer run dev-
创建第一个用户 访问注册页面创建管理员账户
-
创建第一个租户 在管理后台或通过 Artisan 命令:
php artisan tinker
>>> \App\Models\Tenant::create(['id' => 'demo']);
>>> \App\Models\Domain::create(['domain' => 'demo.lasaas.test', 'tenant_id' => 'demo']);- 运行租户迁移
php artisan tenants:migrate- 访问首页进行用户注册
- 支持邮箱验证
- 支持双因素认证(2FA)
- 支持 Passkeys 无密码登录
-
创建团队
- 点击团队切换器中的"创建团队"
- 输入团队名称和 Slug
- 系统自动生成唯一团队标识
-
邀请成员
- 进入团队设置页面
- 点击"邀请成员"
- 输入邮箱地址选择角色
- 发送邀请邮件
-
管理成员
- 查看团队成员列表
- 修改成员角色(Admin/Member)
- 移除团队成员
访问 /admin 进入 Filament 管理面板:
- 管理所有用户
- 创建和管理租户
- 配置租户域名
- 查看系统统计
通过配置的域名访问租户应用:
https://your-tenant-domain.com/admin
- 管理租户内部用户
- 配置团队权限
- 自定义业务逻辑
- 创建迁移文件
php artisan make:migration create_posts_table --path=database/migrations/tenant- 创建模型
php artisan make:model Post- 创建 Filament 资源
php artisan make:filament-resource Post --tenant- 运行租户迁移
php artisan tenants:migrate- 定义角色和权限
// 在服务提供者中
use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;
$role = Role::create(['name' => 'manager']);
$permission = Permission::create(['name' => 'edit-posts']);
$role->givePermissionTo($permission);- 在代码中使用
// 检查权限
$user->can('edit-posts');
// 检查角色
$user->hasRole('manager');运行所有测试:
composer test运行特定测试:
php artisan test --filter=TeamTest# 创建新租户
php artisan tenants:create
# 列出所有租户
php artisan tenants:list
# 为所有租户运行迁移
php artisan tenants:migrate
# 为特定租户运行迁移
php artisan tenants:migrate --tenants=demo,prod
# 填充租户数据
php artisan tenants:seed
# 删除租户及其数据库
php artisan tenants:delete {tenant_id}# 生成所有资源的权限
php artisan shield:generate --all
# 生成特定资源的权限
php artisan shield:generate --resource=User
# 安装 Shield
php artisan shield:install# 清除缓存
php artisan cache:clear
php artisan config:clear
php artisan route:clear
php artisan view:clear
# 缓存优化
php artisan config:cache
php artisan route:cache
php artisan view:cache
php artisan optimize
# 查看路由列表
php artisan route:list
# 数据库相关
php artisan migrate
php artisan migrate:rollback
php artisan db:seed
php artisan db:wipe
# 队列管理
php artisan queue:work
php artisan queue:restart
php artisan queue:flush# 开发模式(带热重载)
npm run dev
# 生产构建
npm run build
# 预览生产构建
npm run preview# 完整初始化项目
composer run setup
# 启动开发环境(服务器+队列+日志+Vite)
composer run dev
# 格式化代码
composer run lint
# 检查代码风格
composer run lint:check
# 运行测试
composer run test
# CI 检查
composer run ci:check# 启动环境
ddev start
# 停止环境
ddev stop
# 重启环境
ddev restart
# 删除环境(保留数据)
ddev delete
# 进入 Web 容器
ddev ssh
# 查看日志
ddev logs
# 访问数据库
ddev mysql
# 邮件预览
ddev mailhog
# 执行 Composer 命令
ddev composer install
# 执行 NPM 命令
ddev npm run dev
# 执行 Artisan 命令
ddev artisan migrateLasaas 采用了多层次的安全措施:
- ✅ 数据隔离:每个租户独立数据库,数据完全隔离
- ✅ 密码加密:使用 bcrypt 算法加密存储密码
- ✅ 双因素认证:支持 TOTP 和 Passkeys
- ✅ CSRF 保护:所有表单请求自动验证 CSRF token
- ✅ XSS 防护:Blade 模板自动转义输出
- ✅ SQL 注入防护:Eloquent ORM 使用参数化查询
- ✅ RBAC 权限控制:基于角色的访问控制
- ✅ 中间件保护:租户隔离验证、身份认证中间件
- ✅ 邮箱验证:新用户必须验证邮箱
- ✅ 会话管理:支持查看和管理活跃会话
- ✅ 速率限制:防止暴力破解和 DDoS 攻击
-
生产环境配置
APP_DEBUG=false APP_ENV=production
-
定期更新依赖
composer update npm update
-
备份策略
- 定期备份中央数据库
- 定期备份所有租户数据库
- 备份文件系统和用户上传内容
-
监控和日志
- 启用错误监控(如 Sentry)
- 定期审查日志文件
- 设置异常报警
欢迎提交 Issue 和 Pull Request!
-
Fork 本仓库 点击 GitHub 页面右上角的 Fork 按钮
-
创建特性分支
git checkout -b feature/AmazingFeature
-
提交更改
git commit -m 'Add some AmazingFeature' -
推送到分支
git push origin feature/AmazingFeature
-
开启 Pull Request 在 GitHub 上创建 Pull Request,描述您的更改
- 遵循 PSR-12 编码规范
- 使用 Laravel Pint 格式化代码:
composer run lint - 编写测试用例覆盖新功能
- 更新相关文档
如果您发现了 bug 或有功能建议:
- 搜索现有 Issues,避免重复报告
- 创建新的 Issue,详细描述问题
- 提供重现步骤(如适用)
- 包含环境信息(PHP 版本、数据库等)
本项目采用 MIT 许可证 - 查看 LICENSE 文件了解详情。
- Laravel - Web 应用框架
- Livewire - 全栈框架
- Filament - 管理面板
- Stancl/Tenancy - 多租户解决方案
- Spatie - Permission 包
- Flux UI - UI 组件库
- Laravel Lang - 国际化支持
- Pest - 测试框架
A: 访问注册页面创建账户,然后使用 Tinker 分配角色:
php artisan tinker
>>> $user = \App\Models\User::find(1);
>>> $user->assignRole('super_admin');A: 在登录页面点击“忘记密码”,输入邮箱地址接收重置链接。
A: 支持 MySQL 8.0+、MariaDB 10.5+、PostgreSQL 14+ 和 SQLite(开发环境)。
A: 在 Filament 管理后台的 Tenants 页面,编辑租户并添加域名。或者使用代码:
\App\Models\Domain::create([
'domain' => 'tenant.yourdomain.com',
'tenant_id' => $tenantId,
]);A: 每个租户有独立的数据库,命名格式为 tenant_{tenant_id}。可以在中央数据库中查看 tenants 表获取租户列表。
A: 使用 Artisan 命令:
php artisan tenants:delete {tenant_id}这会删除租户记录和其独立数据库。
A:
- 中央应用:访问主域名(如 lasaas.ddev.site)
- 租户应用:访问租户专属域名(如 demo.lasaas.ddev.site)
A: 参考“开发指南”部分的详细步骤:
- 在
database/migrations/tenant/创建迁移 - 创建模型
- 创建 Filament 资源
- 运行
php artisan tenants:migrate
A: 尝试以下步骤:
# 停止并重新启动
ddev stop
ddev start
# 如果仍有问题,删除并重建
ddev delete
ddev startA: 清除浏览器缓存并重新构建:
npm run build
# 或开发模式
npm run devA: 检查 jobs 表或使用 Horizon(如果安装):
php artisan tinker
>>> \Illuminate\Support\Facades\DB::table('jobs')->count();A: 在 Filament 后台的用户管理页面,编辑用户并分配角色。或使用代码:
$user->assignRole('admin');A: Filament Shield 是一个为 Filament 资源自动生成权限的包。它会根据资源生成相应的权限(view、create、update、delete 等)。
A: 在服务提供者或 Seeder 中:
use Spatie\Permission\Models\Permission;
Permission::create(['name' => 'custom-permission']);A:
- 启用缓存:
php artisan optimize - 使用 Redis 作为缓存驱动
- 配置队列 worker
- 启用 OPcache
- 使用 CDN 存储静态资源
- 数据库索引优化
A:
- 使用连接池管理数据库连接
- 实施租户分片策略
- 定期清理不活跃租户
- 监控服务器资源使用
A: 尝试重新生成自动加载文件:
composer dump-autoloadA:
# 回滚迁移
php artisan migrate:rollback
# 清除迁移表
php artisan migrate:fresh
# 重新迁移
php artisan migrateA: 检查 .env 中的邮件配置,查看日志文件:
tail -f storage/logs/laravel.logA:
// 在当前请求中获取租户信息
dump(tenant());
dump(tenant('id'));
// 检查是否在租户上下文中
dump(tenancy()->initialized);如有问题或建议,请提交 Issue 或通过以下方式联系: