2012-05-21 102 views
2

我似乎无法使Spring Pre/Post方法安全注解正常工作。我已经阅读了有关该主题的每个相关的stackoverflow问题,主要建议是确保在与您希望保护的bean相同的上下文中启用全局方法安全性。我有以下我的dispatcher-servlet.xml:Spring Pre/Post方法安全注解不起作用

<context:component-scan base-package="com.package.path" /> 
    <context:annotation-config /> 
    <security:global-method-security pre-post-annotations="enabled" /> 

有问题的bean在“com.package.path”中。我知道Spring正在创建它们的实例,因为注入工作正常,并且请求正在被预期的类进行服务。

所以,这里是在“com.package.path”的一个例子服务类:

@Controller 
@RequestMapping("/article") 
public class ArticleServiceImpl extends GWTController implements ArticleService { 
    @Autowired 
    public ArticleServiceImpl(DataSource ds) { 

    } 

    @Override 
    @PreAuthorize("hasRole('ROLE_BASIC_USER')") 
    public Article save(Article article) { 

    } 

} 

的保存方法是行不通的注释。一些重要的注意事项:

  • 我正在使用GWT,但从我读过的,应该没什么关系。
  • 我的方法安全性在另一个类似的项目中工作得非常好。唯一的区别是另一个项目中有一个DAO层,它不在这个层中。在这一层,我有注释安全性工作。然而,只要Spring负责创建bean,那么它应该是什么“层”并不重要,对吧?
  • 上面的接口“ArticleService”是一个GWT服务接口。我试着把注释放在那里,但那也行不通。

这里是我的GWTController类,上面提到的,如果需要的话:Spring Security中提供

package com.areahomeschoolers.baconbits.server.spring; 

import javax.servlet.ServletConfig; 
import javax.servlet.ServletContext; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.springframework.web.context.ServletConfigAware; 
import org.springframework.web.context.ServletContextAware; 
import org.springframework.web.servlet.ModelAndView; 
import org.springframework.web.servlet.mvc.Controller; 

import com.areahomeschoolers.baconbits.server.util.ServerContext; 

import com.google.gwt.user.client.rpc.RemoteService; 
import com.google.gwt.user.server.rpc.RemoteServiceServlet; 

/** 
* Spring controller class that handles all requests and passes them on to GWT. Also initializes server context. 
*/ 
public class GWTController extends RemoteServiceServlet implements ServletConfigAware, ServletContextAware, Controller, RemoteService { 

    private static final long serialVersionUID = 1L; 

    protected ServletContext servletContext; 

    @Override 
    public ServletContext getServletContext() { 
     return servletContext; 
    } 

    // Call GWT's RemoteService doPost() method and return null. 
    @Override 
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { 
     // load our ServerContext with current request, response, session, user, appContext, etc. 
     ServerContext.loadContext(request, response, servletContext); 
     try { 
      doPost(request, response); 
     } finally { 
      ServerContext.unloadContext(); 
     } 
     return null; // response handled by GWT RPC over XmlHttpRequest 
    } 

    @Override 
    public void setServletConfig(ServletConfig conf) { 
     try { 
      super.init(conf); 
     } catch (ServletException e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public void setServletContext(ServletContext servletContext) { 
     this.servletContext = servletContext; 
    } 

    @Override 
    protected void checkPermutationStrongName() throws SecurityException { 
     return; 
    } 

    @Override 
    protected void doUnexpectedFailure(Throwable e) { 
     e.printStackTrace(); 
     super.doUnexpectedFailure(e); 
    } 

} 

回答

1

安全方面继承了基于代理的Spring框架的AOP支持的所有限制。特别是,方面不适用于在对象“内部”发生的调用(除非使用AspectJ编织),请参阅7.6.1 Understanding AOP proxies

因此,如果您想以这种方式使用安全性方面,您需要使用GWT集成机制,从外部调用您的服务,即不需要您的服务来扩展RemoteServiceServlet的机制。

类似spring4gwt应该可以正常工作。

+0

好的,我明白了。为了记录,我的首选解决方案(而不是使用第三方解决方案)是简单地将DAO层添加回来并在其中应用安全性,而不是在服务层中。这现在工作得很好。我想我应该知道,因为这是这两个项目之间的唯一区别。 谢谢! – tangent

相关问题