Иерархия ролей в Spring: NullPointerException
Пытаюсь реализовать собственную иерархию ролей в Spring и для ограничения доступов к методам. Для простоты делаем 2 роли: ADMIN and GOAL. ADMIN включает в себя роль GOAL. Т.е. заходя под ролью ADMIN, я должен иметь возможность вызывать методы с ролью GOAL.
Я реализовал бин RoleHierarchy в отдельном классе, т.к. по комментариям народа Security filters требуют ранней инициализации.
Столкнулся со следующей проблемой:
Когда обращаюсь к контроллеру, получаю NullPointer error (стек приведен Вопросы:
- Где порылась ошибка?
- В какой из 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 шт):
Вместо handler.setRoleHierarchy(roleHierarchy) надо было использовать handler.setRoleHierarchy(roleHierarchy.roleHierarchy()) н