当前位置: 首页 > 知识库问答 >
问题:

具有Spring启动启动Web的Spring Cloud网关

余铭晨
2023-03-14

我正在使用Spring Cloud网关为Spring Boot微服务创建网关。网关还负责使用Spring Security进行JWT授权。

public class JwtAuthorizationFilter extends BasicAuthenticationFilter {

    ...

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
            throws IOException, ServletException {

        String header = request.getHeader(JwtProperties.HEADER_STRING);

        if (header == null || !header.startsWith(JwtProperties.TOKEN_PREFIX)) {
            chain.doFilter(request, response);
            return;
        }

        Authentication authentication = getUsernamePasswordAuthentication(request);
        SecurityContextHolder.getContext().setAuthentication(authentication);

        chain.doFilter(request, response);
    }

    private Authentication getUsernamePasswordAuthentication(HttpServletRequest request) {
        String token = request.getHeader(JwtProperties.HEADER_STRING).replace(JwtProperties.TOKEN_PREFIX, "");

        DecodedJWT decodedJWT = JWT.require(Algorithm.HMAC512(JwtProperties.SECRET.getBytes())).build().verify(token);
        String username = decodedJWT.getSubject();

        if (username != null) {
            UserPrincipal principal = (UserPrincipal) userPrincipalService.loadUserByUsername(username);
            Authentication auth = new UsernamePasswordAuthenticationToken(username, null, principal.getAuthorities());
            return auth;
        }
        return null;
    }

}

此筛选器在配置方法中注册,如下所示:

@Configuration
@EnableWebSecurity
public class ApplicationSecurityConfig extends WebSecurityConfigurerAdapter {
    
    ...
    
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .cors()
            .and()
            .csrf().disable()
            .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and()
            .addFilter(new JwtAuthorizationFilter(authenticationManager(), userPrincipalService))
            .authorizeRequests()
            .antMatchers(HttpMethod.POST, "/login").permitAll()
            ...
            .anyRequest().authenticated();
        
    }
...
}

如您所见,Spring Security性使用HttpServletRequest、HttpServletResponse和FilterChain接口,这些接口属于Spring启动程序web。但这是主要的问题,因为它与SpringCloudGateway不兼容。

Spring MVC found on classpath, which is incompatible with Spring Cloud Gateway at this time. Please remove spring-boot-starter-web dependency.

在网关上实现jwt授权过滤器是否有任何方法可以避免此错误或任何不同的解决方案?谢谢

共有1个答案

陈松
2023-03-14

在Spring云网关的文档中,明确说明了该产品运行在Netty之上,需要网络流量,因此它与Spring MVC不兼容。

您使用的过滤器(JwtAuthorizationFilter)属于非反应性世界,因此您可能应该使用spring security for web flux构建块重写它。

免责声明,我不是Spring WebFuns/Spring Security专家,但是请考虑检查这个应用程序——它显示了如何用JavaSecurity的反作用版本定义JWT安全应用程序。

因此,归根结底,你应该选择是想要一个反应性应用程序还是一个传统的应用程序,并使用相关的技术,但你不能真正混合它们。

 类似资料:
  • 问题内容: 我一直在研究Spring / Spring MVC应用程序,并且希望添加性能指标。我遇到过Spring Boot Actuator,它看起来是一个不错的解决方案。但是我的应用程序不是Spring Boot应用程序。我的应用程序在传统容器Tomcat 8中运行。 我添加了以下依赖 我创建了以下配置类。 我什至可以按照StackOverflow另一篇文章的建议在每个配置类上添加 问题答案:

  • 我在启动spring boot应用程序时遇到以下错误。这是我的第一个spring boot项目。因此,我不确定错误以及如何修复它。 申请启动失败 描述: 配置为侦听端口8080的Tomcat连接器无法启动。端口可能已在使用中,或者连接器可能配置错误。 行动: 验证连接器的配置,识别并停止在端口8080上侦听的任何进程,或者将此应用程序配置为在另一个端口上侦听。

  • 我正在使用一个Maven多模块,其中一场战争取决于另一场战争。 Spring Boot webapp依赖于只提供html文件的基本webapp。 当我运行SpringBoot应用程序时,我能够从主webapp(SpringBoot应用程序)访问服务和html,但是我不能从DependencyWar(404)访问html文件。但是这些html文件在SpringBootWebApp战争中得到了很好的打

  • 我目前正在开发一个部署在heroku中的Spring Boot应用程序。该应用程序在同一回购协议上有两个主要项目(前端和后端)。我设法用node运行了前端。js和(技术上)也成功地运行了spring boot应用程序。 根据日志,一切似乎都正常,但当我访问应用程序时,它返回一个HTTP 500,声称没有运行Web进程。 但当我和heroku ps联系时 这是我的文件: 它声明两个进程(一个用于前端

  • 当SpringWebServiceStarter与2.1一起使用时,我无法构建SpringBoot应用程序。13.Spring护套的释放版本。这是因为SpringWS-core:jar:3.0。8.释放。 构建应用程序时出现异常:它出现在默认测试用例执行期间。 警告: 组织的POM。springframework。ws:springws-core:jar:3.0。8.版本无效,可传递依赖项(如果有

  • 版本1.5.4运行良好,没有在Spring Boot Admin客户端的POM中额外声明starter web。当我升级到2.0.1时,我不得不将starter web添加到POM中以使其工作。如果客户端应用程序中没有starter web,则不会出现与注册应用程序相关的错误或日志。 据我所知,任何地方都没有记录。谁能确认一下吗?