☰
融光 ai-fusion-video 安全与认证:Spring Security Token 鉴权、用户角色与团队权限完整指南
2026/10/11 20:39:10 网站建设 项目流程
  • 人工智能
  • 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.

项目地址:https://gitcode.com/gh_mirrors/ai/ai-fusion-video
点击查看免费下载

融光 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、角色、当前团队 IDfusion/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换取新的令牌对。

两个细节值得关注:

  1. 令牌轮换(Rotation):刷新时旧 refresh_token 立即作废,签发全新的 refresh_token(见 TokenService.java),即使旧刷新令牌泄露也无法重复使用;
  2. 单端登录: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(同文件)允许三种情况通过:

  1. 项目是自己个人创建的;
  2. 自己是项目成员(ProjectMember表);
  3. 项目属于当前团队,或项目创建者是团队内其他成员。

剧本(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 拦截器完成了体验闭环:

  1. 请求拦截:自动注入Authorization: Bearer {access_token};
  2. 401 自动刷新:捕获 401 后调用/api/auth/refresh,并采用刷新队列机制——刷新期间并发的其他请求排队等待,避免重复刷新;
  3. 失败兜底:刷新失败或 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.

项目地址:https://gitcode.com/gh_mirrors/ai/ai-fusion-video
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询