java - @PreAuthorize 在一个方法上调用但在另一个方法上不调用

标签 java spring spring-security

在我的 spring 配置文件中我有 <global-method-security pre-post-annotations="enabled"/>

在我的 spring @Controller 中,我有一个 @RequestMapping,上面有一个 @PreAuthorize,如下所示:

@PreAuthorize("true == false")
@RequestMapping(value="/image", method=RequestMethod.GET )
@ResponseBody
public ResponseEntity<byte[]> getImage(
        @RequestParam(value="imageSet", required=false) Long imageSetKey
        , @RequestParam(required=false, defaultValue="70") Integer size
        , @RequestParam(required=false) Unit unit
        , @RequestHeader( value="if-none-match", required=false ) String etag 
)
{
    // use the latest and greatest for the unit if they specify the unit, otherwise use the imageSetKey they pass in.
    if ( unit != null )
    {
        return getUnitImage( unit, size, etag );
    }
    // more code to do other stuff
}

现在这个@PreAuthorize 已经过评估并且可以正常工作。如果我在 getUnitImage 方法上放置一个 PreAuthorize,那么它不会被评估,我进入该方法就好了。这是未评估 @PreAuthorize 的方法。

@PreAuthorize("true == false")
public ResponseEntity<byte[]> getUnitImage( Unit unit, int size, String etag )
{
    // do stuff, I get into breakpoints here.
}

想知道为什么 PreAuthorize 会在具有 RequestMapping 的一个方法上调用,但不会在同一类中的其他方法上调用吗?

Spring 3.0.5,Spring Security 3.0.3

最佳答案

这是由 Spring AOP 和 CGLIB 的工作方式引起的。具体来说,创建一个代理类来扩展您的实际类,这就是提供 @PreAuthorize 行为的实现。当您从同一个类调用方法时,它不会通过代理类,因此不会执行所需的行为。

解决这个问题的一种方法是改用 AspectJ,方法是将 mode="aspectj"添加到 Spring 配置中的 global-method-security 元素。

@Transactional 也会发生这种情况,另一个专门关于@Transactional 的问题有关于此问题的更多详细信息:

Spring @Transaction method call by the method within the same class, does not work?

关于java - @PreAuthorize 在一个方法上调用但在另一个方法上不调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8674840/

相关文章:

java - 使用 Java 的 AWS 资源

java - 尝试构建示例 Red5 Secure 项目,但由于某些依赖项而失败

grails - Grails 3.0.1 Spring Security Core返回Gradle构建因错误而终止:编译失败

java - 您可以使用 docusign(Java) 创建页面特定的 anchor 标记吗?

java - Spring MVC url 链接太长,无法容纳在一行中

java - MVC 和带有 Set<> 的对象

java - Spring Security 返回 401/403 而不是将用户重定向到登录页面

java - sql-maven-plugin:清理多个数据库?

java - 无法传递在 "public void actionPerformed(ActionEvent event)"中声明的变量

java - 使用 WebLogic 解析 XML 时出现 ClassCastException