2013-05-01 3 views
0

Я новичок в Spring Security, и у меня возникли проблемы с получением Spring Method Security для работы в моем веб-приложении, хотя (я считаю). Я установил web.xml, , applicationContext.xml и applicationContext-security.xml, чтобы включить и использовать функцию Spring. Это веб-приложение использует службы GWT и RESTful, и я успешно реализовал безопасность с помощью аутентификации пользователя, то есть заставляя пользователей входить в веб-приложение, и даже реализовал Single-Sign-On, используя SPNEGO с Keberos и Active Directory. Однако, когда я добавляю элемент <global-method-security> в контекст безопасности и указываю соответствующие аннотации против желаемых методов Java, ничего не происходит!Spring Security 3.0: метод Безопасность игнорируется

Я специально пытаюсь получить @PostFilter для работы (но получение какой-либо безопасности метода будет отличным!), Однако возвращенный список НЕ фильтруется, никаких связанных ошибок не генерируется и исключений не содержится в журнале Tomcat файлы.

Уверен, что есть что-то очень основное и фундаментальное, что я упустил из виду, но ни один из примеров, которые я видел, не ясно, что ВСЕ ПРЕДВАРИТЕЛЬНЫЕ ПРЕДВАРИТЕЛЬНЫЕ ЛИЦА должны получить защиту метода для работы, например. действительно ли мне нужно использовать АОП, и если да, то как? Все примеры просто говорят добавить элемент <global-method-security> в контекст приложения (с соответствующими атрибутами, то есть pre-post-annotations="enabled"), а затем использовать соответствующие аннотации рядом с методами, которые вы хотите защитить ..... тогда - как волшебство - оно должно работать!

Во всяком случае, вот мои конфигурационные файлы:

web.xml

<web-app> 
    <display-name>Jersey Rest Servlet</display-name> 
    <context-param> 
     <param-name>contextConfigLocation</param-name> 
      <param-value> 
       classpath:applicationContext.xml 
       classpath:applicationContext-security.xml 
      </param-value> 
    </context-param> 

    <!-- Hook into Spring Security framework --> 
    <filter> 
     <filter-name>springSecurityFilterChain</filter-name> 
     <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
    </filter> 

    <filter-mapping> 
     <filter-name>springSecurityFilterChain</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 


    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 

    <servlet> 
     <servlet-name>JerseyRESTService</servlet-name> 
     <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class> 
     <load-on-startup>1<load-on-startup> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>JerseyRESTService</servlet-name> 
     <url-pattern>/*</url-pattern> 
    </servlet-mapping> 

    <welcome-file-list> 
     <welcome-file>/jsp/Home.jsp</welcome-file> 
    </welcome-file-list> 

</web-app> 

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans 
    xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation=" 
     http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
     http://www.springframework.org/schema/context 
     http://www.springframework.org/schema/context/spring-context-3.1.xsd"> 

    <context:component-scan base-package="com.myorg.webservices.impl" /> 

    <bean id="mongo" class="com.mongodb.Mongo"> 
     <constructor-arg name="host" value="localhost" /> 
     <constructor-arg name="port" value="27017" /> 
    </bean> 

    <bean id="db" class="com.myorg.dao.DBFactory"> 
     <constructor-arg name="mongo" ref="mongo"> 
     <constructor-arg name="name" value="mydatabase" /> 
    </bean> 

</beans> 

ApplicationContext-security.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans:beans 
    xmlns="http://www.springframework.org/schema/security" 
    xmlns:beans="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation=" 
     http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
     http://www.springframework.org/schema/context 
     http://www.springframework.org/schema/context/spring-context-3.1.xsd 
     http://www.springframework.org/schema/security 
     http://www.springframework.org/schema/security/spring-security-3.0.3.xsd"> 

    <!-- Enable annotations-based security --> 
    <global-method-security pre-post-annotations="enabled" /> 


    <http use-expresions="true"> 
     <intercept-url> pattern="/**" access="isAuthenticated()" /l> 
     <form-login /> 
    </http> 

    <authentication-manager> 
     <authentication-provider> 
      <user-service> 
       <user name="testadmin" password="password" authorities="supervisor, user" /> 
       <user name="testuser001" password="password" authorities="user" /> 
      </user-service> 
     </authentication-provider> 
    </authentication-manager> 

</beans:beans> 

И, наконец, исходный файл java, содержащий метод, который я хочу фильтровать.

DomainPageDecorator.java

package com.myorg.client.domain; 

import java.util.ArrayList; 
import java.util.List; 
import org.springframework.security.access.prepost.PostFilter; 
import org.springframework.security.access.prepost.PreAuthorize; 

public class DomainPageDecorator extends PageDecorator<DomainData> 
{ 
    public DomainPageDecorator (int numberOfRecordsOnPage) 
    { 
     this.setPageSize(numberOfRecordsOnPage); 
    } 


    "  " 
    "  " 
    "  " 

    /* Use Spring Method Security to only allow 'ACTIVE' objects through */ 
    @PreAuthorize("hasRole('ROLE_USER')") 
    @PostFilter("filterObject.getStatus()=='ACTIVE' ") 
    public List<DomainObject> convertToList() 
    { 
     List<DomainObject> dataList = new ArrayList<DomainObject>(); 

     for (int i = 0; i < data.getPage().getLength(); i++) 
     { 
      dataList.add(new DomainObject(data.getPage().get(i))); 
     } 

     return dataList; 
    } 

    public DomainObject getFirstItem() 
    { 
     return new DomainObject(data.getPage().get(0)); 
    } 
} 

Может кто-нибудь пожалуйста, скажите мне, что я пропускаю или делаю неправильно?

NB: Я работаю в защищенной среде, которая мешает мне размещать трассировки стека и большие сегменты кода и т. Д. В Интернете с моей машины разработки. Тем не менее, я все равно должен быть в состоянии предоставить любую дополнительную информацию, необходимую для решения этой проблемы, даже если я наберу все это :-(Извините заранее за любые опечатки

ответ

1

Вы можете применить эти аннотации только к фасоли . объявленный в некотором контексте весной файла из предоставленного кода он выглядит как ваш класс DomainPageDecorator не управляется весной Сделать это удалось:.

  1. Объявить его (через аннотацию, как @Component или непосредственно в XML)
  2. .
  3. Извлеките его с помощью Spring (вместо ключевого слова new). Используйте @Inject или XML.
+0

Благодарим за отзыв. Да, я пропустил факт, что компонент не был явно объявлен в файле весеннего контекста. Итак, я использовал аннотацию компонентов в своем объявлении класса следующим образом: – alana

+0

'@Component' 'public class DomainPageDecorator extends PageDecorator ' – alana

+0

К сожалению, безопасность метода по-прежнему оказалась минусовой – alana

Смежные вопросы