我有以下代码,它可以完美地保护Amazon Alexa帐户链接。这是由一位现在离线的同事建立的(我正在拉夜班)。
@Configuration
@EnableWebSecurity
public class SkillRestConfiguration extends WebSecurityConfigurerAdapter {
private static final String AMAZON_ALEXA_TOKEN_EXCHANGE_ROLE = "AMAZON-ALEXA-TOKEN-EXCHANGE";
private static final String TOKEN_EXCHANGE_CLIENT_ID_KEY = "TOKEN_EXCHANGE_CLIENT_ID";
private static final String TOKEN_EXCHANGE_CLIENT_SECRET_KEY = "TOKEN_EXCHANGE_CLIENT_SECRET";
@Autowired
public void configureGlobalSecurity(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser(Environment.get(TOKEN_EXCHANGE_CLIENT_ID_KEY))
.password(Environment.get(TOKEN_EXCHANGE_CLIENT_SECRET_KEY))
.roles(AMAZON_ALEXA_TOKEN_EXCHANGE_ROLE);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable();
// Allow basic authentication from Amazon
http.authorizeRequests()
.antMatchers("/token").hasRole(AMAZON_ALEXA_TOKEN_EXCHANGE_ROLE)
.and().httpBasic();
}
}
但是,我想将其扩展为可用于Google帐户关联。 Google不会发送基本身份验证标头,实际上它根本不会发送授权标头,而是将client_id和client_secret作为POST数据传递。
我如何确保该部分也经过身份验证'在/ token端点?例如支持这两种身份验证方法?如果我在/ token上获得POST请求,其中client_id和client_secret匹配预定义的环境变量,则可以通过基本身份验证或POST数据来保留它。
这是否像添加以下代码一样简单?
http.antMatchers("/token")
.formLogin()
.permitAll()
.usernameParameter("client_id")
.passwordParameter("client_secret");
如果是这样的话,我应该在“http.authorizeRequests()'之前或之后”。调用
修改 通过做一些额外的研究,我认为我需要创建自己的过滤器和身份验证提供程序。过滤器将从请求中提取用户名和密码,如果我理解正确,则在securitycontext上设置它。只有在没有基本身份验证标头且POST包含正确值的情况下才应执行此操作。我想我可以使用以下代码完成此操作,方法是将UsernamePasswordAuthenticationToken扩展为ClientIdAndSecretAuthenticationToken。
@Override
public boolean supports(Class<?> authentication) {
return (ClientIdAndSecretAuthenticationToken.class.isAssignableFrom(authentication));
}
和
http.antMatchers("/token")
.addFilterBefore(clientIdAndSecretAuthenticationFilter, ClientIdAndSecretAuthenticationFilter.class)
.authenticationProvider(clientIdAndSecretAuthenticationProvider)
我在这里温暖吗?