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 作为存储库?