我正在将整体分解成微服务。新的微服务正在使用Spring使用Spring Security和OAuth2编写。 monolith使用自己的自定义安全性,而不是Spring安全性,现在用户仍将使用这种自行开发的安全性登录monolith。我们的想法是,新的MS应用程序将拥有自己的用户群,而整体应用程序本身将是一个用户"这些服务。我已成功设置OAuth2 Auth服务器以实现此功能,并且我可以使用客户端凭据登录以访问REST API。
问题是微服务还包括他们自己的UI,需要管理员直接访问(使用新的微服务用户和登录页面)和整体(希望使用客户端凭据,以便整体用户做不必再次登录)。我有第一个工作,我可以访问新的用户界面,我点击OAuth服务器上的登录页面,然后我重定向回到新的用户界面并进行身份验证&授权。
我的期望是,我可以在后台使用客户端凭据登录OAuth服务器,然后使用auth令牌让前端用户在前端进行身份验证。
我的问题是 - 在通过用户界面进入时,我应该注意实现什么才能让客户端凭据登录绕过登录页面?使用邮递员,我已使用凭据转到http://myauthapp/oauth/token并获得了访问令牌。然后,我想我也许可以通过标题"授权:承载"获取受保护的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;
}
}
SecurityConfig:
@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");
}
}