2016-02-10 48 views
0

我正在嘗試使用Spring安全性oauth進行oauth2身份驗證。如何使用Spring OAuth2ClientAuthenticationProcessingFilter + AuthorizationCodeResourceDetails處理OAuth2授權碼

我已經將OAuth2ClientAuthenticationProcessingFilter插入到我的安全配置中,並且使用AuthorizationCodeResourceDetails我正在檢索授權碼,但Oauth流已損壞,我無法獲取access_token。

這裏是我的配置:

@Override 
protected void configure(HttpSecurity http) throws Exception { 

    /** 
    * Moved from com.myscript.backend.configuration.WebApp.java 
    * https://stackoverflow.com/questions/20863489/characterencodingfilter-dont-work-together-with-spring-security-3-2-0    * 
    */ 
    CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter(); 
    characterEncodingFilter.setEncoding("UTF-8"); 
    characterEncodingFilter.setForceEncoding(true); 
    http.addFilterBefore(characterEncodingFilter, CsrfFilter.class); 


    String key = "**************************"; 
    ApiPersistentTokenBasedRememberMeServices rememberMeServices = new ApiPersistentTokenBasedRememberMeServices(key, userDetailsService, adminTokenRepository); 

    // @formatter:off 
    http 
     .exceptionHandling() 
     .authenticationEntryPoint(new Http403ForbiddenEntryPoint()) 
    .and() 
     .csrf().disable() 
     .rememberMe() 
     .rememberMeServices(rememberMeServices) 
     .tokenRepository(adminTokenRepository) 
     .key(key) 
     .userDetailsService(userDetailsService) 
    .and() 
     .addFilterAfter(oauth2ClientContextFilter, SecurityContextPersistenceFilter.class) 
     .addFilterBefore(ssoFilter(), BasicAuthenticationFilter.class) 
     .formLogin() 
     .loginProcessingUrl("/**/authentication/login*") 
     .usernameParameter("email") 
     .passwordParameter("password") 
     .successHandler(new RestAuthenticationSuccessHandler()) 
     .failureHandler(new RestAuthenticationFailureHandler()) 
     .permitAll() 
    .and() 
     .logout() 
     .invalidateHttpSession(true) 
     .logoutSuccessHandler(new LogoutSuccessHandler() { 
      @Override 
      public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) 
       throws IOException, ServletException { 
       response.setStatus(HttpServletResponse.SC_OK); 
      } 
     }) 
     .logoutRequestMatcher(new AntPathRequestMatcher("/**/authentication/logout*")) 
     .permitAll() 
    .and() 
     .authorizeRequests() 
     .antMatchers("/authentication/**", ...) 
     .permitAll() 
     .anyRequest() 
     .authenticated() 
    .and() 
     .anonymous(); 
    // @formatter:on 
} 

private Filter ssoFilter() { 
    OAuth2ClientAuthenticationProcessingFilter ssoFilter = new OAuth2ClientAuthenticationProcessingFilter("/**/authentication/login/sso"); 
    final OAuth2RestTemplate template = new OAuth2RestTemplate(sso()); 
    ssoFilter.setRestTemplate(template); 
    return ssoFilter; 
} 

@Bean 
protected OAuth2ProtectedResourceDetails sso() { 
    AuthorizationCodeResourceDetails details = new AuthorizationCodeResourceDetails(); 
    details.setId("sso"); 
    details.setClientId("*******"); 
    details.setClientSecret("*******"); 
    details.setAccessTokenUri("http://sso.test.com/oauth/token"); 
    details.setUserAuthorizationUri("http://sso.test.com/oauth/authorize"); 
    details.setPreEstablishedRedirectUri("http://localhost:8894/api/v3.0/admin/authentication/login/sso"); 
    details.setScope(Arrays.asList("read", "write")); 
    details.setUseCurrentUri(false); 
    return details; 
} 

而且至少我重定向到:http://localhost:8894/api/v3.0/admin/authentication?code=YjMXjl&state=ktv3am#

回答