MethodSecurity с CustomPermissionEvaluator не работает для SpringSecurity

Я борюсь с моей конфигурацией Spring Security, которую мне пока не удалось заставить работать. нужна ваша помощь.

Это моя конфигурация:

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {

    @Override
    protected MethodSecurityExpressionHandler createExpressionHandler() {
        DefaultMethodSecurityExpressionHandler expressionHandler =
                new DefaultMethodSecurityExpressionHandler();
        expressionHandler.setPermissionEvaluator(new CustomPermissionEvaluator());
        return expressionHandler;
    }
}

Это CustomPermissionEvaluator:

public class CustomPermissionEvaluator implements PermissionEvaluator {

    @Override
    public boolean hasPermission(Authentication auth, Object targetDomainObject, Object permission) {
        return true;
    }

    @Override
    public boolean hasPermission(Authentication auth, Serializable targetId, String targetType, Object permission) {
        return true;
    }
}

Это контроллер:

@PreAuthorize("hasPermission(#test, 'write')")
@PostMapping("/test")
public Result saveTest(@RequestBody Test test) {
    return Result.build();
}

Все выглядит нормально и просто, но когда я запрашиваю остальные API, возникает следующее исключение:

.m.m.a.ExceptionHandlerExceptionResolver : Resolved exception caused by Handler execution: org.springframework.security.authentication.AuthenticationCredentialsNotFoundException: An Authentication object was not found in the SecurityContext

Кто-нибудь может мне подсказать, что делать? Спасибо ~

вы использовали @EnableWebSecurity, это может помочь

guleryuz 30.08.2018 13:29

Ошибка связана с отсутствием объекта аутентификации вместо авторизации. Вы определили UserDetailsService и уверены, что ваша аутентификация прошла успешно?

Roald Bankras 30.08.2018 13:32

@guleryuz Нет, я включил только @EnableGlobalMethodSecurity, потому что нет необходимости в веб-безопасности моего бизнеса. это нормально?

william 30.08.2018 13:38

@RoaldBankras да, я определил UserDetailsService, но я не знаю, как подключиться к методу безопасности, не могли бы вы рассказать мне, как это сделать?

william 30.08.2018 13:41

у вас есть аутентификация в вашем приложении?

guleryuz 30.08.2018 13:45

Для этот блог вы можете подключить свой userDetailService, определив метод для получения AuthenticationManagerBuilder. В этом построителе вы можете определить простой inMemoryAuthentication для тестирования или подключить свою реализацию AuthenticationProvider или UserDetailService.

Roald Bankras 30.08.2018 13:48

@RoaldBankras благодарит за любезную помощь.

william 03.09.2018 10:16

Пожалуйста. Я переписал комментарии как ответ. Примите ответ, если он вам помог.

Roald Bankras 03.09.2018 10:39
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
8
187
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ошибка связана с отсутствием объекта Authentication вместо Authorization. Вы определили UserDetailsService и уверены, что ваша аутентификация прошла успешно?

Для этот блог вы можете подключить свой userDetailService, определив метод для получения AuthenticationManagerBuilder. В этом построителе вы можете определить простой inMemoryAuthentication для тестирования или подключить свою реализацию AuthenticationProvider или UserDetailService.

Другие вопросы по теме