Как получить allowAll в Spring Security, чтобы НЕ выбрасывать AuthenticationCredentialsNotFoundException в объекте @Controller? - PullRequest
6 голосов
/ 20 декабря 2010

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

@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, чтобы НЕ генерировать это исключение?Я просто хочу, чтобы кто-нибудь входил - пользователи, не прошедшие проверку подлинности, и пользователи, прошедшие проверку подлинности, - все.

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

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

Ответы [ 3 ]

10 голосов
/ 20 декабря 2010

Я полагаю, у вас не включен фильтр проверки подлинности анонимного пользователя.

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

3 голосов
/ 17 января 2014

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

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

@Secured(['permitAll'])

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

3 голосов
/ 20 декабря 2010

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

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

...