Весенняя защита @PreAuthorize NullPointerException. Почему? - PullRequest
0 голосов
/ 25 марта 2020

Я пытаюсь реализовать проверку роли пользователя в контроллере, поэтому, когда пользователь вызывает определенный веб-адрес, он получает доступ к странице (или нет).

Поэтому я ставлю @PreAuthorize ("hasPermission ...) в одном из методов моего контроллера и создал мой пользовательский * PermissionEvaluator *. Он принимает в качестве параметров две строки (имя объекта - String, имя разрешения - String), который я позже возьмите объект роли пользователя. В целях тестирования он всегда возвращает true.

Проблема: Я всегда получаю исключение NullPointerException при размещении @PreAuthorize. Не могли бы вы объяснить, что я делаю неправильно? ?

Контроллер

@RequestMapping(value = "goal/new", method = RequestMethod.GET)
@PreAuthorize("hasPermission('GOAL', 'WRITE')")
public String add (Model model,  RedirectAttributes redirect) {
   User user = AuthUtils.getCurrentUser();
   Goal goal = new Goal();
   Set<Unit> units = unitService.getUnitsByRole(user.getRoles());
   model.addAttribute("goal", goal);
   model.addAttribute("units", units);
return WEB_FORM_URL;
}

Оценщик разрешений

@Component
public class CustomPermissionEvaluator implements PermissionEvaluator {
    @Override
    public boolean hasPermission(Authentication authentication, Object targetDomainObject, Object permission) {
        System.out.println("Permission eveluator: called");
        boolean permissionGranted = true;
        return permissionGranted;
    }

    @Override
    public boolean hasPermission(Authentication authentication, Serializable serializable, String targetType,
                                 Object permission) {
        return false;
    }
}

GlobalMethodSecurityConfiguration

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

    @Autowired
    CustomPermissionEvaluator permissionEvaluator;

    @Bean
    public MethodSecurityExpressionHandler methodSecurityExpressionHandler() {
        DefaultMethodSecurityExpressionHandler handler = new DefaultMethodSecurityExpressionHandler();
        handler.setPermissionEvaluator(permissionEvaluator);
        return handler;
    }
}

стек ошибок

java.lang.NullPointerException: null
    at org.springframework.security.access.expression.SecurityExpressionRoot.hasPermission(SecurityExpressionRoot.java:177) ~[spring-security-core-5.1.4.RELEASE.jar:5.1.4.RELEASE]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_201]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_201]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_201]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_201]
    at org.springframework.expression.spel.support.ReflectiveMethodExecutor.execute(ReflectiveMethodExecutor.java:130) ~[spring-expression-5.1.5.RELEASE.jar:5.1.5.RELEASE]
    at org.springframework.expression.spel.ast.MethodReference.getValueInternal(MethodReference.java:138) ~[spring-expression-5.1.5.RELEASE.jar:5.1.5.RELEASE]
    at org.springframework.expression.spel.ast.MethodReference.getValueInternal(MethodReference.java:94) ~[spring-expression-5.1.5.RELEASE.jar:5.1.5.RELEASE]
    at org.springframework.expression.spel.ast.SpelNodeImpl.getTypedValue(SpelNodeImpl.java:114) ~[spring-expression-5.1.5.RELEASE.jar:5.1.5.RELEASE]
    at org.springframework.expression.spel.standard.SpelExpression.getValue(SpelExpression.java:300) ~[spring-expression-5.1.5.RELEASE.jar:5.1.5.RELEASE]
    at org.springframework.security.access.expression.ExpressionUtils.evaluateAsBoolean(ExpressionUtils.java:26) ~[spring-security-core-5.1.4.RELEASE.jar:5.1.4.RELEASE]
    at org.springframework.security.access.expression.method.ExpressionBasedPreInvocationAdvice.before(ExpressionBasedPreInvocationAdvice.java:59) ~[spring-security-core-5.1.4.RELEASE.jar:5.1.4.RELEASE]

1 Ответ

0 голосов
/ 26 марта 2020

Я не уверен на 100%, но не могли бы вы изменить сигнатуру метода в вашем CustomMethodSecurityConfig, чтобы фактически переопределить правильный метод в GlobalMethodSecurityConfiguration.

Итак

 @Override
    protected MethodSecurityExpressionHandler createExpressionHandler() {

вместо

  @Bean
    public MethodSecurityExpressionHandler methodSecurityExpressionHandler() {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...