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

时间:2017-04-28 04:25:39

标签: java spring rest spring-mvc spring-security

我有2个应用程序,作为独立的springboot应用程序运行。 App1& APP2。

用户在App1的UI上输入凭据,这些凭据通过角度js进行路由。

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

Spring安全性成功拦截了此请求。在拦截此请求后,我向App2发送了一个发布请求(在端口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安全性能够拦截但是有一些配置我做错了。

1 个答案:

答案 0 :(得分:1)

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

因此,当您向/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