gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 07:17:06 26 4
gpt4 key购买 nike

在我的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com