无需用户登录即可保护 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单点登录
如何使用 OAuth2 和社交登录保护 Spring Boot RESTful 服务