如何通过在Spring引导中使用访问令牌和授权页面流来访问OAuth2 SSO保护的休息资源

时间:2018-03-01 03:27:45

标签: spring-boot oauth-2.0 single-sign-on

我正在开发一个Spring Boot应用程序,它同时提供RESTful API和Spring MVC网页(使用百万美元模板)。网页和RESTful API受Spring OAuth2 SSO保护。但是当我尝试在Java客户端中从Spring RestTemplate访问RESTful API时,我总是得到状态代码302和包含授权网页内容的响应主体。这意味着,restTemplate被“重定向”到授权页面,而不是使用访问令牌访问API。

以下是代码和配置:

server:
  port: 8888 
security:
  basic:
    enabled: false
  ignored: /welcome,/favicon.ico,/index.html,/signup,/assets/**,/js/**,/css/**,/webjars/**
  sessions: ALWAYS
  oauth2:
    sso:
      loginPath: /login
....
security:
  basic:
    enabled: false
  oauth2:
    client:
      accessTokenUri: http://jx201.local:8043/uaa/oauth/token
      userAuthorizationUri: http://jx201.local:8043/uaa/oauth/authorize
      clientId: payment-gateway
      clientSecret: 123456
....

SecurityConfig.java(使用@Configuration和@ EnableOAuth2Sso注释):

    http
            .logout().logoutUrl("/logout").logoutSuccessUrl("/welcome").and()
            .authorizeRequests()
            .antMatchers("/login").permitAll()
            .anyRequest().authenticated()
            .and()
            .csrf()
            .csrfTokenRepository(csrfTokenRepository());

当我使用上面的java配置时,在尝试访问我的资源时,例如/ payment / api / v1 / status,restTemplate(OAuth2RestTemplate的实例)总是获取http代码302和授权页面的内容。

但如果我使用下面的代码:

http.antMatcher("/assets/**").anonymous()
    .and().antMatcher("/**").authorizeRequests()
    .and().csrf().requireCsrfProtectionMatcher(new RequestMatcher() {
        private Pattern allowedMethods = Pattern.compile("^(GET|HEAD|TRACE|OPTIONS)$");
        private RegexRequestMatcher apiMatcher = new RegexRequestMatcher("/[a-z0-9A-Z]*/api/v[0-9]*/.*", null);
        @Override
        public boolean matches(HttpServletRequest request) {
            if(allowedMethods.matcher(request.getMethod()).matches()|| apiMatcher.matches(request))  {
                return false;
            }
            return true;
        }
    })
   .csrfTokenRepository(csrfTokenRepository()).and()
   .addFilterAfter(csrfHeaderFilter(), CsrfFilter.class)
   .logout().logoutUrl("/logout").permitAll()
   .logoutSuccessUrl("/welcome");

我的资源,例如/ payment / api / v1 / status,不受OAuth2& SSO保护

所以问题是:我如何配置spring安全性,以便从restTemplate和Spring MVC访问其余资源?

非常感谢!

0 个答案:

没有答案