Spring OAuth2 - 使用附加信息授权URL

时间:2018-04-10 11:42:55

标签: spring spring-boot spring-security spring-security-oauth2 spring-oauth2

如果我们设置授予的权限,则Spring安全性允许我们使用hasAnyAuthority()hasAnyRole()hasRole()来授权网址。如果我创建了一个自定义令牌增强器,我可以在令牌中添加其他信息,是否有办法使用其他信息进行授权?

CustomTokenEnhancer:

public final class CustomTokenEnhancer implements TokenEnhancer {
    @Override
    public OAuth2AccessToken enhance(
            OAuth2AccessToken accessToken,
            OAuth2Authentication authentication) {
        Map<String, Object> additionalInfo = new HashMap<>();
        additionalInfo.put("company", "authorizeAPIsWithCompany");
        ((DefaultOAuth2AccessToken) accessToken).setAdditionalInformation(additionalInfo);
        return accessToken;
    }
}

是否可以基于以上附加信息密钥,值来授权API?如果没有,我该如何处理这个想法?

例如:

@Override
public void configure(HttpSecurity http) throws Exception {
     http
            .authorizeRequests()
  .antMatchers("/authorizedURL").hasCompany("authorizeAPIsWithCompany")
  .....

}

1 个答案:

答案 0 :(得分:0)

我认为您可以在不使用其他信息的情况下做您想做的事。 OAuth协议不需要其他信息。它对存储描述性信息很有用。您应该能够使用客户端的范围,权限和授权类型以及用户的权限(角色)来实现您的目标。您可以查看Oauth2规范(https://tools.ietf.org/html/rfc6749)以获取更多信息。

您还可以使用不同的安全策略,例如MethodSecurityConfig:

@EnableGlobalMethodSecurity(prePostEnabled = true)
public static class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {
    @Override
    protected MethodSecurityExpressionHandler createExpressionHandler() {
        return new OAuth2MethodSecurityExpressionHandler();
    }
}

@PreAuthorize("hasRole('ADMIN') OR #oauth2.clientHasRole('AUTHORIZED-MERCHANT')")
@GetMapping(value = "authorized-url")
public ResponseEntity<List<Order>> getOrders() {
    return ResponseEntity.ok(orderService.getOrders());
}