2013-05-01 77 views
0

我是Spring Security的新手,我很難讓Spring Method Security在我的web應用程序中工作,儘管(我相信)我已經設置了web.xmlapplicationContext-security.xmlweb.xmlapplicationContext-security.xml啓用和使用Spring方法安全性。這個Web應用程序使用GWT和RESTful服務,並且通過用戶身份驗證成功實現了安全性,即強制用戶登錄到Web應用程序,甚至使用帶Keberos和Active Directory的SPNEGO實現單點登錄。但是,當我將<global-method-security>元素添加到安全上下文中並根據所需的Java方法指定適當的註釋時,看起來沒有任何事情發生!Spring Security 3.0:方法安全性被忽略

我特別試圖讓@PostFilter工作(但獲得任何方法安全性工作將會很棒!),但是返回的列表不會被生成,並且沒有任何異常會在Tomcat日誌中列出文件。

我確定有一些非常基本和基本的東西我忽略了,但沒有一個我清楚看到的例子說明了所有先決條件都是爲了使方法安全性正常工作,我真的需要使用AOP嗎?如果是的話,如何?所有的例子都只是簡單地說將<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)); 
    } 
} 

誰能告訴我我在丟失或做錯了嗎?

注:我工作在一個安全的環境,防止我發佈堆棧跟蹤和大代碼段等從我的開發機器上互聯網。但是,即使我將全部輸入,仍需提供所需的任何進一步信息以幫助解決此問題:-(對於任何輸入錯誤,請事先道歉

回答

1

您可以將這些註釋僅應用於豆類。在一些Spring上下文文件宣佈從提供的代碼,它看起來像你的DomainPageDecorator類不是由Spring管理讓它管理:

  1. 聲明它(通過像@Component或直接在XML註釋部分)
  2. 通過Spring檢索它(而不是使用new關鍵字)。使用@Inject或XML。
+0

感謝您的回覆。是的,我錯過了這個bean尚未在spring上下文文件中顯式聲明的事實。因此,我在我的類聲明中使用了Component註釋,如下所示: – alana 2013-05-07 14:45:00

+0

'@Component' 'public class DomainPageDecorator extends PageDecorator ' – alana 2013-05-07 14:46:50

+0

不幸的是,該方法的安全性似乎還是被忽略了 – alana 2013-05-07 14:54:10