0

@ServiceクラスにあるSpring@Securedメソッドを、通常の@Controllerクラスを介して呼び出すと、認証は正しく機能しています。

org.xhtmlrenderer.extend.ReplacedElementFactory実装を使用してITextPDFフィルターを介して同じメソッドを呼び出すと、次のスタックトレースが得られます。

org.springframework.security.authentication.AuthenticationCredentialsNotFoundException: An Authentication object was not found in the SecurityContext
    at org.springframework.security.access.intercept.AbstractSecurityInterceptor.credentialsNotFound(AbstractSecurityInterceptor.java:325)
    at org.springframework.security.access.intercept.AbstractSecurityInterceptor.beforeInvocation(AbstractSecurityInterceptor.java:196)
    at org.springframework.security.access.intercept.aopalliance.MethodSecurityInterceptor.invoke(MethodSecurityInterceptor.java:64)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:622)

必要なロールを持たないユーザーはAccessDeniedExceptionを受け取りますが、正しいロールを持つ他のユーザーはまったく問題がないため、セキュリティは明らかに機能しています。

これが私のweb.xmlからのスニペットです:

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter>
    <filter-name>pdfFilter</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
    <filter-name>pdfFilter</filter-name>
    <url-pattern>/reports/pdf/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
</filter-mapping>
<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

これがReplacedElementFactory実装のスニペットです。

@Inject private ImageService imageService;

    @Override
    public ReplacedElement createReplacedElement(LayoutContext ctx, BlockBox box, UserAgentCallback uac, int width, int height) {

        Element el = box.getElement();
        if (el == null) {
            return null; 
        }

        String nodeName =  el.getNodeName();
        if (nodeName.equalsIgnoreCase("img")) {
            String srcAttr = el.getAttribute("src");
            FSImage fsImage;
            try {
                fsImage = getImage(srcAttr, uac);
            }catch(BadElementException ex) {
                fsImage = null;
            }catch(IOException ex) {
                fsImage = null;
            }catch(NullPointerException ex) {
                fsImage = null;
            }

            if (fsImage != null) {
                if (width != -1 || height != -1) {
                    fsImage.scale(width, height);
                }

                return new ITextImageElement(fsImage);
            }
        }

        return null;
    }

private FSImage getImage(String src, UserAgentCallback uac) throws IOException, BadElementException, NullPointerException {
        FSImage fsImage;

        String[] split = src.split("/");
        if (src.contains("image/person/")) {                
            Long id = Long.valueOf( split[split.length - 1] );
            Image img = imageService.getPersonImageByImageId(id);           
            fsImage = new ITextFSImage(com.lowagie.text.Image.getInstance(img.getImage()));

        return fsImage;
    }

これが私のImageServiceクラスメソッドです:

@Secured({"ROLE_MY_ROLE_READ"})
    public Image getPersonImageByImageId(Long imageId) {
        return imageDao.findOne(imageId);
    }

イメージサービスメソッドの呼び出しで失敗が発生します。これは、おそらくセキュリティで保護されており、ReplacedElementFactory実装がセキュリティコンテキストにアクセスできないためですが、認証するにはどうすればよいですか?

投稿は初めてですので、他に必要な点がありましたらお知らせください。

4

1 に答える 1

0

開始するようにセキュリティをどのように構成したかはわかりませんが、それを使用したことがある場合は、フィルターの順序も確認してください。セキュリティフィルターは、pdffilterの前に配置する必要があります。

于 2013-03-21T04:56:55.480 に答える