标签: spring-cloud-security

Spring Cloud Netflix Zuul,CSRF和表单提交

我在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

8
推荐指数
1
解决办法
1363
查看次数

Spring 云安全与 Spring 安全

我刚开始学习 spring cloud security,我有一个基本问题。它与 Spring Security 有何不同?我们是否需要在 spring boot 上构建我们的应用程序才能使用 spring 云安全?

提前致谢。

spring-security spring-boot spring-cloud-security

7
推荐指数
1
解决办法
2979
查看次数

Keycloak + Spring Boot无法将访问令牌转换为JSON

我无法从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)

java spring-security-oauth2 keycloak spring-cloud-security

6
推荐指数
0
解决办法
981
查看次数

微服务之间的安全性

我有两个微服务,例如 A 和 B。微服务 B 的其余端点必须只能从微服务 A 访问。如何限制微服务之间的访问?如果可能,最佳实践是什么?

我正在使用 spring 云安全(oauth2,jwt)。

spring-security microservices spring-cloud-feign spring-cloud-security

6
推荐指数
1
解决办法
4069
查看次数

如何使用 Spring Cloud Gateway 自定义过滤器来过滤每个请求?

这是我第一次使用 Spring Cloud Gateway 实现。

我需要过滤每个请求并在某些路径上应用过滤器验证。按照 Baeldung 自定义过滤器教程,我制作了一个简单的应用程序来过滤请求。

应用程序必须释放路径,/actuator/health并验证后端服务的特定路径。到目前为止,我已经实现了 aGlobalFilter和 a GatewayFilterFactory。每个请求都会调用全局过滤器,但在应用程序启动时只调用一次 GatewayFilter,这样我就无法对每个请求进行身份验证。身份验证逻辑是关于特定的头字段。所以,我的颗粒化问题是:

  1. 如何使用特定路径验证每个请求?
  2. 如何拒绝请求并发送错误消息?

全局过滤器

@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

5
推荐指数
1
解决办法
4801
查看次数

JwtAccessTokenConverter:无法从 verifierKey 创建 RSA 验证程序

我有一个使用 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

5
推荐指数
1
解决办法
1470
查看次数

为什么我收到无效的 csrf 令牌?

我有一个带有 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)

我该如何解决?

ssl spring-boot spring-cloud-security

3
推荐指数
1
解决办法
1万
查看次数