Как получить permitAll в Spring Security, чтобы не бросать AuthenticationCredentialsNotFoundexception в объекте @Controller?

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

@RequestMapping("/show/{pressReleaseId}")
@PreAuthorize("permitAll")
public ModelAndView show(@PathVariable long pressReleaseId) {
    ModelAndView modelAndView = new ModelAndView(view("show"));

    modelAndView.addObject("pressRelease",
        sysAdminService.findPressRelease(pressReleaseId));

    return modelAndView;
}

к сожалению, Spring Security выдает это исключение:

org.springframework.security.authentication.AuthenticationCredentialsNotFoundException: An Authentication object was not found in the SecurityContext
    at org.springframework.security.access.intercept.AbstractSecurityInterceptor.credentialsNotFound(AbstractSecurityInterceptor.java:321)
    at org.springframework.security.access.intercept.AbstractSecurityInterceptor.beforeInvocation(AbstractSecurityInterceptor.java:195)
    at org.springframework.security.access.intercept.aopalliance.MethodSecurityInterceptor.invoke(MethodSecurityInterceptor.java:64)

Как я могу заставить Spring Security не выбрасывать это исключение? Я просто хочу, чтобы кто - нибудь-не аутентифицированные пользователи и аутентифицированные пользователи - все.

мое единственное решение-поставить это метод Вообще на другой контроллер без @предварительного блокирования средств на всех... это сработает, но это глупо. Я хочу, чтобы все мои действия пресс-релиза были в одном контроллере.

Спасибо за помощь!

3 ответов


обычный способ разрешить кому-либо доступ к методу контроллера -не аннотировать его с любыми аннотациями безопасности Spring; ie нет @PreAuthorize нет @Secured etc.

вы должны быть в состоянии просто удалить @PreAuthorize с show() метод, любой оставьте аннотацию на других методах в этом контроллере. Другие методы останутся независимо от того, что вы делаете с show() метод.


Я думаю, у вас нет фильтра аутентификации anonymouse включен.

Если вы используете конфигурацию пространства имен и auto-config = "true", Он должен быть включен по умолчанию. Если вы не используете auto-config, вы можете включить анонимный фильтр как <security:anonymous />.


значение по умолчанию изменилось с более новой версией (версия 2) плагина spring security. Это означает, что все контроллеры защищены по умолчанию (вам нужно войти в систему, чтобы увидеть их). Удаление @Secured не будет работать вообще, он все равно останется защищенным. Вы можете изменить это поведение по умолчанию, но для меня новое поведение по умолчанию имеет смысл, потому что это гораздо более безопасно. И безопасность очень важна.

Я использую только

@Secured(['permitAll'])

для моего контроллера, но он также должен работать для метода.