使用 @EnableAuthorizationServer 时如何在 HTTP BasicAuthenticationFilter 之后添加过滤器
Posted
技术标签:
【中文标题】使用 @EnableAuthorizationServer 时如何在 HTTP BasicAuthenticationFilter 之后添加过滤器【英文标题】:How to add filter after the HTTP BasicAuthenticationFilter when using @EnableAuthorizationServer 【发布时间】:2015-06-26 11:46:26 【问题描述】:我正在尝试查看以下文档:https://github.com/spring-projects/spring-security-oauth/blob/f25592e682303b0cf89e1d7555174bac18e174df/docs/oauth2.md#mapping-user-roles-to-scopes
在文档中,它说为了将用户角色映射到范围,以及在DefaultOAuth2RequestFactory
中设置checkUserScopes=true
,我们需要在HTTP BasicAuthenticationFilter
之后添加TokenEndpointAuthenticationFilter
过滤器。我想知道如何做到这一点。
这是我的 AuthorizationServer 的样子:
@Configuration
@EnableAuthorizationServer
protected static class OAuth2Config extends
AuthorizationServerConfigurerAdapter
@Autowired
private AuthenticationManager authenticationManager;
@Autowired
private OAuth2RequestFactory requestFactory;
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints)
endpoints.authenticationManager(authenticationManager);
endpoints.requestFactory(requestFactory);
@Override
public void configure(ClientDetailsServiceConfigurer clients)
throws Exception
clients.withClientDetails(clientDetailsService());
@Override
public void configure(AuthorizationServerSecurityConfigurer oauthServer)
throws Exception
oauthServer.checkTokenAccess("isAuthenticated()");
@Bean
public ClientDetailsService clientDetailsService()
Map<String, ClientDetails> clientDetailsStore = new HashMap<String, ClientDetails>();
Collection<String> scope = new HashSet<String>();
scope.add("user");
scope.add("admin");
Collection<String> authorizedGrantTypes = new HashSet<String>();
authorizedGrantTypes.add("password");
authorizedGrantTypes.add("refresh_token");
BaseClientDetails clientDetails = new BaseClientDetails();
clientDetails.setClientId("client");
clientDetails.setClientSecret("secret");
clientDetails.setScope(scope);
clientDetails.setAuthorizedGrantTypes(authorizedGrantTypes);
clientDetailsStore.put("client", clientDetails);
InMemoryClientDetailsService clientDetailsService = new InMemoryClientDetailsService();
clientDetailsService.setClientDetailsStore(clientDetailsStore);
return clientDetailsService;
@Bean
public OAuth2RequestFactory requestFactory()
DefaultOAuth2RequestFactory requestFactory =
new DefaultOAuth2RequestFactory(clientDetailsService());
requestFactory.setCheckUserScopes(true);
return requestFactory;
另外,如果我们能提供一个 CURL 示例来说明我们如何测试授权类型的密码,那就太好了。
感谢任何帮助!
【问题讨论】:
【参考方案1】:您应该能够扩展 AuthorizationServerSecurityConfiguration
并将其包含在您的 Spring 配置中,而不是使用 @EnableAuthorizationServer
。例如
@Configuration
public class OAuth2Config extends AuthorizationServerSecurityConfiguration
@Override
protected void configure(HttpSecurity http) throws Exception
super.configure(http);
http.addFilterAfter(myFilter(), BasicAuthenticationFilter.class);
【讨论】:
测试这个的 Curl 是: curl -v -u client:secret "localhost:8083/oauth/token" -d grant_type=password -d username=user -d password=password 我没有看到 AuthorizationServerSecurityConfiguration 上定义的“配置”方法。这是什么版本的 Spring Oauth? @GameSalutes 它存在于最新版本 (2.3.5.RELEASE) 中。【参考方案2】:您还可以通过 AuthorizationServerSecurityConfigurer
添加其他过滤器,尽管它们位于基本身份验证之前,而不是之后。
@Override
public void configure(AuthorizationServerSecurityConfigurer security)
security.addTokenEndpointAuthenticationFilter(myFilter());
security.checkTokenAccess("isAuthenticated()");
为 TokenEndpoint 添加新的自定义身份验证过滤器。过滤器将设置在默认 BasicAuthenticationFilter 的上游。
【讨论】:
以上是关于使用 @EnableAuthorizationServer 时如何在 HTTP BasicAuthenticationFilter 之后添加过滤器的主要内容,如果未能解决你的问题,请参考以下文章
在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?
Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)