我是Spring Security的新手,我很難讓Spring Method Security在我的web應用程序中工作,儘管(我相信)我已經設置了web.xml
和applicationContext-security.xml
到web.xml
和applicationContext-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));
}
}
誰能告訴我我在丟失或做錯了嗎?
注:我工作在一個安全的環境,防止我發佈堆棧跟蹤和大代碼段等從我的開發機器上互聯網。但是,即使我將全部輸入,仍需提供所需的任何進一步信息以幫助解決此問題:-(對於任何輸入錯誤,請事先道歉
感謝您的回覆。是的,我錯過了這個bean尚未在spring上下文文件中顯式聲明的事實。因此,我在我的類聲明中使用了Component註釋,如下所示: – alana 2013-05-07 14:45:00
'@Component' 'public class DomainPageDecorator extends PageDecorator' –
alana
2013-05-07 14:46:50
不幸的是,該方法的安全性似乎還是被忽略了 – alana 2013-05-07 14:54:10