【发布时间】:2018-08-28 17:56:54
【问题描述】:
我有一个 Spring boot 应用程序服务于我使用 Spring security 和 Oauth2 保护的 Rest 端点。 我想保护我的所有端点,除了用于身份验证、创建帐户或一些信息的端点。
安全配置是这样的:
@Configuration
@EnableAuthorizationServer
public class OAuth2Config extends AuthorizationServerConfigurerAdapter {
@Autowired
private AuthenticationManager authenticationManager;
@Autowired
private MongoTokenStore tokenStore;
@Override
public void configure(final AuthorizationServerSecurityConfigurer oauthServer) throws Exception {
oauthServer.tokenKeyAccess("permitAll()").checkTokenAccess("isAuthenticated()");
}
@Override
public void configure(final ClientDetailsServiceConfigurer clients) throws Exception {
//clients.withClientDetails(clientDetailsService);
clients.inMemory().withClient("app").secret("password")
.accessTokenValiditySeconds(30000).authorizedGrantTypes("password", "refresh_token")
.refreshTokenValiditySeconds(300000000)
.scopes("read");
}
@Override
public void configure(final AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints.tokenStore(tokenStore()).authenticationManager(authenticationManager)
.pathMapping("/oauth/confirm_access", "/access_confirmation");
}
@Bean
public TokenStore tokenStore() {
return this.tokenStore;
}
}
@Configuration
@EnableResourceServer
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserRepository userRepository;
@Autowired
private SecurityContextService securityContextService;
@Autowired
private MongoTemplate mongoTemplate;
@Bean
public MongoUserDetailsManager mongoUserDetailsManager() throws Exception {
return new MongoUserDetailsManager(userRepository, securityContextService, authenticationManagerBean(), mongoTemplate);
}
@Override
protected void configure(final AuthenticationManagerBuilder auth) throws Exception {
auth.parentAuthenticationManager(authenticationManagerBean())
.userDetailsService(mongoUserDetailsManager());
}
@Override
@Bean
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
@Override
protected void configure(final HttpSecurity http) throws Exception {
http.
authorizeRequests()
.antMatchers("/login", "/oauth/authorize", "/oauth/token", "/server/version", "/clients/register").permitAll()
.and().csrf().disable()
.authorizeRequests()
.anyRequest()
.authenticated()
.and()
.formLogin()
.disable();
}
}
我可以访问令牌端点以获取我的 access_token,但我想使用此 access_token 访问其他安全端点(通过将 Authorization:Bearer {access_toke} 添加到标头),我总是得到 HTTP 403。
我错过了什么吗?如果我添加了 Authorization 标头,我就不应该被授权?
我的控制器只用这些 @RestController、@CrossOrigin 注释 和@RequestMapping("/url")
【问题讨论】:
-
你能确认你的标题吗?写成
Authorization:Bearer {token}但一般需要实现成Authorization: Bearer {token}(空格超级重要) -
我正在使用 Postman 进行测试,所以我不确定空间是否存在问题
标签: spring-boot spring-security oauth-2.0