All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.taotao.cloud.security.satoken.configuration.SaTokenConfiguration Maven / Gradle / Ivy

There is a newer version: 2024.09
Show newest version
/*
 * Copyright (c) 2020-2030, Shuigedeng ([email protected] & https://blog.taotaocloud.top/).
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.taotao.cloud.security.satoken.configuration;

import cn.dev33.satoken.jwt.StpLogicJwtForSimple;
import cn.dev33.satoken.stp.StpLogic;
import cn.dev33.satoken.strategy.SaStrategy;
import cn.dev33.satoken.util.SaFoxUtil;
import com.taotao.cloud.common.constant.StarterName;
import com.taotao.cloud.common.utils.log.LogUtils;
import com.taotao.cloud.security.satoken.current.GlobalException;
import com.taotao.cloud.security.satoken.current.NotFoundHandle;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication.Type;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.core.annotation.AnnotatedElementUtils;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * [Sa-Token 权限认证] 配置类
 *
 * @author kong
 */
@ConditionalOnWebApplication(type = Type.SERVLET)
@Configuration
@Import({
    MySaTokenListener.class,
    SaLogForSlf4j.class,
    StpInterfaceImpl.class,
    StpUserUtil.class,
    GlobalException.class,
    NotFoundHandle.class
})
public class SaTokenConfiguration implements WebMvcConfigurer, InitializingBean {

    @Override
    public void afterPropertiesSet() throws Exception {
        LogUtils.started(SaTokenConfiguration.class, StarterName.SECURITY_SATOKEN_STARTER);
    }

    /** 注册 Sa-Token 拦截器打开注解鉴权功能 */
    // @Override
    // public void addInterceptors(InterceptorRegistry registry) {
    // 	// 注册 Sa-Token 拦截器打开注解鉴权功能
    // 	registry.addInterceptor(new SaInterceptor(handle -> {
    // 		// SaManager.getLog().debug("----- 请求path={}  提交token={}",
    // SaHolder.getRequest().getRequestPath(), StpUtil.getTokenValue());
    //
    // 		// 指定一条 match 规则
    // 		SaRouter
    // 			.match("/user/**")    // 拦截的 path 列表,可以写多个
    // 			.notMatch("/user/doLogin", "/user/doLogin2")     // 排除掉的 path 列表,可以写多个
    // 			.check(r -> StpUtil.checkLogin());        // 要执行的校验动作,可以写完整的 lambda 表达式
    //
    // 		// 权限校验 -- 不同模块认证不同权限
    // 		SaRouter.match("/admin/**", r -> StpUtil.checkPermission("admin"));
    // 		SaRouter.match("/goods/**", r -> StpUtil.checkPermission("goods"));
    // 		SaRouter.match("/orders/**", r -> StpUtil.checkPermission("orders"));
    // 		SaRouter.match("/notice/**", r -> StpUtil.checkPermission("notice"));
    // 		SaRouter.match("/comment/**", r -> StpUtil.checkPermission("comment"));
    //
    // 		// 甚至你可以随意的写一个打印语句
    // 		SaRouter.match("/router/print", r -> LogUtils.info("----啦啦啦----"));
    //
    // 		// 写一个完整的 lambda
    // 		SaRouter.match("/router/print2", r -> {
    // 			LogUtils.info("----啦啦啦2----");
    // 			// ... 其它代码
    // 		});
    //
    // 		/*
    // 		 * 相关路由都定义在 com.pj.cases.use.RouterCheckController 中
    // 		 */
    //
    // 		// 将match中的SaFunction function参数设置为IgnoreSaRouteFunction对象,就可以实现添加注解忽略权限验证
    // 		SaRouter.match("/**", "/login", new IgnoreSaRouteFunction(handle));
    //
    // 	})).addPathPatterns("/**");
    //
    // 	registry.addInterceptor(new SaAnnotationInterceptor()).addPathPatterns("/**");
    // }

    /** 注册 [Sa-Token 全局过滤器] */
    // @Bean
    // public SaServletFilter getSaServletFilter() {
    // 	return new SaServletFilter()
    //
    // 		// 指定 [拦截路由] 与 [放行路由]
    // 		.addInclude("/**")// .addExclude("/favicon.ico")
    //
    // 		// 认证函数: 每次请求执行
    // 		.setAuth(obj -> {
    // 			// LogUtils.info("---------- sa全局认证 " + SaHolder.getRequest().getRequestPath());
    // 			// SaManager.getLog().debug("----- 请求path={}  提交token={}",
    // SaHolder.getRequest().getRequestPath(), StpUtil.getTokenValue());
    //
    // 			// 权限校验 -- 不同模块认证不同权限
    // 			//		这里你可以写和拦截器鉴权同样的代码,不同点在于:
    // 			// 		校验失败后不会进入全局异常组件,而是进入下面的 .setError 函数
    // 			SaRouter.match("/admin/**", r -> StpUtil.checkPermission("admin"));
    // 			SaRouter.match("/goods/**", r -> StpUtil.checkPermission("goods"));
    // 			SaRouter.match("/orders/**", r -> StpUtil.checkPermission("orders"));
    // 			SaRouter.match("/notice/**", r -> StpUtil.checkPermission("notice"));
    // 			SaRouter.match("/comment/**", r -> StpUtil.checkPermission("comment"));
    // 		})
    //
    // 		// 异常处理函数:每次认证函数发生异常时执行此函数
    // 		.setError(e -> {
    // 			LogUtils.info("---------- sa全局异常 ");
    // 			return SaResult.error(e.getMessage());
    // 		})
    //
    // 		// 前置函数:在每次认证函数之前执行
    // 		.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")
    // 			;
    // 		})
    // 		;
    // }

    /** 重写 Sa-Token 框架内部算法策略 */
    @Autowired
    public void rewriteSaStrategy() {
        // 重写Sa-Token的注解处理器,增加注解合并功能
        SaStrategy.instance.getAnnotation = AnnotatedElementUtils::getMergedAnnotation;

        // 重写 Token 生成策略
        SaStrategy.instance.createToken = (loginId, loginType) -> {
            return SaFoxUtil.getRandomString(60); // 随机60位长度字符串
        };
    }

    /** Sa-Token 整合 jwt */
    @Bean
    public StpLogic getStpLogicJwt() {
        return new StpLogicJwtForSimple();
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy