| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- package com.xjrsoft.config;
- import cn.dev33.satoken.context.SaHolder;
- import cn.dev33.satoken.exception.DisableServiceException;
- import cn.dev33.satoken.exception.NotLoginException;
- import cn.dev33.satoken.exception.NotPermissionException;
- import cn.dev33.satoken.exception.NotRoleException;
- import cn.dev33.satoken.filter.SaServletFilter;
- import cn.dev33.satoken.router.SaHttpMethod;
- import cn.dev33.satoken.router.SaRouter;
- import cn.dev33.satoken.stp.StpUtil;
- import cn.dev33.satoken.temp.SaTempUtil;
- import cn.dev33.satoken.util.SaResult;
- import cn.hutool.core.util.StrUtil;
- import com.xjrsoft.common.constant.GlobalConstant;
- import com.xjrsoft.common.enums.ResponseCode;
- import com.xjrsoft.common.exception.MyException;
- import com.xjrsoft.common.interceptor.MagicApiWebLoginInterceptor;
- import com.xjrsoft.common.interceptor.RateLimitInterceptor;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
- import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
- import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
- /**
- * @Author: tzx
- * @Date: 2022/3/3 17:18
- */
- @Configuration
- public class SaTokenConfig implements WebMvcConfigurer {
- @Autowired
- private MagicApiConfig magicApiConfig;
- @Autowired
- private CommonPropertiesConfig commonPropertiesConfig;
- /**
- * 注册Sa-Token 的拦截器,打开注解式鉴权功能
- */
- @Override
- public void addInterceptors(InterceptorRegistry registry) {
- // 注册MagicApi登录判断拦截器
- registry.addInterceptor(new MagicApiWebLoginInterceptor()).addPathPatterns(magicApiConfig.getWeb() + "/**");
- // 注册拦截器
- registry.addInterceptor(getRateLimitInterceptor()).addPathPatterns("/**");
- //satoken 注解鉴权拦截器
- // registry.addInterceptor(new SaAnnotationInterceptor()).addPathPatterns("/**");
- }
- @Bean
- public RateLimitInterceptor getRateLimitInterceptor(){
- return new RateLimitInterceptor();
- }
- /**
- * 注册 [Sa-Token全局过滤器]
- */
- @Bean
- public SaServletFilter getSaServletFilter() {
- return new SaServletFilter()
- // 指定 拦截路由 与 放行路由
- .addInclude("/**")
- .addExclude(commonPropertiesConfig.getExcludeUrls().toArray(new String[0]))
- // 认证函数: 每次请求执行
- .setAuth(obj -> {
- // 登录认证 -- 拦截所有路由,并排除/user/doLogin 用于开放登录
- if (commonPropertiesConfig.getWhiteList().contains(SaHolder.getRequest().getUrl())) {
- return;
- }
- String token = SaHolder.getRequest().getParam("token");
- if (StrUtil.isNotBlank(token)) {
- try {
- String tokenValue = SaTempUtil.parseToken(token, String.class);
- if (!tokenValue.contains(GlobalConstant.SECRET_KEY) || SaTempUtil.getTimeout(token) < 1) {
- throw new MyException("临时token 无效!");
- } else {
- return;
- }
- } catch (Exception e) {
- throw new MyException("临时token 无效!");
- }
- }
- SaRouter.match("/**", "/system/login", StpUtil::checkLogin);
- // 更多拦截处理方式,请参考“路由拦截式鉴权”章节
- })
- // 异常处理函数:每次认证函数发生异常时执行此函数
- .setError(e -> {
- if (e instanceof NotLoginException) { // 如果是未登录异常3
- return SaResult.get(ResponseCode.UN_AUTHORIZED.getCode(), ResponseCode.UN_AUTHORIZED.getMessage(), null);
- } else if (e instanceof NotRoleException) { // 如果是角色异常
- return SaResult.get(ResponseCode.REQ_REJECT.getCode(), ResponseCode.REQ_REJECT.getMessage(), null);
- } else if (e instanceof NotPermissionException) { // 如果是权限异常
- return SaResult.get(ResponseCode.REQ_REJECT.getCode(), ResponseCode.REQ_REJECT.getMessage(), null);
- } else if (e instanceof DisableServiceException) { // 如果是被封禁异常
- return SaResult.get(ResponseCode.REQ_REJECT.getCode(), ResponseCode.REQ_REJECT.getMessage(), null);
- } else { // 普通异常, 输出:500 + 异常信息
- return SaResult.get(ResponseCode.INTERNAL_SERVER_ERROR.getCode(), ResponseCode.INTERNAL_SERVER_ERROR.getMessage(), null);
- }
- })
- // 前置函数:在每次认证函数之前执行
- .setBeforeAuth(r -> {
- // ---------- 设置一些安全响应头 ----------
- SaHolder.getResponse()
- // 服务器名称
- .setServer("sa-server")
- // 是否可以在iframe显示视图: DENY=不可以 | SAMEORIGIN=同域下可以 | ALLOW-FROM uri=指定域名下可以
- .setHeader("X-Frame-Options", "SAMEORIGIN")
- // 是否启用浏览器默认XSS防护: 0=禁用 | 1=启用 | 1; mode=block 启用, 并在检查到XSS攻击时,停止渲染页面
- .setHeader("X-XSS-Protection", "1; mode=block")
- // 禁用浏览器内容嗅探
- .setHeader("X-Content-Type-Options", "nosniff")
- // 域名
- .setHeader("Access-Control-Allow-Origin", "*")
- // 请求方式
- .setHeader("Access-Control-Allow-Methods", "POST,GET,OPTIONS,DELETE,PUT")
- // 缓存时间
- .setHeader("Access-Control-Max-Age", "3600")
- // 请求头
- .setHeader("Access-Control-Allow-Headers", "*");
- //option 必须跳过 不然会影响 cors配置 而且 必须放在设置请求头后面
- SaRouter.match(SaHttpMethod.OPTIONS).back();
- });
- }
- }
|