私はSpring Securityを初めて使用し、Spring Method SecurityをWebアプリケーションで機能させるのに問題がありますが、Spring Method Securityを有効にして使用するようにweb.xml
設定applicationContext.xml
しました(私は信じています)。applicationContext-security.xml
この Web アプリケーションは GWT と RESTful サービスを使用しており、ユーザー認証を介してセキュリティを実装することに成功しました。つまり、ユーザーに Web アプリへのログインを強制し、SPNEGO と Keberos および Active Directory を使用してシングル サインオンを実装しました。しかし、<global-method-security>
要素をセキュリティ コンテキストに追加し、必要な Java メソッドに対して適切な注釈を指定しても、何も起こらないようです!
私は具体的@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) );
}
}
何が欠けているのか、間違っているのか誰か教えてください。
注意:私は安全な環境で作業しているため、スタック トレースや大きなコード セグメントなどを開発マシンからインターネットに投稿することはできません。ただし、この問題を解決するために必要な追加情報を提供できるはずですが、すべてを入力します:-(タイプミスについては事前にお詫びします