我是Spring Security的新手,虽然(我相信)我设置了web.xml
,applicationContext.xml
和{{},但我无法让Spring Method Security在我的网络应用程序中运行1}}启用和使用Spring方法安全性。此Web应用程序使用GWT和RESTful服务,我已成功通过用户身份验证实现安全性,即强制用户登录Web应用程序 - 甚至使用SPNEGO与Keberos和Active Directory实现单点登录。但是,当我将applicationContext-security.xml
元素添加到安全上下文并针对所需的Java方法指定适当的注释时,似乎没有任何事情发生!
我特意尝试让<global-method-security>
工作(但让任何方法安全性都很好!),但是不会过滤返回的列表,不会生成相关错误,也不会列出任何异常Tomcat日志文件。
我确信我忽略了一些非常基本和基本的东西,但我见过的所有例子都没有明确说明所有预先要求的方法安全性如何工作,例如我真的需要使用AOP,如果是的话,怎么样?所有示例都只是说将@PostFilter
元素添加到应用程序上下文(使用适当的属性,即<global-method-security>
),然后在您希望保护的方法旁边使用相应的注释..... - 像魔法一样 - 它应该有效!
无论如何,这是我的配置文件:
的web.xml
pre-post-annotations="enabled"
的applicationContext.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-security.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>
最后,java源文件包含我希望过滤的方法。
DomainPageDecorator.java
<?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>
有谁能告诉我我错过了什么或做错了什么?
NB:我在安全的环境中工作,这阻止我从我的开发机器上将堆栈跟踪和大型代码段等发布到Internet上。但是,我仍然可以提供帮助解决这个问题所需的任何进一步的信息,即使我打算全部输入:-(预先为任何拼写错误道歉
答案 0 :(得分:1)
您只能将这些注释应用于某些弹簧上下文文件中声明的bean 。从提供的代码看起来,您的DomainPageDecorator类不受spring管理。管理它:
new
关键字)。使用@Inject
或XML。