SpringSecurity несколько пространств имен и защищенных аннотаций.Великая путаница - PullRequest
1 голос
/ 09 января 2012

Я делаю веб-приложение Spring MVC с некоторыми ресурсами RESTfull в качестве API.

Мне нужна часть RESTfull, чтобы иметь несколько пользовательских фильтров, так как я не хочу никакого перенаправления, и я хочу, чтобы любое исключениеперевести с соответствующим кодом ошибки HTTP и базовым описанием JSON.

С другой стороны, остальные сайты должны быть более распространенными и перенаправлять людей, когда они не вошли в систему и т. д.

Еще одна вещь, я хочу использовать аннотации @Secured и пост-аутентификацию в некоторых случаях.

Как правильно определить несколько пространств имен http (в Spring 3.1)?

Вот моя ошибочная конфигурация:

    <global-method-security secured-annotations="enabled" />

<http pattern="/rest/**" authentication-manager-ref="authenticationManager" entry-point-ref="restAuthenticationEntryPoint">
    <form-login login-page="/rest/login" login-processing-url="/rest/postlogin"
        authentication-success-handler-ref="restAuthenticationSuccessHandler"
        authentication-failure-handler-ref="restAuthenticationFailureHandler"
        username-parameter="username" password-parameter="password" />
    <logout logout-url="/rest/logout" invalidate-session="true" />
</http>

<http pattern="/**" authentication-manager-ref="authenticationManager">
    <form-login login-page="/login" login-processing-url="/postlogin"
        username-parameter="username" password-parameter="password" />
    <logout />
</http> 

Самое смешное, что эта конфигурация работает частично, так как я могу войти в систему с помощью / rest / login и получить ответ от своего пользовательского обработчика успеха.Я также могу войти из / login и получить правильное перенаправление на /.Выход из системы также работает нормально.

Далее, все компоненты контроллеров имеют @Secured ("ROLE_USER") в защищенных методах.Но все защищенные методы никогда не становятся безопасными. Почему это так?

    @Secured({"ROLE_USER"})
@RequestMapping(method = RequestMethod.GET, headers = { "Range" })
public @ResponseBody
HttpEntity<List<T>> list(@RequestHeader("Range") String range) {

Я всюду читал документацию и запутался больше, чем когда-либо.

  • Почему мои методы не защищены?
  • Должно ли пространство имен http определять доступ, чтобы аннотации @Secured работали?
  • Записывает ли пространство имен http мои аннотации @Secured?Если это так, как я могу определить несколько «страниц входа» с пользовательскими фильтрами и возможностью использовать аннотации?

Вот несколько фактов: * Я использую Spring и SpringSecurity 3.1 * У меня естьПользовательский AuthenticationManager для получения сведений о пользователях из спящего режима.* Некоторые контроллеры расширяют абстрактный класс, где находятся аннотации @Secured.Но это все еще не работает для простого контроллера.* Мои контроллеры обнаруживаются с контекстом: компонент-сканирование и базовый пакет.* Безопасность отлично работает с одним пространством имен http.

, пожалуйста, помогите, я схожу с ума от этого!

1 Ответ

0 голосов
/ 09 января 2012

Ознакомьтесь с этим ответом , чтобы убедиться, что веб-контекст видим для декларации global-method-security и, возможно, с использованием проксирования классов.

Чтобы ответить на другие вопросы, не задавайте httpПространство имен не должно влиять на использование @Secured аннотаций, за исключением того, что пользователь аутентифицируется веб-частью приложения, и эта информация будет использоваться перехватчиком безопасности метода при принятии решения о доступе.Если вы не переопределите его (используя access-decision-manager-ref), метод безопасности будет использовать стандарт AccessDecisionManager, который предоставляет или запрещает доступ на основе ролей, которые имеет пользователь.

...