Spring安全性 – 方法级安全性不适用于从另一个方法调用
假设我有两种方法
@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
ROLE_USER
,我将获得访问被拒绝的exception – 完美! 但是,如果我访问URL /methodB
即使我使用ROLE_USER
权限访问MethodA,我也不会获得访问被拒绝的exception。 是应该像那样工作还是我做错了什么?
PS:这不是一个实时应用场景,但我只是在玩代码。
这是因为Spring安全性通过代理您的安全类来工作。 这意味着它为您现有的类提供了一个包装器。 如果使用基于接口的代理,则可以是java.lang.Proxy,也可以是cglib增强的子类。 我不想在这里过分重视。
但最重要的是,当外部调用者调用您的一个方法时,会发生以下情况:
调用者—>代理—>安全拦截器—>实现类
安全拦截器检查注释并确定要应用的安全性。 但是,一旦你进入实际的实现类,你只是在没有代理和安全拦截器的情况下调用方法,因此没有安全检查。
因此,您需要使用适合它的@Secured注释以及内部调用的任何内容保护每个入口点。