2011-11-18 108 views
3

我正在使用Struts 2 + Spring Security 3制作一个简单的Web应用程序。而且我想使用Pre-Post Annotations来实现方法级别的安全性。Spring安全方法级别安全性注解不起作用

但注释不起作用。

这里是我的web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> 
    <display-name>MyCustomSpringSecurity</display-name> 

    <context-param> 
<param-name>contextConfiguration</param-name> 
<param-value>/WEB-INF/applicationContext.xml</param-value> 
    </context-param> 

    <listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

    <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> 
    <filter> 
    <filter-name>struts2</filter-name> 
    <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> 
</filter> 

    <filter-mapping> 
    <filter-name>struts2</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 
    <welcome-file-list> 
<welcome-file>index.jsp</welcome-file> 
</welcome-file-list> 
</web-app> 

这是我在struts.xml

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> 
<struts> 
<package name="default" extends="struts-default"> 
    <action name="firstPage" class="code.action.MyAction" method="showPage"> 
     <result name="success">/firstPage.jsp</result> 
    </action> 
</package> 
</struts> 

这是我的applicationContext.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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd"> 

    <global-method-security pre-post-annotations="enabled" > 
    </global-method-security> 

    <beans:bean id="myAction" class="code.action.MyAction"> 
     <intercept-methods> 
      <protect access="ROLE_ADMIN" method="showPage"/> 
     </intercept-methods> 
    </beans:bean> 

    <http auto-config="true" use-expressions="true"> 
     <intercept-url pattern="/index.jsp" access="permitAll" /> 
     <intercept-url pattern="/firstPage" access="hasRole('ROLE_USER')" /> 
    </http> 

    <authentication-manager> 
     <authentication-provider> 
      <user-service> 
       <user name="user" password="user" authorities="ROLE_USER" /> 
      </user-service> 
     </authentication-provider> 
    </authentication-manager> 

</beans:beans> 

最后这是MyAction.java

package code.action; 

import org.springframework.security.access.prepost.PreAuthorize; 

public class MyAction { 
    @PreAuthorize("hasRole('ROLE_ADMIN')") 
    public String showPage(){ 
     System.out.println("in showPage"); 
     return "success"; 
    } 
} 

您可以清楚地看到,我将角色分配给用户是ROLE_USER,但我希望它在访问该方法时是ROLE_ADMIN,因此逻辑上在运行此代码时应该出现403访问被拒绝的错误。但它能够访问该方法并显示下一页。

所以我认为注释不起作用。

任何人都知道发生了什么事?

+1

请做一个测试。创建一个新的Class SecuredAction,并在该类中使用'@ PreAuthorize'注释。然后在MyAction中注入该bean,并从showPage方法中调用它。 – Ralph

+0

我按照你的说法试过了。我创建了一个新的Class SecuredAction,并将该@PreAuthorize注释放在该类中,然后创建了SecuredAction的对象,并从MyAction:showPage()中调用了它的方法,但仍然不起作用。或者我应该尝试使用Spring依赖注入来注入SecuredAction的对象,但我认为这将是一回事。 –

+0

是的你必须使用注射。 - 我已经在我的评论中提到了它(“然后在MyAction中注入bean”)。 - 原因是Spring AOP只适用于Spring Bean,而不适用于正常情况。 – Ralph

回答

3

我们不能直接使用像这样的Spring注释。

为了同样的目的,还有另外一个插件Struts 2 - Spring Plugin。您可以从链接下载jar文件并将其包含在您的项目中。

+0

感谢您的最新_working_链接作为旧的链接有已被删除。 –

5

为了使Spring注释在Struts 2操作中有意义,您必须使用Struts 2 Spring Plugin。这将使用Spring来实例化Struts 2对象,允许注释处理,注入等。

+0

谢谢。这是我错过了让Spring DI工作的原因。 –

+0

你能帮我解决我的这个问题:http://stackoverflow.com/questions/8208501/struts-2-spring-spring-security-haspermission-not-working –