无需用户登录即可保护 Spring Boot 应用程序

Posted

技术标签:

【中文标题】无需用户登录即可保护 Spring Boot 应用程序【英文标题】:Secure spring boot app without user log on 【发布时间】:2021-03-22 10:10:18 【问题描述】:

我正在创建一个 Spring Boot API 并在我正在处理的项目中对前端做出反应。前端没有用户登录,但是,我想确保我的 API 端点是安全的,并且只能由我的 react 前端访问,我正在努力想出解决方案。

我正在考虑的一个可能的解决方案是使用 JWT 保护 API。创建用户表并为前端客户端创建用户。当用户访问前端时,获取一个令牌并在所有请求上验证此令牌。我不确定这是否是一种有效的方法,或者是否有其他更合适的解决方案。

该应用程序将托管在 Heroku、堆栈:spring boot、react 和 mysql 数据库上。任何人都遇到过这个问题或任何建议都非常感谢。

【问题讨论】:

嗨,有趣,您可以使用HttpRequest.isRequestedSessionIdValid()HttpRequest.getSession(false) != null 你想在这里实现什么?由于您不需要登录,因此 api 提供的数据/操作无论如何都可以被公众访问? 我正在创建一个电子商务网站,用户可以在其中以访客身份结帐,我将在客户端上使用产品 ID,我猜这需要安全且只有经过验证才能知道客户。我正在使用 Stripe 进行支付,因此 API 和客户端之间不会传递卡信息。 恶意用户会对产品 ID 造成什么损害? 非常好的问题,他们无法用它做任何事情,因为没有端点。我想得越多,我觉得我可能过于复杂了。那么拥有不暴露任何敏感数据的公共 API 端点就可以了吗? 【参考方案1】:

这是不可能的。

在其核心,这将要求前端能够访问一些秘密值来验证它的请求,即令牌。然后,您将根据此秘密值的存在允许请求,并提供响应。

但是,前端服务于公共资产,因此不能有秘密。最终,任何用户都可以检查他们的网络请求,并从前端发出的请求中提取令牌。

利用这些信息,他们可以伪造自己的请求。

【讨论】:

【参考方案2】:

我建议在 CORS 配置的 allowedOrigins 添加域:

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;

import java.util.Arrays;
import java.util.List;

@Component
public class CorsFilterConfig 

    public static final List<String> allowedOrigins = Arrays.asList("yourDomainsHere");

    @Bean
    public FilterRegistrationBean<CorsFilter> initCorsFilter() 
        // @formatter:off
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowCredentials(true);
        config.setAllowedHeaders(Arrays.asList("Authorization", "Cache-Control", "Content-Type"));
        config.addAllowedMethod("*");
        config.setAllowedOrigins(allowedOrigins);
        source.registerCorsConfiguration("/**", config);
        FilterRegistrationBean<CorsFilter> bean = new FilterRegistrationBean<>(new CorsFilter(source));
        bean.setOrder(Ordered.HIGHEST_PRECEDENCE);
        return bean;
        // @formatter:on
    
 

More

【讨论】:

CORS 在前端保护用户,它不保护后端。 如果我想在浏览器之外访问 api,CORS 不会阻止。 你也可以在没有 CORS 的情况下运行你的浏览器,完全绕过这个机制。 别无他法

以上是关于无需用户登录即可保护 Spring Boot 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

Keycloak快速上手指南,只需10分钟即可接入Spring Boot/Vue前后端分离应用实现SSO单点登录

Keycloak快速上手指南,只需10分钟即可接入Spring Boot/Vue前后端分离应用实现SSO单点登录

如何保护简单的 Node.js RESTful API

如何使用 OAuth2 和社交登录保护 Spring Boot RESTful 服务

无需对移动应用进行用户身份验证即可保护私有 REST API 的最佳方法

如何在使用 OAuth2 社交登录保护 REST API 的同时配置 Spring Boot 登录页面