繁体   English   中英

Spring Security @PreAuthorize打破Jersey @Context UriInfo注入

[英]Spring Security @PreAuthorize breaks Jersey @Context UriInfo injection

我正在构建一个Jersey / Spring RESTful Web应用程序的问题。 我想使用@PreAuthorize注释来保护我的端点。 但是,我需要访问UriInfo,因为我使用查询参数。

一切正常,直到我保护方法,然后突然我的UriInfo为空。 我很确定这与@PreAuthorize如何导致事物成为范围有关 - 不再是在请求级别。

@Component
@Path("/equipment")
public class Equipment
{
    @Context 
    UriInfo ui;

    @PreAuthorize("hasAnyRole('ROLE_ANALYST', 'ROLE_DEVELOPER')")
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public def list() {
        println ui
        return [:]
    }

}

下面的简单类将打印“null”。

如果删除@PreAuthorize注释,则会得到预期的结果 - org.glassfish.jersey.internal.inject.UriInfoInjectee@23b21e3

基于我在其他问题中看到的事情,让我提前说我的应用程序上下文已经有了这一行:

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

授权部分工作正常。 这只是注入UriInfo失败了。

我使用的是Spring 3.1.4和Jersey 2.3。 提供的代码是在Groovy中,但这不是问题。

谢谢您的帮助。

所以,我想出了一个解决方案,让我解决我的问题,我将它留在这里为后代。 答案并不能满足这一切的“原因”,但它确实让我的应用程序正常工作,而且它并不是真正的噱头。

我没有在类级别注入UriInfo,而是在方法级别注入它。 我从这里得到了这个想法。 他们的解释是,如果方法签名可能会被修改,请将其注入其中。 我猜Spring Security正在这样做,但我不明白为什么会破坏在类级注入的东西。

子孙后代的工作代码:

@PreAuthorize("hasAnyRole('ROLE_ANALYST', 'ROLE_DEVELOPER')")
@GET
@Produces(MediaType.APPLICATION_JSON)
public def list(@Context UriInfo ui) {
    ...
}

我遇到了同样的问题,并且已经与它斗争了几个星期了。 但建议的工作对我的用途来说并不实用。

我见过的另一种解决方法是将@PreAuthorize注释向下移动到服务层(或其他一些应用层),而不是直接在其余资源上使用它。 这个解决方案对我来说也不实用,但我想我会把它添加为另一种可能性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM