Spring Pre / Post方法安全注释无法正常工作

时间:2012-05-21 18:55:36

标签: spring spring-security

我似乎无法使Spring Pre / Post方法安全注释生效。我已经阅读了有关该主题的每个相关的stackoverflow问题,主要建议是确保在与您希望保护的bean相同的上下文中启用global-method-security。我有以下我的调度程序-servlet.xml:

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

有问题的bean在&#34; com.package.path&#34;中。我知道Spring正确地创建了它们的实例,因为注入正常工作并且请求正在由预期的类提供服务。

所以,这是&#34; com.package.path&#34;中的一个示例服务类:

@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) {

    }

}

save方法的注释不起作用。一些重要的注意事项:

  • 我使用GWT,虽然从我所读过的内容来看,这并不重要。
  • 我在另一个类似的项目中使用方法安全性非常好。唯一的区别是另一个项目中有一个DAO层,这个层不存在。我在这一层有注释安全工作。然而,&#34; layer&#34;是什么并不重要。这就是,只要Spring负责创建bean,对吧?
  • 界面&#34; ArticleService&#34;以上是GWT服务接口。我已经尝试将注释放在那里,但这也不起作用。

如果需要,请参阅上面引用的GWTController类:

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 个答案:

答案 0 :(得分:1)

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

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

spring4gwt这样的东西应该可以正常工作。