Spring Security:如何将两个应用程序与单独的 Spring Security 配置集成?

Posted

技术标签:

【中文标题】Spring Security:如何将两个应用程序与单独的 Spring Security 配置集成?【英文标题】:Spring Security: How to integrate two apps with individual spring security configuration? 【发布时间】:2017-09-26 02:01:32 【问题描述】:

我有 2 个应用程序,作为独立的 springboot 应用程序运行。 应用 1 和应用 2。

用户在 App1 的 UI 上输入凭据,通过 Angular js 路由。

$http.post('/login', $.param(self.credentials), 
      headers : 
        "content-type" : "application/x-www-form-urlencoded"
      
   

Spring security 成功拦截了这个请求。截获此请求后,我向 App2 发出 post 请求(在端口 8018 上运行)

// implementation of authentication provider:
public Authentication authenticate(final Authentication authentication) throws AuthenticationException     
    Authentication auth = null;   
    MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
    params.set("username", "user"); // for testing purpose
    params.set("password", "user"); // for testing purpose
    RestTemplate restTemplate = new RestTemplate();
    HttpHeaders reqHead = new HttpHeaders();
    reqHead.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
    restTemplate.getMessageConverters().add(new FormHttpMessageConverter());
    ResponseEntity response = restTemplate.postForEntity("http://localhost:8018/login/process",
            new HttpEntity<>(params, reqHead), MyClass.class);  

然而,App2 中的 Spring 安全性无法正确拦截此请求。我得到的只是 302(null)。

DEBUG 12144 --- [nio-8010-exec-1] o.s.web.client.RestTemplate              : Setting request Accept header to [application/json, application/*+json]
DEBUG 12144 --- [nio-8010-exec-1] o.s.web.client.RestTemplate              : Writing [username=[user], password=[user]] as "application/x-www-form-urlencoded" using [org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter@2fc281c1]
DEBUG 12144 --- [nio-8010-exec-1] o.s.web.client.RestTemplate              : POST request for "http://localhost:8018/login/process" resulted in 302 (null)

(MyClass 只是一个包含 httpstatus 和 Object 数据的类。)

我的 app2 安全配置:

@Override
    protected void configure(final HttpSecurity http) throws Exception 
        http.authorizeRequests().antMatchers("/welcome").permitAll().anyRequest().authenticated();
        http.csrf().disable();
        // http.httpBasic();
        http.formLogin()
    

如果我改变了

antMatchers("/welcome").permitAll()

antMatchers("/welcome","/login/**").permitAll()

然后请求成功绕过安全并到达我的控制器。 所以我假设 Spring Security 能够拦截,但是我做错了一些配置。

【问题讨论】:

【参考方案1】:

您在 App2 中的配置说:“每个人都可以访问 /welcome 端点;但只有经过身份验证的人(使用表单身份验证)才能访问所有其他页面”。

因此,当您向/login/process 发出请求时,App2 中的 Spring Security 会将该请求重定向到登录页面。

如果您希望将此请求像“受信任”请求一样处理,则必须相应地指示 App2 中的 Spring Security。例如,您可以将基本身份验证添加到您的“特权”URL。这可以通过此处描述的技术来完成:Combining basic authentication and form login for the same REST Api

然后,您必须在请求中添加基本身份验证,这里有一个示例:http://www.baeldung.com/how-to-use-resttemplate-with-basic-authentication-in-spring

这里描述了另一种需要较少代码但强制您手动构建授权标头的方法:http://springinpractice.com/2013/10/02/quick-tip-basic-authentication-with-spring-resttemplate

【讨论】:

以上是关于Spring Security:如何将两个应用程序与单独的 Spring Security 配置集成?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Spring Security 与 Spring Boot Rest API 一起使用?

如何在 Spring Security 的同一个请求中使用两个身份验证提供程序?

如何在spring security中为来自两个不同表的不同用户配置身份验证?

Spring Security:同时授权两个或多个 Web 应用程序

Spring Security + Keycloak 授权:如何将端点与资源相关联?

如何使用 spring security 和 spring boot 对 Google 用户进行身份验证,将 mongoDB 作为存储库?