我有一个使用Spring Boot Oauth2的ResourceServer,其中我的控制器具有以下内容:
@RestController
public class Controller {
@PreAuthorize("hasRole('search_price')")
@GetMapping
public String test() {
return "OK !!";
}
}
因此,我有一个由Azure AD生成的令牌,该令牌在您的索赔中具有此角色,例如波纹管:
...
"idp": "https://sts.windows.net/xxxxxxx/",
"oid": "e224xxxxxxxx6faf",
"roles": [
"search_price"
],
"sub": "e2240xxxxxxx",
"tid": "a753xxxxxxxxxx177e575",
...
当我尝试从POSTMAN命中此端点时,我得到:访问被拒绝。如果我删除“ @PreAuthorize”注释,则一切正常,但是我需要它。
在方法 extractAuthentication 中的 DefaultAccessTokenConverter 类中,我发现了以下内容:
Collection<? extends GrantedAuthority> authorities = null;
if (user == null && map.containsKey("authorities")) {
String[] roles = (String[])((Collection)map.get("authorities")).toArray(new String[0]);
authorities = AuthorityUtils.createAuthorityList(roles);
}
因此,默认情况下,转换器不会读取 ROLES 声明,只是权威和Azure AD都没有这最后一个。