Иерархия ролей в Spring: NullPointerException

Пытаюсь реализовать собственную иерархию ролей в Spring и для ограничения доступов к методам. Для простоты делаем 2 роли: ADMIN and GOAL. ADMIN включает в себя роль GOAL. Т.е. заходя под ролью ADMIN, я должен иметь возможность вызывать методы с ролью GOAL.

Я реализовал бин RoleHierarchy в отдельном классе, т.к. по комментариям народа Security filters требуют ранней инициализации.

Столкнулся со следующей проблемой:

Когда обращаюсь к контроллеру, получаю NullPointer error (стек приведен Вопросы:

  1. Где порылась ошибка?
  2. В какой из 2х конфигураций я должен определить RoleHierarchy: GlobalMethodSecurityConfiguration, WebSecurityConfigurerAdapter или обоих?

Исходники:

RoleHierarchy Bean

@Configuration
public class CustomRoleHierarchy extends RoleHierarchyImpl  {
    @Bean
    public RoleHierarchyImpl roleHierarchy() {
        RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl();
        roleHierarchy.setHierarchy("ADMIN > GOAL");
        return roleHierarchy;
    }
}

GlobalMethodSecurityConfiguration

@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true, jsr250Enabled = true, proxyTargetClass = true)
public class CustomMethodSecurityConfig extends GlobalMethodSecurityConfiguration {


    @Autowired
    CustomPermissionEvaluator permissionEvaluator;
    @Autowired
    CustomRoleHierarchy roleHierarchy;

    @Override
    protected MethodSecurityExpressionHandler createExpressionHandler() {
        DefaultMethodSecurityExpressionHandler handler = new DefaultMethodSecurityExpressionHandler();
        handler.setPermissionEvaluator(permissionEvaluator);
        handler.setRoleHierarchy(roleHierarchy);
        return handler;
    }

Controller

Пробовал также использовать @PreAuthorize("hasRole('ROLE_GOAL')" или @PreAuthorize("hasRole('GOAL')".

    @RequestMapping(value = WEB_URL, method = RequestMethod.GET)
    @PreAuthorize("hasAuthority('GOAL')")
    public String goalList (Model model) {
    ...

Ошибка доступа к контроллеру

java.lang.NullPointerException: null
    at org.springframework.security.access.hierarchicalroles.RoleHierarchyImpl.getRolesReachableInOneOrMoreSteps(RoleHierarchyImpl.java:164) ~[spring-security-core-5.1.4.RELEASE.jar:5.1.4.RELEASE]
    at org.springframework.security.access.hierarchicalroles.RoleHierarchyImpl.getReachableGrantedAuthorities(RoleHierarchyImpl.java:122) ~[spring-security-core-5.1.4.RELEASE.jar:5.1.4.RELEASE]
    at org.springframework.security.access.expression.SecurityExpressionRoot.getAuthoritySet(SecurityExpressionRoot.java:167) ~[spring-security-core-5.1.4.RELEASE.jar:5.1.4.RELEASE]

Ответы (1 шт):

Автор решения: user3434906

Вместо handler.setRoleHierarchy(roleHierarchy) надо было использовать handler.setRoleHierarchy(roleHierarchy.roleHierarchy()) н

→ Ссылка