我正在将一个整体分解成微服务。新的微服务是用 Spring 使用 Spring Security 和 OAuth2 编写的。单体应用使用自己的自定义安全性,而不是 Spring 安全性,目前用户仍将使用这种本土安全性登录到单体应用。这个想法是,新的 MS 应用程序将拥有自己的用户群,而单体应用程序本身将成为这些服务的“用户”。我已经成功设置了一个 OAuth2 身份验证服务器以使其正常工作,并且我能够使用客户端凭据登录以访问 REST API。
问题是微服务还包括他们自己的 UI,需要管理员直接访问(使用新的微服务用户和登录页面)和通过单体(希望使用客户端凭据,以便单体用户不必再次登录)。我有第一个工作,我可以访问新的 UI,我点击 OAuth 服务器上的登录页面,然后我被重定向回新的 UI 并经过身份验证和授权。
我的期望是我可以在后台使用客户端凭据登录到 OAuth 服务器,然后使用身份验证令牌让前端用户已经在前端进行身份验证。
我的问题是 - 当通过 UI 进入时,我应该如何实现让客户端凭据登录绕过登录页面?使用 Postman,我已经使用凭据访问了http://myauthapp/oauth/token并获得了访问令牌。然后,我想我也许可以获取带有标题“Authorization: Bearer”的受保护的 UI url ( http://mymicroservice/ui ),但我仍然被重定向到登录页面。
在 UI 应用程序上:
@Configuration
@EnableOAuth2Client
protected static class ResourceConfiguration {
@Bean
public OAuth2ProtectedResourceDetails secure() {
AuthorizationCodeResourceDetails details = new AuthorizationCodeResourceDetails();
details.setId("secure/ui");
details.setClientId("acme");
details.setClientSecret("acmesecret");
details.setAccessTokenUri("http://myoauthserver/secure/oauth/token");
details.setUserAuthorizationUri("http://myoauthserver/secure/oauth/authorize");
details.setScope(Arrays.asList("read", "write"));
details.setAuthenticationScheme(AuthenticationScheme.query);
details.setClientAuthenticationScheme(AuthenticationScheme.form);
return details;
}
@Bean
public OAuth2RestTemplate secureRestTemplate(OAuth2ClientContext clientContext) {
OAuth2RestTemplate template = new OAuth2RestTemplate(secure(), clientContext);
AccessTokenProvider accessTokenProvider = new AccessTokenProviderChain(
Arrays.<AccessTokenProvider> asList(
new AuthorizationCodeAccessTokenProvider(),
new ResourceOwnerPasswordAccessTokenProvider(),
new ClientCredentialsAccessTokenProvider())
);
template.setAccessTokenProvider(accessTokenProvider);
return template;
}
}
安全配置:
@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Autowired
private OAuth2ClientContextFilter oAuth2ClientContextFilter;
@Autowired
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.anonymous().disable()
.csrf().disable()
.authorizeRequests()
.antMatchers("/ui").hasRole("USER")
.and()
.httpBasic()
.authenticationEntryPoint(oauth2AuthenticationEntryPoint());
}
private LoginUrlAuthenticationEntryPoint oauth2AuthenticationEntryPoint() {
return new LoginUrlAuthenticationEntryPoint("/login");
}
}