使用UI的Spring OAuth2客户端凭据

时间:2016-03-22 15:31:24

标签: spring oauth spring-security microservices spring-oauth2

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


}

0 个答案:

没有答案