Поскольку у меня было это
loadUserByUsername не вызывается
и некоторые другие проблемы после обновления безопасности пружины с 3.2.8 до 4.0.2 я оставлю описаниемоей ситуации, даже если там уже принят правильный ответ.
Итак, вчера я решил сделать упомянутое обновление безопасности.Прежде всего, так как в безопасности 4.0.2 защита csrf включена по умолчанию, мне нужно было отключить ее в моем файле security-context.xml:
<http>
.
.
.
<csrf disabled="true"/>
</http>
На текущем этапе защиты проекта csrf отсутствуетт включены в угловой интерфейс.Этот момент привел к ошибке инициализации контекста.
После этого я увидел, что не могу войти в приложение.Я делал POST по умолчанию j_spring_security_check URL для этого.Но Spring Security 4.0.2 использует другое: Ссылка на Spring Security
login-processing-url Сопоставляется со свойством filterProcessesUrl в UsernamePasswordAuthenticationFilter.Значение по умолчанию: "/login".
Также был изменен URL-адрес выхода по умолчанию: Ссылка безопасности Spring
URL-адрес выхода URL, который приведет к выходу из системы (т. Е. Который будет обработан фильтром).По умолчанию "/logout".
Поэтому я внес изменения в мой файл security-context.xml и логин / выход из системы вернулся к правильному поведению.
После этого я заметил свои аннотации @PreAuthorizeне работают.Я использую их с именами ролей, определенными как константы:
@PreAuthorize("hasRole(T(org...UserService).ADMIN_ROLE_NAME)"
+ " or hasRole(T(org...UserService).OWNER_ROLE_NAME)")
И имена ролей были:
public final static String ADMIN_ROLE_NAME = "admin";
public final static String USER_ROLE_NAME = "plain_user";
public final static String OWNER_ROLE_NAME = "company_owner";
Как вы видите, они не содержат префикса 'ROLE_'.Насколько я понимаю, Security 4.0.2 не может использовать такие имена.Может быть, это из-за: Ссылка Spring Security
Теперь вы можете опционально опустить префикс ROLE_.Мы делаем это, чтобы удалить дублирование.В частности, поскольку выражение hasRole уже определяет значение как роль, оно автоматически добавляет префикс, если его там нет.
Я изменил имена ролей на:
public final static String ADMIN_ROLE_NAME = "ROLE_ADMIN";
public final static String USER_ROLE_NAME = "ROLE_USER";
public final static String OWNER_ROLE_NAME = "ROLE_OWNER";
и безопасностьвернулся к правильному поведению.
PS (после ответа Ральфа) * 1057 *
и добавьте перехватчик для / j_spring_security_check
У меня не было перехватчика для 3.2.8 по умолчанию login-processing-url.И у меня нет перехватчика для 4.0.2 по умолчанию login-processing-url.В моем файле security-context.xml есть перехватчик для страницы входа в систему:
<intercept-url pattern="/authorize" access="permitAll" />
, который просто возвращает login.html.