1

我正在将一个整体分解成微服务。新的微服务是用 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");
    }


}
4

0 回答 0