У меня есть ResourceServer, использующий Spring Boot Oauth2, где у моего контроллера есть следующее:
@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", все работает, но мне это нужно.
Просмотр внутрь DefaultAccessTokenConverter класс, в методе extractAuthentication Я обнаружил следующее:
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 не имеют этого последнего.