пружина не применяет метод аннотации безопасности - PullRequest
15 голосов
/ 05 февраля 2009

Я кое-что упустил из-за того, что 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>

Ответы [ 7 ]

7 голосов
/ 06 февраля 2009

У вас есть заявление

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

в том же файле конфигурации, который вы определили для bean-компонента MyServiceManager? У меня была та же проблема, пока я не включил отладку для org.springframework, и заметил, что весенняя защита применялась только к тому же файлу, что и файлы, в которых была определена глобальная защита метода.

4 голосов
/ 30 марта 2011

В моем случае точное местоположение этого утверждения:

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

оказалось очень важным. Убедитесь, что вы поставили после , объявив, какие классы следует сканировать и использовать в качестве контроллеров.

<context:component-scan base-package="com.test.controller" />

Это способ убедиться, что аннотации @Secured также попадут в игру

2 голосов
/ 20 февраля 2009

У меня была такая же проблема. Используя информацию из ответа Кента Лая, я смог это исправить.

Я поместил элемент <global-method-security> в свой app-servlet.xml, но сохранил определения безопасности отдельно в security.xml, где web.xml имеет contextConfigLocation для app-servlet.xml и security.xml.

Теперь работает как шарм!

2 голосов
/ 11 февраля 2009

Проведя дополнительные исследования по этой проблеме, я пришел к следующему выводу / решению. Я не уверен, что это на 100% правильно .. но это работает.

Я поместил всю свою конфигурацию в файл dispatcher-servlet.xml. Таким образом, вместо disptacher-servlet.xml и application-context.xml. Dispatcher-servlet.xml загружается приложением (contextConfigLocation). Внутри dispatcher-servlet.xml я импортирую свои security-context.xml и datasource-context.xml. После этого все работает.

1 голос
/ 23 декабря 2010

Вы использовали что-то подобное в своем 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, я не смог применить аннотации безопасности

1 голос
/ 07 февраля 2009

Попробуйте поместить аннотации на класс реализации вместо интерфейса и посмотрите, работает ли это. Я закончил тем, что делал это в недавнем проекте, потому что я также использовал атрибут @Transactional на своем сервисном уровне, и документы Spring рекомендуют помещать их в класс, а не в интерфейс. Я не знаю, может ли та же проблема относиться к @Secured, но я хотел сохранить аннотации в том же месте. См. Spring Docs

Что касается ответа Кента Лая ... это хорошая идея ... убедитесь, что ваш файл конфигурации безопасности действительно включен в Spring.

0 голосов
/ 22 апреля 2015

У меня была такая же проблема. После того, как я добавил:

<context:annotation-config />

в моем файле spring-security.xml он исчез.

Надеюсь, это кому-нибудь поможет:)

...