如何在微服务中添加基于 Jwt 令牌的安全性

Posted

技术标签:

【中文标题】如何在微服务中添加基于 Jwt 令牌的安全性【英文标题】:How to add Jwt Token based security In Microservices 【发布时间】:2021-10-03 03:15:18 【问题描述】:

在我的微服务中,我会尝试实现Jwt spring-security,但是我不知道如何应用它。

在我的微服务中,我使用了 2020.0.3 spring cloud 版本。 在用户服务中,我已经使用 Rest 模板连接了部门服务。 我需要有关如何在这些微服务中添加 Jwt 安全性的帮助。

这是 4 个微服务

服务器 = 尤里卡服务器

service-API-gateway = Spring cloud Apigateway

service-department & services-user = 这两个微服务与 Rest 模板连接

微服务项目结构 :https://i.stack.imgur.com/ajTiX.png

【问题讨论】:

【参考方案1】:

因此,在更高级别上,当使用 jwt 作为身份验证时,Spring Security 应用于控制器级别。首先,您需要添加一个将扩展 WebSecurityConfigurerAdapter 的安全配置(这对于基于 http 的安全性很常见),并且在该类中您需要定义配置方法,例如:

@Override
protected void configure(HttpSecurity http) throws Exception 
    http
            .httpBasic().disable()
            .csrf().disable()  // IF your clients connect without a cookie based, this will be fine
            .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and()
            .authorizeRequests()
            .antMatchers("/register", "/login","/your_open_endpoints_etc").permitAll()
            .and()
            .addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class);

然后在扩展OncePerRequestFilter的过滤器类中,你可以像这样定义do过滤器,你必须在Spring认证上下文中设置UsernamePasswordAuthenticationFilter实例:

@Override
protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException 
    logger.info("do filter...");
    String token = jwtProvider.getTokenFromRequest((HttpServletRequest) httpServletRequest);
    try
        if (token != null && jwtProvider.validateToken(token)) 
            String username = jwtProvider.getUsernameFromToken(token);
            UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(username, null, jwtProvider.getAuthorities(token));
            SecurityContextHolder.getContext().setAuthentication(auth);
        
        filterChain.doFilter(httpServletRequest, httpServletResponse);
    
    catch (RuntimeException e)
    
        // Some general Exception handling that will wrap and send as HTTP Response
    


进一步检查扩展过滤器,它们可能会根据您的要求进行更改

最后在休息端点你可以像这样保护:

@PreAuthorize("hasRole('ROLE_YOURROLE')")
@GetMapping(path = "/your_secured_endpoint", consumes = "application/json", 
  produces = "application/json")
public ResponseEntity<List<SomePOJOObject>> getAllAppointmentsForPatient()

   
    return new ResponseEntity<>(thatSomePOJOObjectListYouWant, HttpStatus.OK);

【讨论】:

你好,Shamitha 我会在 API 网关中添加这个配置吗?。 自 3 年前以来,spring 已经完全支持 JWT,编写自定义 JWT 过滤器安全解决方案是一种不好的做法docs.spring.io/spring-security/site/docs/current/reference/…downvoted。 @BhavikChavda 这应该放在你的 HTTP API 端,我认为应该有一个用作 REST API @BhavikChavda 这个工作吗?如果是这样,您可以接受答案,这样您就可以增加将来获得答案的机会

以上是关于如何在微服务中添加基于 Jwt 令牌的安全性的主要内容,如果未能解决你的问题,请参考以下文章

在微服务环境中,任何生产者都应该能够验证 JWT 令牌吗?

令牌被盗时如何添加额外的jwt安全层

如何在微服务架构中进行身份验证和授权

刷新令牌如何为 jwt 添加安全性?

使用 jwt 在微服务中进行身份验证

使用 Postman 在标头中发送 JWT 令牌