Я новичок в 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: Я работаю в защищенной среде, которая мешает мне размещать трассировки стека и большие сегменты кода и т. Д. В Интернете с моей машины разработки. Тем не менее, я все равно должен быть в состоянии предоставить любую дополнительную информацию, необходимую для решения этой проблемы, даже если я наберу все это :-(Извините заранее за любые опечатки
Благодарим за отзыв. Да, я пропустил факт, что компонент не был явно объявлен в файле весеннего контекста. Итак, я использовал аннотацию компонентов в своем объявлении класса следующим образом: – alana
'@Component' 'public class DomainPageDecorator extends PageDecorator' –
alana
К сожалению, безопасность метода по-прежнему оказалась минусовой – alana