sxwz2.0/src/main/java/com/kexue/skills/aspect/AuthAspect.java
wangzhiwei 770f50302e feat(account): 扩展账户余额管理功能
- 新增可提现余额和不可提现余额字段,完善账户余额结构
- 添加充值接口支持微信和支付宝支付方式
- 实现token消费转换扣费功能,支持AI模型调用计费
- 增加管理员赠送金额接口,仅管理员可调用
- 完善交易记录查询功能,支持用户查看历史交易明细
- 集成模型价格服务,实现token费用自动计算
- 重构余额增加逻辑,区分可提现和不可提现金额
- 优化账户实体类初始化逻辑,确保余额字段正确设置
- 更新交易记录实体类,新增token相关和收支类型字段
- 修改支付配置,更新微信和支付宝回调地址为生产环境域名
2026-04-01 11:52:33 +08:00

76 lines
2.9 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.kexue.skills.aspect;
import com.kexue.skills.annotation.RequireAuth;
import com.kexue.skills.common.ResultCode;
import com.kexue.skills.exception.BizException;
import com.kexue.skills.interceptor.UserContextHolder;
import com.kexue.skills.service.SysUserService;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.annotation.Resource;
/**
* @author 维哥
* @Description 登录认证切面
* @create 2025-02-25 15:43
*/
@Aspect
@Component
@Slf4j
public class AuthAspect {
@Resource
private SysUserService sysUserService;
// 处理方法级别注解
@Around("@annotation(com.kexue.skills.annotation.RequireAuth)")
public Object requireAuthMethod(ProceedingJoinPoint joinPoint) throws Throwable {
return requireAuthImpl(joinPoint);
}
// 处理类级别注解
@Around("@within(com.kexue.skills.annotation.RequireAuth)")
public Object requireAuthClass(ProceedingJoinPoint joinPoint) throws Throwable {
return requireAuthImpl(joinPoint);
}
// 实际的认证逻辑
private Object requireAuthImpl(ProceedingJoinPoint joinPoint) throws Throwable {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String token = request.getHeader("Authorization");
StringBuffer requestURL = request.getRequestURL();
// 获取方法签名
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
try {
// 使用Sa-Token检查登录状态
cn.dev33.satoken.stp.StpUtil.checkLogin();
// 获取当前登录用户ID
Object loginId = cn.dev33.satoken.stp.StpUtil.getLoginId();
// 根据用户ID获取用户名
String username = sysUserService.queryById(Long.parseLong(loginId.toString())).getUserName();
log.info("用户名:{}token{}, URL:{}, 方法:{}.{}",
username, token, requestURL.toString(),
signature.getDeclaringType().getSimpleName(),
signature.getMethod().getName());
// 设置用户上下文
UserContextHolder.setUserName(username);
} catch (Exception e) {
log.error("认证失败:{}", e.getMessage());
throw new BizException(ResultCode.TOKEN_FAILED.getCode(), "无效的token请重新登录");
}
return joinPoint.proceed();
}
}