spring - 是否可以通过证书仅保护一个 spring boot rest 端点?

标签 spring spring-boot spring-security certificate cloud-foundry

关于架构的一些信息: - 我们在 cloud foundry 中运行(使用 https 路由) - 我们有一个网关(spring cloud Netflix zuul) - 我们的应用程序在内部由 token 保护

如果您需要其他信息,请询问。

现在我们想通过证书保护我们网关的一个路由(api/v1/authorizations)。这样只有拥有此证书的客户端才能调用此端点。

这可能吗?

最佳答案

我要把你的问题分成两部分,因为它们是 Spring Security 的两个独立问题。

Is it possible to secure only one spring boot rest endpoint

是的,您可以自定义您的 Spring Security 配置。可以打开所有端点,但一个端点是安全的。也可以混合使用,所以有一些对所有人开放,一些由方法 A(可能是密码)保护,另一些由方法 B(可能是证书)保护。

这是一个简单的示例,其中混合了开放 (/css/**) 和安全端点 (/user/**)。

protected void configure(HttpSecurity http) throws Exception {
            http
            .authorizeRequests(authorizeRequests ->
                authorizeRequests
                    .antMatchers("/css/**", "/index").permitAll()
                    .antMatchers("/user/**").hasRole("USER")
            )
            .formLogin(formLogin ->
                formLogin
                    .loginPage("/login")
                    .failureUrl("/login-error")
            );
}

发件人:https://github.com/spring-projects/spring-security/blob/master/samples/boot/helloworld/src/main/java/org/springframework/security/samples/config/SecurityConfig.java#L34-L44

via certificate?

当然。 Spring Security 支持通过 x.509 证书进行身份验证。

https://docs.spring.io/spring-security/site/docs/5.1.6.RELEASE/reference/htmlsingle/#x509

下面是使用 Spring Security 配置 x.509 身份验证的示例。

    protected void configure(HttpSecurity http) throws Exception {
        // @formatter:off
        http
            .x509()
                .subjectPrincipalRegex("OU=(.*?)(?:,|$)")
                .and()
            .authorizeRequests()
                .mvcMatchers("/admin/**").hasRole("ADMIN")
                .mvcMatchers("/noauth").permitAll()
                .anyRequest().authenticated();
        // @formatter:on
    }

发件人:https://github.com/nebhale/mtls-sample/blob/master/server/src/main/java/io/pivotal/mtlssample/server/ServerApplication.java#L96-L105

前三行将身份验证配置为使用 x509 证书。其余四行将授权配置为要求管理员用户访问 /admin/**,允许任何人访问 /noauth,并要求任何经过身份验证的用户访问任何其他内容。

要在 Cloud Foundry 上运行,您不需要在您的应用程序中执行任何特殊操作,但是您的平台运营商需要启用 mTLS 支持。您可以查看我在上面为客户端和服务器测试提供的完整演示,其中包含在 Cloud Foundry 上运行的说明。

https://github.com/nebhale/mtls-sample

希望对您有所帮助!

关于spring - 是否可以通过证书仅保护一个 spring boot rest 端点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57554962/

相关文章:

java - 同一项目中的 Spring Boot Basic Authentication 和 OAuth2?

java - 如何测试 spring-security-oauth2 资源服务器安全性?

spring - http 响应中缺少 Angular2 JWT 授权 header (添加了 CORS 支持)

spring - 在 springs 中编写 cron 表达式

java - Spring Batch 工作没有结束

java - 当我们可以在 Restful 服务中使用 jsonObject 时,为什么还需要 POJO

java - JPA 存储库概念是一个通用概念还是由 Spring 框架创造的?

java - 多模块 Spring Boot 配置

java - 创建名称为authenticationTokenFilterBean 的bean 时出错 : Unsatisfied dependency expressed through field tokenUtils

java - 注销在 Spring Security 中不起作用