您的位置:首页 > 科技 > IT业 > 营销策划方案1000例_翠屏区建投公司官网_seo官网优化_百度登录入口

营销策划方案1000例_翠屏区建投公司官网_seo官网优化_百度登录入口

2024/10/6 16:25:02 来源:https://blog.csdn.net/weixin_39311781/article/details/142216308  浏览:    关键词:营销策划方案1000例_翠屏区建投公司官网_seo官网优化_百度登录入口
营销策划方案1000例_翠屏区建投公司官网_seo官网优化_百度登录入口

一、网关鉴权

1.1 引入依赖

<!-- Sa-Token 权限认证(Reactor响应式集成), 在线文档:https://sa-token.cc -->
<dependency><groupId>cn.dev33</groupId><artifactId>sa-token-reactor-spring-boot3-starter</artifactId><version>1.39.0</version>
</dependency><!-- Sa-Token 整合 Redis (使用 jackson 序列化方式) -->
<dependency><groupId>cn.dev33</groupId><artifactId>sa-token-redis-jackson</artifactId><version>1.39.0</version>
</dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId>
</dependency>

1.2 鉴权接口

package com.ozo.cloud.gateway.core;import cn.dev33.satoken.stp.StpInterface;
import com.ozo.cloud.common.base.context.CurrentUserHolder;
import com.ozo.cloud.common.base.model.LoginUser;import java.util.ArrayList;
import java.util.List;/*** 权限实现类** @author qiangesoft* @date 2024-07-08**/
public class SaPermissionImpl implements StpInterface {/*** 获取菜单权限列表*/@Overridepublic List<String> getPermissionList(Object loginId, String loginType) {LoginUser loginUser = CurrentUserHolder.current();return new ArrayList<>(loginUser.getMenuPermission());}/*** 获取角色权限列表*/@Overridepublic List<String> getRoleList(Object loginId, String loginType) {LoginUser loginUser = CurrentUserHolder.current();return new ArrayList<>(loginUser.getRolePermission());}}

1.3 过滤器配置

package com.ozo.cloud.gateway.config;import cn.dev33.satoken.context.SaHolder;
import cn.dev33.satoken.context.model.SaResponse;
import cn.dev33.satoken.reactor.filter.SaReactorFilter;
import cn.dev33.satoken.router.SaHttpMethod;
import cn.dev33.satoken.router.SaRouter;
import cn.dev33.satoken.stp.StpInterface;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.http.ContentType;
import cn.hutool.http.Header;
import cn.hutool.json.JSONUtil;
import com.ozo.cloud.common.base.model.ResultVO;
import com.ozo.cloud.gateway.config.properties.SecurityProperties;
import com.ozo.cloud.gateway.core.SaPermissionImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.util.List;/*** 鉴权配置** @author qiangesoft* @date 2024-07-08**/
@EnableConfigurationProperties(SecurityProperties.class)
@Configuration
public class SaTokenConfig {@Autowiredprivate SecurityProperties securityProperties;@Beanpublic StpInterface stpInterface() {return new SaPermissionImpl();}/*** 注册过滤器*/@Beanpublic SaReactorFilter saServletFilter() {SaReactorFilter saReactorFilter = new SaReactorFilter();// 前置函数:在每次认证函数之前执行saReactorFilter.setBeforeAuth(obj -> {// 设置跨域响应头SaHolder.getResponse()// 是否可以在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").setHeader("Access-Control-Max-Age", "3600").setHeader("Access-Control-Allow-Headers", "*");// 如果是预检请求,则立即返回到前端SaRouter.match(SaHttpMethod.OPTIONS).free(r -> {}).back();})// 异常处理.setError(e -> {// 由于过滤器中抛出的异常不进入全局异常处理,所以此处统一转为JSON输出前端SaResponse saResponse = SaHolder.getResponse();saResponse.setHeader(Header.CONTENT_TYPE.getValue(), ContentType.JSON + ";charset=" + CharsetUtil.UTF_8);return JSONUtil.parseObj(ResultVO.fail(e.getMessage()));});// 指定拦截路由saReactorFilter.addInclude("/**")// 设置鉴权的接口.setAuth(obj -> {// 登录校验 -- 拦截所有路由SaRouter.match("/**", r -> StpUtil.checkLogin());});// 指定开放路由List<String> excludePathPatterns = securityProperties.getExcludePathPatterns();if (CollUtil.isNotEmpty(excludePathPatterns)) {saReactorFilter.addExclude(excludePathPatterns.toArray(new String[0]));}return saReactorFilter;}}

1.4 子服务添加Token

package com.ozo.cloud.gateway.filter;import cn.dev33.satoken.same.SaSameUtil;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;/*** 全局过滤器,为请求添加 Same-Token** @author qiangesoft* @date 2024-09-10*/
@Component
public class ForwardAuthFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {ServerHttpRequest newRequest = exchange.getRequest().mutate()// 为请求追加 Same-Token 参数 .header(SaSameUtil.SAME_TOKEN, SaSameUtil.getToken()).build();ServerWebExchange newExchange = exchange.mutate().request(newRequest).build();return chain.filter(newExchange);}@Overridepublic int getOrder() {return 0;}}

二、子服务鉴权

2.1 引入依赖

<!-- Sa-Token 权限认证, 在线文档:https://sa-token.cc -->
<dependency><groupId>cn.dev33</groupId><artifactId>sa-token-spring-boot3-starter</artifactId><version>1.39.0</version>
</dependency><!-- Sa-Token 整合 Redis (使用 jackson 序列化方式) -->
<dependency><groupId>cn.dev33</groupId><artifactId>sa-token-redis-jackson</artifactId><version>1.39.0</version>
</dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId>
</dependency>

2.2 过滤器配置

package com.ozo.cloud.common.satoken.config;import cn.dev33.satoken.context.SaHolder;
import cn.dev33.satoken.context.model.SaResponse;
import cn.dev33.satoken.filter.SaServletFilter;
import cn.dev33.satoken.interceptor.SaInterceptor;
import cn.dev33.satoken.same.SaSameUtil;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.http.ContentType;
import cn.hutool.http.Header;
import cn.hutool.json.JSONUtil;
import com.ozo.cloud.common.base.model.ResultVO;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;/*** Sa-Token 权限认证 配置类 ** @author qiangesoft* @date 2024-09-10*/
@AutoConfiguration
public class SaTokenConfig implements WebMvcConfigurer {/*** 注解鉴权拦截器*/@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new SaInterceptor()).addPathPatterns("/**");}/*** 注册 Sa-Token 全局过滤器*/@Beanpublic SaServletFilter getSaServletFilter() {return new SaServletFilter()// 指定拦截路由.addInclude("/**").setAuth(obj -> {// 校验 Same-Token 身份凭证SaSameUtil.checkCurrentRequestToken();})// 异常处理.setError(e -> {// 由于过滤器中抛出的异常不进入全局异常处理,所以此处统一转为JSON输出前端SaResponse saResponse = SaHolder.getResponse();saResponse.setHeader(Header.CONTENT_TYPE.getValue(), ContentType.JSON + ";charset=" + CharsetUtil.UTF_8);return JSONUtil.parseObj(ResultVO.fail(e.getMessage()));});}@Bean@ConditionalOnMissingBeanpublic PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}}

2.3 拦截器

package com.ozo.cloud.common.satoken.interceptor;import cn.dev33.satoken.same.SaSameUtil;
import feign.RequestInterceptor;
import feign.RequestTemplate;/*** feign拦截器, 在feign请求发出之前,加入一些操作** @author qiangesoft* @date 2024-09-10*/
public class FeignInterceptor implements RequestInterceptor {/*** 为 Feign 的 RCP调用 添加请求头Same-Token*/@Overridepublic void apply(RequestTemplate requestTemplate) {requestTemplate.header(SaSameUtil.SAME_TOKEN, SaSameUtil.getToken());// 如果希望被调用方有会话状态,此处就还需要将 satoken 添加到请求头中// requestTemplate.header(StpUtil.getTokenName(), StpUtil.getTokenValue());}}

2.4 接口使用拦截器

package com.ozo.cloud.api.auth.feign;import com.ozo.cloud.common.base.model.ResultVO;
import com.ozo.cloud.common.satoken.interceptor.FeignInterceptor;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;/*** 授权服务调用** @author qiangesoft* @date 2024-09-11*/
@FeignClient(name = "ozo-cloud-auth", path = "/auth", configuration = FeignInterceptor.class)
public interface AuthFeignClient {@GetMapping("/userInfo")ResultVO<Object> getUserInfo();}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com