Spring не применять аннотации безопасности метода
Я немного потерял, почему spring не применяет @Secured ( "ROLE_USER" ) в моем сервисном интерфейсе. Мои контроллеры создаются с помощью аннотаций.
Пример моего интерфейса службы
public interface MyServiceManager {
@Secured("ROLE_USER")
public void delete(int cid);
@RolesAllowed({"ROLE_USER"})
public Contact getContact(int contactId);
}
мой контекст безопасности:
<global-method-security secured-annotations="enabled" jsr250-annotations="enabled">
</global-method-security>
<http auto-config="true" >
<intercept-url pattern="/secure/**" access="ROLE_SUPERVISOR" />
<intercept-url pattern="/addcontact**" access="IS_AUTHENTICATED_REMEMBERED" />
<intercept-url pattern="/**" access="IS_AUTHENTICATED_ANONYMOUSLY" />
<concurrent-session-control max-sessions="1"
exception-if-maximum-exceeded="true"/>
<form-login login-page="/login.jsp" authentication-failure-url="/login.jsp?login_error=1"/>
<logout logout-success-url="/welcome.do" logout-url="/logout"/>
</http>
<authentication-provider>
<password-encoder hash="md5"/>
<user-service>
<user name="rod" password="a564de63c2d0da68cf47586ee05984d7" authorities="ROLE_SUPERVISOR, ROLE_USER, ROLE_TELLER" />
</user-service>
</authentication-provider>
Ответы
Ответ 1
У вас есть утверждение
<global-method-security secured-annotations="enabled" jsr250-annotations="enabled" />
в том же файле конфигурации, что и файл MyServiceManager bean? У меня была такая же проблема, пока я не включил debug для org.springframework и заметил, что безопасность spring была применена только в том же файле, что и в том, где была определена защита глобального метода.
Ответ 2
В моем случае точное местоположение этого оператора:
<global-method-security secured-annotations="enabled" >
оказалось очень важным. Убедитесь, что вы положили после, вы объявляете, какие классы следует сканировать и использовать в качестве контроллеров.
<context:component-scan base-package="com.test.controller" />
Это способ убедиться, что аннотации @Secured также попадут в игру
Ответ 3
После проведения дополнительных исследований по этой проблеме я пришел к следующему выводу/решению. Я не уверен, что он на 100% прав... но он работает.
Я поместил всю свою конфигурацию в файл dispatcher-servlet.xml. Поэтому вместо наличия disptacher-servlet.xml и application-context.xml. Диспетчер-servlet.xml загружается приложением (contextConfigLocation). В dispatcher-servlet.xml я импортирую свой файл security-context.xml и datasource-context.xml. Afer, что все работает.
Ответ 4
У меня была такая же проблема. Используя информацию от Kent Lai, ответьте здесь, я смог ее исправить.
Я поместил элемент <global-method-security>
в свой app-servlet.xml
, но сохранил определения безопасности в security.xml
, где web.xml
имеет contextConfigLocation
для app-servlet.xml
и security.xml
.
Теперь работает как шарм!
Ответ 5
Попробуйте помещать аннотации в класс реализации вместо интерфейса и посмотреть, работает ли это. Я закончил это в недавнем проекте, потому что я также использовал атрибут @Transactional на моем уровне сервиса, а документы Spring рекомендуют помещать их в класс, а не в интерфейс. Я не знаю, может ли такая же проблема примениться к @Secured, но я хотел сохранить аннотации в одном и том же месте. См. Spring Документы
Относительно ответа Kent Lai... это хорошая идея... убедитесь, что ваш файл конфигурации безопасности фактически включен Spring.
Ответ 6
Вы использовали что-то подобное в своем web.xml
<servlet>
<servlet-name>name</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/webmvc-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
Я не уверен, почему, но если я использую DispatcherServlet, я не смог обеспечить соблюдение аннотаций безопасности
Ответ 7
У меня была такая же проблема.
После добавления:
<context:annotation-config />
в моем файле spring -security.xml он исчез.
Надеюсь, это поможет кому-то:)