当前位置: 首页 > news >正文

在车子男女做的视频网站微信公众平台推广

在车子男女做的视频网站,微信公众平台推广,crm客户管理系统设计,黑群晖架设wordpress构建现代微服务安全体系:Spring Security、JWT 与 Spring Cloud Gateway 实践 本文将基于提供的代码示例,详细介绍如何在一个Java微服务项目中使用Spring Security、JWT和Spring Cloud Gateway来构建一个高效且安全的微服务体系,并整合性能优…

构建现代微服务安全体系:Spring Security、JWT 与 Spring Cloud Gateway 实践

本文将基于提供的代码示例,详细介绍如何在一个Java微服务项目中使用Spring Security、JWT和Spring Cloud Gateway来构建一个高效且安全的微服务体系,并整合性能优化措施。

基础流程

  1. 登录认证:客户端通过用户名和密码获取JWT
    流程描述:客户端发送包含用户名和密码的登录请求到身份验证端点。服务器验证这些凭据的有效性后,使用JwtTokenProvider生成一个JWT,并将其返回给客户端。
    关键点:
    客户端在成功登录后保存JWT,通常是在HTTP头中以Authorization: Bearer 的形式携带。
    JWT包含了用户的身份信息(如用户ID、角色等)以及过期时间。
  2. 请求路由:Gateway验证JWT签名和基础有效性
    流程描述:当客户端发起API请求时,Spring Cloud Gateway首先拦截请求,通过JwtAuthenticationWebFilter过滤器来验证JWT的签名是否正确及令牌的基础有效性(如是否过期)。
    关键点:
    使用JwtTokenProvider中的方法来解析和验证JWT。
    如果验证失败,直接返回错误响应;如果成功,则继续处理请求。
  3. 上下文传递:微服务解析JWT生成SecurityContext
    流程描述:一旦Gateway验证了JWT的有效性,请求被转发到相应的微服务。在微服务内部,JwtAuthenticationTokenFilter再次检查JWT,从中提取用户信息并创建UsernamePasswordAuthenticationToken对象,然后将这个对象设置到Spring Security上下文中。
    关键点:
    JwtTokenProvider用于从JWT中提取用户信息(如用户ID、角色等),并据此构建认证对象。
    这个步骤确保了每个请求都能在微服务层面上识别出当前用户及其权限。
  4. 权限校验:方法级注解实现动态权限控制
    流程描述:在微服务的方法上应用Spring Security提供的注解(如@PreAuthorize或@Secured),根据用户的角色或权限动态地控制对资源的访问。
    关键点:
    利用Spring Security的表达式语言支持,可以灵活地定义访问控制规则。
    只有当用户的权限满足特定条件时,才能执行受保护的方法或访问特定的资源。
  5. 令牌刷新:通过Refresh Token无感续期Access Token
    流程描述:为了延长用户的会话而不需重新登录,系统提供了一个刷新令牌(Refresh Token)。当Access Token即将过期时,客户端可以使用Refresh Token向服务器请求新的Access Token。
    关键点:
    Refresh Token的安全存储非常重要,应确保其不能轻易被第三方获取。
    实现逻辑需要确保旧的Access Token失效,并生成一个新的有效期内的Access Token返回给客户端。

具体实现

1. Spring Security 配置

首先,我们从Spring Security配置开始。你已经提供了一个基本的SecurityConfig类,它负责配置认证和授权管理。以下是基于你的代码示例进行的一些优化和扩展:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Autowiredprivate UserDetailsServiceImpl userDetailsService;@Autowiredprivate JwtAuthenticationTokenFilter jwtAuthenticationTokenFilter;@Autowiredprivate AuthenticationEntryPoint authenticationEntryPoint;@Autowiredprivate AccessDeniedHandler accessDeniedHandler;@Overrideprotected void configure(HttpSecurity http) throws Exception {http.csrf().disable().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and().addFilterBefore(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class).authorizeRequests().antMatchers("/auth/register", "/auth/login").permitAll().anyRequest().authenticated().and().exceptionHandling().authenticationEntryPoint(authenticationEntryPoint).accessDeniedHandler(accessDeniedHandler).and().cors();}@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());}@Beanpublic PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}@Bean@Overridepublic AuthenticationManager authenticationManagerBean() throws Exception {return super.authenticationManagerBean();}
}

性能优化点:

  • 禁用不必要的过滤器链: 如WebAsyncManagerIntegrationFilter等,以减少过滤器链长度,提高性能。
  • 启用预授权功能: 使用@EnableGlobalMethodSecurity(prePostEnabled = true)注解启用方法级别的权限控制,减少不必要的安全性检查。
2. JWT Filter 实现

接下来是JWT过滤器的实现,用于在请求到达服务之前验证JWT的有效性。这里我们还将集成缓存策略以提高性能。

@Component
public class JwtAuthenticationTokenFilter extends OncePerRequestFilter {@Autowiredprivate JwtTokenProvider jwtTokenProvider; // 使用JwtTokenProvider@Autowiredprivate StringRedisTemplate redisTemplate;// Caffeine Cache for token parsing results cachingprivate final Cache<String, Claims> tokenCache = Caffeine.newBuilder().maximumSize(1000).expireAfterWrite(10, TimeUnit.MINUTES).build();@Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {String token = request.getHeader("token");if (token == null) {filterChain.doFilter(request, response);return;}Claims claims = getCachedClaims(token);if (claims == null) {// 使用JwtTokenProvider的validateToken方法验证token,并获取Claimsif(jwtTokenProvider.validateToken(token)) {// 假设JwtTokenProvider有一个getClaimsFromToken方法用于获取Claimsclaims = jwtTokenProvider.getClaimsFromToken(token);setCachedClaims(token, claims);} else {throw new RuntimeException("无效的JWT令牌");}}String userId = (String) claims.get("userId");String redisKey = "login:" + userId;String userStr = redisTemplate.opsForValue().get(redisKey);LoginUser loginUser = JSONUtil.toBean(userStr, LoginUser.class);if (loginUser == null) {throw new RuntimeException("用户未登录");}UsernamePasswordAuthenticationToken authenticationToken =new UsernamePasswordAuthenticationToken(loginUser, null, loginUser.getAuthorities());SecurityContextHolder.getContext().setAuthentication(authenticationToken);filterChain.doFilter(request, response);}private Claims getCachedClaims(String token) {return tokenCache.getIfPresent(token);}private void setCachedClaims(String token, Claims claims) {tokenCache.put(token, claims);}
}

性能优化点:

  • Caffeine Cache: 在解析JWT时先检查缓存,避免重复解析带来的性能损耗。
3. Spring Cloud Gateway 中集成 JWT 验证

为了让Gateway能够提前验证JWT,我们需要在Gateway层添加相应的过滤器。

import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/**
* 一个使用Spring Cloud Gateway的路由定位器(RouteLocator),它配置了一个路由规则,
* 用于将匹配特定路径模式的请求转发到指定的服务,并在转发前通过一个过滤器(JwtAuthenticationWebFilter)进行处理。
*/
@Configuration
public class GatewayConfig {@Beanpublic RouteLocator customRouteLocator(RouteLocatorBuilder builder) {return builder.routes().route("service_route", r -> r.path("/service/**").filters(f -> f.filter(new JwtAuthenticationWebFilter())).uri("lb://service")).build();}
}
public class JwtAuthenticationWebFilter implements GatewayFilter, Ordered {private final JwtTokenProvider jwtTokenProvider;public JwtAuthenticationWebFilter(JwtTokenProvider jwtTokenProvider) {this.jwtTokenProvider = jwtTokenProvider;}/***  filter方法是过滤器的核心逻辑,每当有请求经过时都会调用此方法。*  首先从请求中提取JWT令牌(resolveToken)。*  如果令牌存在且有效,则使用jwtTokenProvider获取对应的认证信息(Authentication)。*  将认证信息设置到SecurityContext中,以便后续处理可以访问到当前用户的身份信息。*  最后,继续处理请求链(chain.filter(exchange)),即将请求传递给下一个过滤器或目标服务*/@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {ServerHttpRequest request = exchange.getRequest();String token = resolveToken(request);if (token != null && jwtTokenProvider.validateToken(token)) {Authentication auth = jwtTokenProvider.getAuthentication(token);SecurityContext securityContext = SecurityContextHolder.createEmptyContext();securityContext.setAuthentication(auth);SecurityContextHolder.setContext(securityContext);}return chain.filter(exchange);}private String resolveToken(ServerHttpRequest request) {String bearerToken = request.getHeaders().getFirst("Authorization");if (bearerToken != null && bearerToken.startsWith("Bearer ")) {return bearerToken.substring(7);}return null;}@Overridepublic int getOrder() {return -200; // 设置优先级}
}
4. JWT Token 的生成与刷新机制

为了提高用户体验,可以实现refresh token机制,允许用户通过refresh token获取新的access token。

@PostMapping("/token/refresh")
public ResponseEntity<?> refreshToken(@RequestBody TokenRefreshRequest request) {String refreshToken = request.getRefreshToken();if (jwtTokenProvider.validateToken(refreshToken)) {String accessToken = jwtTokenProvider.generateAccessTokenFromUsername(jwtTokenProvider.getUsernameFromToken(refreshToken));return ResponseEntity.ok(new TokenRefreshResponse(accessToken, refreshToken));} else {return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("Invalid refresh token");}
}
5. 监控关键指标

为了及时发现潜在的安全威胁,加入监听并记录Spring Security的安全事件。

@EventListener
public void monitorAuthEvents(AbstractAuthenticationEvent event) {if(event instanceof AuthenticationSuccessEvent){log.info("认证成功: {}", event.getAuthentication().getName());} else if(event instanceof AuthenticationFailureBadCredentialsEvent){metrics.increment("auth.failure.bad_credentials");}
}

这些措施包括了禁用不必要的过滤器链、使用Caffeine Cache缓存JWT解析结果等,确保系统既安全又高效。

http://www.yayakq.cn/news/438307/

相关文章:

  • 东丽区装饰网站建设电子商务网页设计与网站建设论文
  • 昆明网站建设精英电商怎么做
  • 网站建设域名空间网站制作软件dw
  • 同ip网站有什么影响西安黄页网
  • 网站怎么建设商城微信小程序网站建设方案
  • 网页设计公司哪家效果好无锡网站建设seo
  • 百度网站的总结找it工作有什么好的招聘网站
  • 网站建设的通知唯美古风ppt模板
  • 网站设计流程电话网站设计要素 优帮云
  • 学校信息门户网站建设毕设做网站什么主题比较好
  • 龙南建设局网站深圳十大工业设计公司
  • vue 做自适应网站建设企业网站的人员组成
  • 湖北网站建设服务郑州做网站的公司哪家好
  • 手机wap网站开发idc销售网站模板
  • 网站推广都有哪些市场营销策略国内外研究现状
  • 移动端网站开发语言wordpress自己安装了插件吗
  • 网站建设包括哪方面app注册推广团队
  • 搜索关键字搜索到网站建立网站怎么做关键字
  • 网站开发专业的PS做网站报价
  • 做汽配网站需要多少钱济南做手机网站
  • 自己做网站 最好的软件电商小程序名字
  • 如何在网站上做支付功能做软件销售网站
  • 服务平台收件箱长春做网站seo的
  • 电子商务网站建设技术规范网站建设团队介绍怎么写
  • 翼讯自助网站建设贷款网站哪家好
  • 音乐网站后台管理模板工装公司联系方式
  • 公司网站开发项目外包方案html5做网站的总结
  • 做微信小程序哪个网站好网站网站建设策划书
  • 详情页制作西安seo整站优化
  • 免费搭建私人网站线上销售平台有哪些