Не удается заставить RoleHierarchy работать над MethodSecurity с пружинной загрузкой 2 / Spring Security 5 - PullRequest
0 голосов
/ 25 августа 2018

как предисловие, у меня совсем нет весеннего опыта, и все, что я смог выяснить, все равно может быть неправильным:).

Что я пытаюсь сделать, так это запустить иерархию ролейметод отдыха в моем контроллере с @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!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...