1

假设我有两种方法

 @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_USER权限访问 MethodA,我也不会收到拒绝访问异常。它应该像那样工作还是我做错了什么。

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

4

1 回答 1

2

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

但最重要的是,当外部调用者调用您的方法之一时,会发生以下情况:

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

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

As such, you need to protect your each entry point with the @Secured annotation that's appropriate for it, and whatever it calls internally.

于 2012-08-23T04:36:10.690 回答