【问题标题】:Spring Security's @PreAuthorize on type level can not be overridden on method level类型级别上的 Spring Security @PreAuthorize 不能在方法级别上被覆盖
【发布时间】:2011-11-29 21:32:52
【问题描述】:

我正在尝试在类型级别使用@PreAuthorize 注释保护控制器,并尝试通过使用不同的@PreAuthorize 注释某些方法来覆盖该行为。然而问题是,Spring首先评估方法注释(授予访问权限),然后评估类注释(拒绝访问)。

有没有办法颠倒这个顺序?我还想不通。

编辑:

在方法级别,我只想授予非注册用户访问权限:

@PreAuthorize("isAnonymous()")
@RequestMapping(value = "/create", method = RequestMethod.GET)
public String renderCreateEntity(ModelMap model) {
    return userService.renderCreateEntity(model);
}

然而,此控制器的标准应该是只允许经过完全身份验证的用户:

@Controller
@RequestMapping(value = "/user")
@PreAuthorize("isFullyAuthenticated()")
public class UserController { [...] }

在调试单步调试应用时,我看到首先评估 isAnonymous(),然后评估 isFullyAuthenticated(),从而导致授予访问权限并立即再次拒绝访问。

【问题讨论】:

  • 您使用的是哪个版本的 Spring Security?
  • 春天的一切都是 3.0.5.RELEASE

标签: java spring spring-security


【解决方案1】:

感谢您的所有回复。 然而,答案是完全不同的:)

我把这个放在这里以防其他人有同样的问题。

我在 @InitBinder 带注释的方法中注册了一个自定义验证器。在控制器上请求的方法调用之后调用此绑定方法。而且由于这个绑定方法没有用@PreAuthorize注解,所以请求被拒绝了。

解决方案是像这样注释绑定方法:

@InitBinder
@PreAuthorize("permitAll")
public void initBinder(WebDataBinder binder) {
    binder.setValidator(validator);
}

然后,来自我的 OP 的方法调用按预期进行评估。

【讨论】:

    【解决方案2】:

    问题不在于您需要更改授予和拒绝的顺序。问题很简单,方法级别的注释覆盖类级别的注释。

    PrePostAnnotationSecurityMetadataSource Java Doc:

    可以在类或方法上指定注释,并且特定于方法的注释将优先。

    这个逻辑的具体实现在PrePostAnnotationSecurityMetadataSource类的方法findAnnotation中完成。 (不幸的是,这个方法是私有的。)

    所以你可以自己写MethodSecurityMetadataSource,如果你看看PrePostAnnotationSecurityMetadataSource的代码,你就会发现它是多么的容易。

    但最后有一个警告:结束:困难的任务不是重写方法,困难的任务是将新的MethodSecurityMetadataSource“注入”到安全系统中。我相信你不能用 spring 安全命名空间配置来做到这一点,所以你需要通过显式 bean 声明来替换 spring 安全命名空间。

    【讨论】:

    • 我实际上想要方法级别注释来覆盖类级别注释。但是首先评估方法级别注释,然后评估类级别,以便类级别注释实际上覆盖方法的注释。我将在我的问题中编辑一些示例。
    • 根据我的测试,这不再是真的。如果您有一个类级别和方法级别的安全注释(@Secured 或@PreAuthorized),它们都会运行。如果方法级别的注释更严格,这很好。如果限制较少,则它不起作用。我最终将限制较少的方法拆分到另一个控制器中。
    猜你喜欢
    • 2012-06-29
    • 1970-01-01
    • 2010-09-28
    • 2016-08-04
    • 1970-01-01
    • 2015-10-12
    • 2013-11-07
    • 2018-04-06
    • 1970-01-01
    相关资源
    最近更新 更多