2009-02-05 5 views
15

Я немного потерял, почему весна не применяет @Secured («ROLE_USER») в моем сервисном интерфейсе. Мои контроллеры создаются с помощью аннотаций.spring not enforcing метод аннотации безопасности

Пример моего интерфейса службы

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

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

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

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

+0

Я импортируя Охранно-context.xml и источник данных-context.xml в applicationContext.xml. Перемещение вверх , похоже, устраняет проблему с ролью защиты URL-адресов. но не проблема безопасности метода. – IaCoder

+0

Да, важная часть заключается в том, что у вас есть глобальная защита метода в том же контексте Spring, что и компоненты. –

1

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

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

2

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

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

2

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

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

Работает как очарование сейчас!

+0

Как я понял, это немного лишнее, чтобы определить ваш файл app-servlet.xml как часть contextConfigLocation. Если вы используете DispatcherServlet, он загрузит ваше servletname-servlet.xml, которое наследует WebApplicationContext. В этом случае мне кажется, что ваши бобы будут сначала создаваться один раз в вашем WebApplicationContext вашим ContextLoader, а затем переопределены с теми же определениями в другое время вашим DispatcherServlet. – Sam

+0

Вау, я должен это проверить. Благодаря! –

+0

@Sam and @Joe На самом деле это не избыточно, потому что они отделяют вещи. Если вы поместите маршрут -servlet.xml, будет создан дочерний контекст приложения, родителем которого является WebApplicationContext. @Joe, вероятно, заставил его работать, потому что у него нет дочернего контекста (приложение-сервлет и безопасность находятся в одном контексте). –

1

вы используете что-то подобное в вашем 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 я не был в состоянии обеспечить соблюдение аннотаций безопасности

4

В моем случае , точное местонахождение данного оператора:

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

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

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

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

+12

Не так важно, чтобы это было после компонентного сканирования, оно просто должно быть в одном файле! –

0

я имел такую ​​же проблему. После того как я добавил:

<context:annotation-config /> 

в моем пружинном security.xml файл исчез.

Надеется, что это поможет кому-то :)