我正在开发一个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访问其余资源?
非常感谢!