как предисловие, у меня совсем нет весеннего опыта, и все, что я смог выяснить, все равно может быть неправильным:).
Что я пытаюсь сделать, так это запустить иерархию ролейметод отдыха в моем контроллере с @Secured:
@Secured("ROLE_USER")
@JsonView(value=View.Detail.class)
@RequestMapping(path = "/{id}", method = RequestMethod.GET)
public Lamp getLamp(@PathVariable UUID id) {
return lampService.getLampById(id);
}
Что я сделал, чтобы включить это / что я опробовал:
Я включил WebSecurity и установил для securedEnabled значение true
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
Я также добавил / попробовал RoleHierarchy в разных вариантах:
@Bean
public RoleHierarchyImpl roleHierarchy() {
RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl();
roleHierarchy.setHierarchy("ROLE_ADMIN > ROLE_EDITOR");
// TODO: add ROLE_EDITOR > ROLE_USER
return roleHierarchy;
}
Попытался вызвать / настроить RoleHierarchyVoter
@Bean
public RoleHierarchyVoter roleHierarchyVoter(RoleHierarchy roleHierarchy) {
return new RoleHierarchyVoter(roleHierarchy);
}
Я также попробовал WebSecurityExpressionHandler
private SecurityExpressionHandler<FilterInvocation> webExpressionHandler() {
DefaultWebSecurityExpressionHandler defaultWebSecurityExpressionHandler = new DefaultWebSecurityExpressionHandler();
defaultWebSecurityExpressionHandler.setRoleHierarchy(roleHierarchy());
return defaultWebSecurityExpressionHandler;
}
Здесь все настроено:
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().expressionHandler(webExpressionHandler())
.antMatchers("/api/**").authenticated()
;
http.httpBasic();
http.csrf().disable();
}
Теперь я полностью потерян.Я включил ведение журнала безопасности, настроив:
logging.level.org.springframework.security=DEBUG
В моем application.properties, который работает нормально.Это показывает мне, что MethodSecurityInterceptor обрабатывает его, а RoleVoter запрещает доступ.Должен быть RoleHierarchyVoter, но он вообще не появляется.Я также отладил его, чтобы быть уверенным.
В справочнике по безопасности Spring для настройки иерархии также используется только bean-компонент, но ничего из того, что я пробовал, не работает.
Я уверен, что иерархиясам по себе работает, так как объект в отладчике показывает, что ADMIN включает в себя EDITOR, а мой тестовый пользователь также имеет роль ADMIN.Я заглянул в Принципал и также отладил RoleVoter.
Я также не понимаю, почему некоторые предлагают использовать WebSecurityExpressionHandler.Я предполагаю, что это работает не для безопасности метода.
Я также раздражен, почему мой вариант использования не выглядит таким распространенным.Люди делают что-то еще?
Tx!