Я создаю стандартную весеннюю загрузку mvc + тимелеаф + Oauth2. До сих пор я добавил библиотеку oauth2-client для аутентификации, но теперь мне нужна авторизация для защиты моего приложения.
Означает ли это, что мне также нужно настроить его как сервер ресурсов?
Если нет, как я могу сопоставить полномочия из частного утверждения (в токене идентификатора), в которые мой сервер авторизации помещает роли?
Конфигурация сервера ресурсов адаптирована для защиты ресурсов REST.
Конфигурация клиента работает нормально, если вы не предоставляете свой API. Если это так, добавьте вторую цепочку фильтров безопасности. Подробности в этом другом ответе: Используйте адаптер Keycloak Spring с Spring Boot 3
Как упоминалось в моем комментарии, Документация по безопасности Spring всегда лучше, чем то, что можно было бы написать на Stackoverflow (но, конечно, члены команды Spring-безопасности, которые публикуют ответы)
Дважды проверьте утверждение, в которое ваш сервер авторизации помещает роли пользователей, и предоставьте сопоставитель полномочий:
http.oauth2Login().userInfoEndpoint().userAuthoritiesMapper(userAuthoritiesMapper());
@Bean
типа GrantedAuthoritiesMapper
, который должен автоматически настраиваться spring-bootВ обоих случаях код для сопоставителя одинаков (дважды проверьте имя заявки на роли пользователей на своем сервере авторизации, но это может быть groups
с Azure AD):
@Bean
GrantedAuthoritiesMapper userAuthoritiesMapper() {
return (authorities) -> {
Set<GrantedAuthority> mappedAuthorities = new HashSet<>();
authorities.forEach(authority -> {
if (authority instanceof OidcUserAuthority oidcAuth) {
oidcAuth.getIdToken().getClaimAsStringList("groups").forEach(a -> mappedAuthorities.add(new SimpleGrantedAuthority(a)));
} else if (authority instanceof OAuth2UserAuthority oauth2Auth) {
((List<String>) oauth2Auth.getAttributes().getOrDefault("groups", List.of())).forEach(a -> mappedAuthorities.add(new SimpleGrantedAuthority(a)));
}
});
return mappedAuthorities;
};
}
где я могу установить имя поля претензии для поиска ролей?
Лучше спросить Бога, чем его учеников: docs.spring.io/spring-security/reference/reactive/oauth2/login/…
Я отредактировал ваш вопрос, чтобы, я полагаю, у других людей с такими же потребностями было больше шансов открыть тему. Надеюсь, ты не против.
Я получаю 403 при защите всех запросов, есть идеи? http.authorizeHttpRequests((authorize) -> authorize .anyRequest().hasRole("admin"));
возможно, у вас есть именно admin
в вашем токене доступа => либо добавьте префикс ROLE_
в маппере, либо используйте hasAuthority("admin")
вместо hasRole("admin")
(для Spring роль — это не что иное, как полномочия, начинающиеся с ROLE_
)
все настроено, но все еще не работает, я заметил, что при использовании SecurityFilterChain GrantedAuthoritiesMapper не вызывается
GrantedAuthoritiesMapper с аннотацией @Bean не работал, но если я установил это в oauth2Login, он работает
Итак, я должен иметь возможность проверить авторизацию только с помощью моего идентификатора, верно?