【问题标题】:Spring security- Method level security doesn't work on calling from another methodSpring security-方法级安全性不适用于从另一个方法调用
【发布时间】:2012-08-23 12:36:10
【问题描述】:

假设我有两种方法

 @Secured("ROLE_ADMIN")
 @RequestMapping(value = "/methodA", method = RequestMethod.GET)
 public void MethodA(){
 // code
 }

另一个调用第一个方法的方法

@RequestMapping(value = "/MethodB", method = RequestMethod.GET)
public void MethodB(){
MethodA();
//code
}

如果我使用权限 ROLE_USER 登录应用程序并尝试访问 URL /methodA,我会收到拒绝访问异常 - 完美!但是,如果我访问 URL /methodB,即使我使用 ROLE_USERauthority 访问 MethodA,我也不会收到拒绝访问异常。它应该像那样工作还是我做错了什么。

PS:这不是一个实时应用场景,但我只是在玩代码。

【问题讨论】:

标签: java spring spring-mvc spring-security


【解决方案1】:

这是因为 Spring Security 通过代理您的安全类来工作。这意味着它在您现有的类周围放置了一个包装器。如果使用基于接口的代理,这可以是 java.lang.Proxy,也可以是 cglib 增强子类。不过,我不想在这里过分深入。

但底线是,当外部调用者调用您的方法之一时,会发生这种情况:

调用者--->代理--->安全拦截器--->实现类

安全拦截器检查注释并确定要应用的安全性。然而,一旦你在实际的实现类中,你只是调用方法而不涉及代理和安全拦截器,因此没有安全检查。

因此,您需要使用适合每个入口点的 @Secured 注释以及它在内部调用的任何内容来保护您的每个入口点。

【讨论】:

  • 是的,我明白了。但只是出于好奇,从逻辑上讲这是对的吗? Spring Security 不应该尝试阻止它吗?
  • 并非如此。保护来自外部调用者的入口点对我来说是有意义的,而不是来自班级内部。 Spring 可以做这种事情(因为它是在基于 Java 的配置功能中完成的),但我不确定你是否可以让 spring security 开箱即用。
  • 如果你使用 AspectJ 作为代理机制,而不是 Spring AOP,那么它也应该适用于内部调用。
猜你喜欢
  • 2012-11-13
  • 1970-01-01
  • 2019-02-05
  • 2021-12-15
  • 2012-01-01
  • 2011-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多