- 人工智能
- AI 应用
- 大模型
- 媒体生成
- AI Agent
- 后端
- 前端
【免费下载链接】ai-fusion-video
【融光】 - 基于 Agent 的全流程AI短剧/漫剧/视频创作平台 - Java & agentscope2.0 | Agent-based end-to-end AI creation platform for short dramas, motion comics, and videos – built on Java & & agentscope 2.0.
融光 ai-fusion-video是基于 Agent 的全流程 AI 短剧/漫剧/视频创作平台(Java + agentscope 2.0)。作为一个多人协作的创作平台,它需要回答三个安全核心问题:你是谁(Token 鉴权)、你能干什么(用户角色)、你能碰哪些作品(团队权限)。本文带你完整梳理这三层安全机制的实现原理与关键源码位置。
一、安全架构总览:无状态 Token 鉴权
融光采用经典的无状态(STATELESS)+ Redis 会话方案,核心组件都集中在security包中:
| 组件 | 职责 | 源码位置 |
|---|---|---|
| SecurityConfig.java | 过滤器链、CORS、401/403 统一响应 | fusion/security/ |
| TokenAuthenticationFilter.java | 每次请求解析 Token 并建立认证上下文 | fusion/security/ |
| TokenService.java | 双 Token 生成、刷新、吊销(Redis 存储) | fusion/security/ |
| SecurityUserDetails.java | 承载用户 ID、角色、当前团队 ID | fusion/security/ |
| SecurityUtils.java | 业务代码中获取"当前登录用户" | fusion/security/ |
1.1 登录与双 Token 机制
用户调用/api/auth/login后,AuthController.java 通过 Spring Security 的AuthenticationManager校验账密,再由TokenService签发一对令牌:
- access_token:有效期2 小时,每次请求携带,用于接口鉴权;
- refresh_token:有效期7 天,仅用于调用
/api/auth/refresh换取新的令牌对。
两个细节值得关注:
- 令牌轮换(Rotation):刷新时旧 refresh_token 立即作废,签发全新的 refresh_token(见 TokenService.java),即使旧刷新令牌泄露也无法重复使用;
- 单端登录:Redis 中维护
userId -> accessToken映射,同一账号在新设备登录会踢掉旧会话。
密码存储则使用 PasswordEncoderConfig.java 中配置的BCrypt单向哈希,数据库中不存在明文密码。
1.2 请求如何被校验
每个请求经过 TokenAuthenticationFilter.java 处理:从Authorization: Bearer {token}请求头取出 access_token → 到 Redis 查询会话 → 加载用户与角色 → 写入SecurityContext。业务代码随后只需调用SecurityUtils.getCurrentUserId()即可拿到当前用户,无需关心鉴权细节。
二、接口白名单与 401/403 统一响应
并非所有接口都要求登录。SecurityConfig.java 中定义了明确的白名单,其余接口一律authenticated():
| 放行路径 | 用途 |
|---|---|
/api/auth/login、/api/auth/register、/api/auth/refresh | 登录、注册、令牌刷新 |
/api/auth/reset-password/** | 密码找回 |
/api/system/init/** | 首次管理员初始化 |
/swagger-ui/**、/v3/api-docs/** | 接口文档 |
/media/**、/art-styles/** | 生成的媒体文件与预设画风静态资源(上图即来自static/art-styles/目录) |
对于未登录和越权访问,融光没有返回默认 HTML 错误页,而是统一返回 JSON:
- 401:
{"code":401,"msg":"未登录或登录已过期"} - 403:
{"code":403,"msg":"没有权限访问"}
前端 axios 拦截器据此自动触发刷新或跳转登录页,体验连贯不中断。
三、用户角色:admin 与 user 的 RBAC 设计
融光使用标准 RBAC 模型,角色存储在sys_role表(Role.java),通过sys_user_role关联到用户。系统内置两个角色:
- admin(管理员):可管理 AI 模型、API 配置、存储配置、角色、用户、团队等;
- user(普通用户):使用项目、剧本、分镜、资产等创作功能。
登录时 SecurityUserDetailsService.java 会查出用户全部角色,并转换为ROLE_ADMIN、ROLE_USER等权限标识。管理端接口则通过方法级注解守护,例如 RoleController.java:
@PostMapping("/create") @PreAuthorize("hasRole('ADMIN')") public CommonResult<Long> createRole(...)使用同样方式的还有 AiModelController.java、StorageConfigController.java、UserController.java 等。普通用户即使伪造请求调用这些接口,也会被 Spring Security 拦截并返回 403。
💡 普通用户还能调用
/api/system/role/list获取启用的角色列表,用于前端权限判断与界面展示。
四、团队权限:开源版单团队 + 成员三级角色
融光的数据隔离建立在"团队"之上。开源版仅支持单团队(TeamService.java 中createTeam会拦截多团队创建),但保留了一套完整的团队角色体系:
| 团队角色 | 值 | 说明 |
|---|---|---|
| 创建者(OWNER) | 1 | 初始化时由管理员账号自动获得 |
| 管理员(ADMIN) | 2 | 团队成员管理 |
| 普通成员(MEMBER) | 3 | 默认角色 |
定义见 TeamMemberRoleEnum.java。
4.1 当前团队 ID 存进令牌
登录成功后,当前团队 ID 会一并写入 Redis 令牌会话(TokenSession)。业务层通过SecurityUtils.requireCurrentTeamId()获取,因此无需信任前端传参,数据归属天然绑定到当前认证会话。用户还可通过/api/team/current(TeamController.java)切换团队,服务端会先校验成员身份再更新令牌。
4.2 项目归属与访问控制
新建项目时,ProjectService.java 会自动打上团队归属(ownerType=2团队 /1个人);访问校验逻辑canAccessProject(同文件)允许三种情况通过:
- 项目是自己个人创建的;
- 自己是项目成员(
ProjectMember表); - 项目属于当前团队,或项目创建者是团队内其他成员。
剧本(ScriptService.java)、分镜(StoryboardService.java)、资产(AssetService.java)均通过getRequiredCurrentOwnerScopeByUser复用同一套团队归属逻辑,保证"团队内共享、团队外隔离"。
五、账号安全:初始化与密码找回
首次初始化:系统未初始化时,/api/system/init/setup开放给首位访问者创建管理员账号(SystemInitController.java),同时自动创建初始团队并默认关闭注册(UserService.java),后续是否开放注册由管理员在系统配置中控制。
密码找回(AuthController.java)提供两种方式,重置凭证在 Redis 中仅保留24 小时且重置后立即销毁:
- 邮箱方式:配置 SMTP 后发送带 token 的重置链接;
- 日志方式:仅管理员可用,验证码输出到服务端日志(适合本地自部署场景)。
六、前端 Token 管理:自动刷新不跳登录页
前端由 auth-store.ts(zustand + persist)保存令牌对,client.ts 的 axios 拦截器完成了体验闭环:
- 请求拦截:自动注入
Authorization: Bearer {access_token}; - 401 自动刷新:捕获 401 后调用
/api/auth/refresh,并采用刷新队列机制——刷新期间并发的其他请求排队等待,避免重复刷新; - 失败兜底:刷新失败或 refresh_token 过期时清除本地认证状态并跳转
/login。
七、关键源码导航 📍
| 关注点 | 路径 |
|---|---|
| 安全配置与白名单 | ai-fusion-video/src/main/java/com/stonewu/fusion/security/SecurityConfig.java |
| Token 双令牌机制 | ai-fusion-video/src/main/java/com/stonewu/fusion/security/TokenService.java |
| 登录/注册/找回接口 | ai-fusion-video/src/main/java/com/stonewu/fusion/controller/system/AuthController.java |
| 团队与成员管理 | ai-fusion-video/src/main/java/com/stonewu/fusion/service/team/TeamService.java |
| 项目访问控制 | ai-fusion-video/src/main/java/com/stonewu/fusion/service/project/ProjectService.java |
| 前端令牌管理 | ai-fusion-video-web/lib/api/client.ts |
八、总结
融光的安全体系可以概括为三句话:无状态 Token + Redis 会话解决了"你是谁"(2 小时 access_token + 7 天 refresh_token 轮换,BCrypt 保护密码);RBAC 角色解决了"你能干什么"(@PreAuthorize("hasRole('ADMIN')")守护所有管理端接口);团队归属模型解决了"你能碰哪些作品"(当前团队 ID 绑定令牌会话,项目/剧本/分镜/资产统一做团队隔离)。对于自部署用户,这套机制开箱即用;对于二次开发者,security包与TeamService的边界清晰,是扩展多团队、细粒度权限的理想切入点。
- 人工智能
- AI 应用
- 大模型
- 媒体生成
- AI Agent
- 后端
- 前端
【免费下载链接】ai-fusion-video
【融光】 - 基于 Agent 的全流程AI短剧/漫剧/视频创作平台 - Java & agentscope2.0 | Agent-based end-to-end AI creation platform for short dramas, motion comics, and videos – built on Java & & agentscope 2.0.
相关推荐
Webiny API 安全与认证抽象层完全指南:API Keys、角色、用户、团队与权限体系
Webiny API 安全与认证抽象层完全指南:API Keys、角色、用户、团队与权限体系 导读 Webiny 是一套运行在 AWS Serverless 之
CMS后端前端云原生AI 应用S.data与S.value深度对比:如何选择适合你的响应式数据源?
S.data与S.value深度对比:如何选择适合你的响应式数据源? 在现代JavaScript响应式编程中,选择合适的数据源创建方式直接影响应用性能和代码质量
TVBoxOSC:电视盒子本地播放与网络流的快速配置指南
TVBoxOSC:电视盒子本地播放与网络流的快速配置指南 TVBoxOSC 是一款开源的电视盒子管理与播放应用,面向想在电视大屏上看本地视频和网络内容的人。它解
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考