如果我们设置授予的权限,则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")
.....
}
答案 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());
}