2

Spring Pre/Postメソッドのセキュリティアノテーションを機能させることができないようです。このトピックに関連するすべてのstackoverflowの質問を読みました。主な提案は、セキュリティで保護したいBeanと同じコンテキストでglobal-method-securityが有効になっていることを確認することです。次のdispatcher-servlet.xmlがあります。

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

    }

}

saveメソッドのアノテーションは機能しません。いくつかの重要な注意事項:

  • 私はGWTを使用していますが、私が読んだことから、それはそれほど重要ではないはずです。
  • 別の同様のプロジェクトでメソッドセキュリティが完全に機能しています。唯一の違いは、他のプロジェクトにDAOレイヤーがあり、このプロジェクトには存在しないことです。アノテーションセキュリティが機能しているのはこのレイヤーです。ただし、SpringがBeanの作成を担当している限り、これがどの「レイヤー」であるかは問題ではありません。
  • 上記のインターフェース「ArticleService」は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);
    }

}
4

1 に答える 1

1

Spring Securityによって提供されるセキュリティの側面は、SpringFrameworkプロキシベースのAOPサポートのすべての制限を継承します。特に、アスペクトはオブジェクトの「内部」で発生する呼び出しには適用されません(AspectJウィービングを使用しない限り)。7.6.1AOPプロキシについてを参照してください。

したがって、このようにセキュリティの側面を使用する場合は、外部からサービスを呼び出すGWT統合メカニズム、つまりサービスの拡張を必要としないメカニズムを使用する必要がありますRemoteServiceServlet

spring4gwtのようなものは正常に動作するはずです。

于 2012-05-21T19:17:26.210 に答える