我在Spring Cloud和CSRF保护方面遇到了一些问题.我使用Spring Cloud Security,OAuth2等保护了我的应用程序(网关和注册服务).
我授予每个人(permitAll)访问/ signup的权限,这是网关路由到实际注册服务的地方.我还授予了注册服务器本身的所有人访问权限.这按预期工作.
令我头疼的是CSRF保护.网关和注册服务都自己创建CSRF令牌.来自网关的令牌将被发送到客户端,并且来自注册服务的令牌丢失(在网关的某处).
如果我向注册服务发布了一些内容,CSRF保护就会启动并表示令牌为空,或者实际值与预期值不匹配,如果我尝试重用HTTP中可用的网关值头.
我已经让它在注册服务上禁用CSRF,但它似乎不是正确的解决方案,因为它只适用于有人从客户端发回令牌,如Angular SPA.当我尝试从浏览器提交表单(在注册服务上呈现)时,由于缺少_csrf参数而失败.如果我在注册服务上激活CSRF并将_csrf参数添加到表单中,网关的CSRF保护就会启动并说实际令牌与预期令牌不匹配,这是绝对正确的,因为实际令牌是一个来自注册服务,而预期的令牌来自网关.
我可以在网关上禁用CSRF,但这将导致我必须在REST客户端或SPA使用的每个服务上配置CSRF内容.
我在HttpSecurity.csrf()配置中尝试了ignoreAntMatchers(),我可以在其中排除特定路径,但这对我也没有帮助.期望值是完全不同的.似乎为POST请求创建了一个新会话.
那么有没有机会我可以在网关上使用CSRF,并立即使用表单提交和Zuul注册服务?
csrf spring-security spring-boot spring-cloud spring-cloud-security
我刚开始学习 spring cloud security,我有一个基本问题。它与 Spring Security 有何不同?我们是否需要在 spring boot 上构建我们的应用程序才能使用 spring 云安全?
提前致谢。
我无法从keycloak生成的访问令牌中提取用户信息.我有一个受保护的路由,我希望正确填充Principal或Authentication对象.
@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
private final String SIGNING_KEY = "MIIBCgKCAQ...AB";
@Override
public void configure(HttpSecurity http) throws Exception {
http
.requestMatcher(new RequestHeaderRequestMatcher("Authorization"))
.authorizeRequests()
.antMatchers("/api/register").anonymous()
.antMatchers("/api/token").anonymous()
.anyRequest().authenticated();
}
@Override
public void configure(ResourceServerSecurityConfigurer config) {
config.tokenServices(createTokenServices());
}
@Bean
@Primary
public DefaultTokenServices createTokenServices() {
DefaultTokenServices defaultTokenServices = new DefaultTokenServices();
defaultTokenServices.setTokenStore(createTokenStore());
return defaultTokenServices;
}
@Bean
public TokenStore createTokenStore() {
return new JwtTokenStore(createJwtAccessTokenConverter());
}
@Bean
public JwtAccessTokenConverter createJwtAccessTokenConverter() {
JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
converter.setAccessTokenConverter(new JwtConverter());
// converter.setSigningKey(SIGNING_KEY);
return converter;
} …Run Code Online (Sandbox Code Playgroud) 我有两个微服务,例如 A 和 B。微服务 B 的其余端点必须只能从微服务 A 访问。如何限制微服务之间的访问?如果可能,最佳实践是什么?
我正在使用 spring 云安全(oauth2,jwt)。
spring-security microservices spring-cloud-feign spring-cloud-security
这是我第一次使用 Spring Cloud Gateway 实现。
我需要过滤每个请求并在某些路径上应用过滤器验证。按照 Baeldung 自定义过滤器教程,我制作了一个简单的应用程序来过滤请求。
应用程序必须释放路径,/actuator/health并验证后端服务的特定路径。到目前为止,我已经实现了 aGlobalFilter和 a GatewayFilterFactory。每个请求都会调用全局过滤器,但在应用程序启动时只调用一次 GatewayFilter,这样我就无法对每个请求进行身份验证。身份验证逻辑是关于特定的头字段。所以,我的颗粒化问题是:
全局过滤器
@Component
public class LoggingGlobalPreFilter implements GlobalFilter {
final Logger LOGGER = LoggerFactory.getLogger(LoggingGlobalPreFilter.class);
@Override
public Mono<Void> filter(
ServerWebExchange exchange,
GatewayFilterChain chain) {
LOGGER.info("Global Pre Filter executed");
return chain.filter(exchange);
}
}
Run Code Online (Sandbox Code Playgroud)
网关过滤器
@Component
public class LoggingGatewayFilterFactory extends
AbstractGatewayFilterFactory<LoggingGatewayFilterFactory.Config> {
final Logger LOGGER =
LoggerFactory.getLogger(LoggingGatewayFilterFactory.class);
public LoggingGatewayFilterFactory() {
super(Config.class);
}
private Mono<Void> onError(ServerWebExchange exchange, String err, HttpStatus httpStatus) {
ServerHttpResponse response …Run Code Online (Sandbox Code Playgroud) java spring spring-cloud spring-cloud-security spring-cloud-gateway
我有一个使用 Spring Cloud OAuth2 的授权服务器 Spring Boot 项目。我将这些 bean 用于 JWT:
@Bean
public JwtAccessTokenConverter accessTokenConverter() {
JwtAccessTokenConverter tokenConverter = new JwtAccessTokenConverter();
tokenConverter.setSigningKey("my-test-jwt-secret");
return tokenConverter;
}
@Bean
public JwtTokenStore tokenStore() {
return new JwtTokenStore(accessTokenConverter());
}
Run Code Online (Sandbox Code Playgroud)
登录显然工作正常,但是当我运行该项目时,我收到此警告:
WARN 16804 --- [main] o.s.s.o.p.t.s.JwtAccessTokenConverter : Unable to create an RSA verifier from verifierKey (ignoreable if using MAC)
Run Code Online (Sandbox Code Playgroud)
我该如何摆脱这个警告?
spring-security spring-boot spring-security-oauth2 spring-cloud-security
我有一个带有 spring-cloud-security 的项目。它是用于 oauth 授权的 auth 服务器。过去运行良好。
我添加了带有配置的 ssl 支持的 spring 配置文件:
security:
require-ssl: true
server:
ssl:
key-store: dev.p12
key-store-password: devpass
keyStoreType: PKCS12
keyAlias: calc
Run Code Online (Sandbox Code Playgroud)
使用此配置文件,身份验证工作正常,但是当我禁用它并通过 http 登录时,身份验证失败。
o.s.security.web.csrf.CsrfFilter : Invalid CSRF token found for http://localhost:8090/login
Run Code Online (Sandbox Code Playgroud)
我该如何解决?