Spring安全注解在服务层上不起作用的原因是因为服务层通常是由Spring容器管理的,而Spring安全注解是通过AOP(面向切面编程)实现的。在Spring中,AOP是通过代理来实现的,当一个类被Spring容器管理时,Spring会为该类创建一个代理对象,然后将该代理对象暴露给其他类进行调用。
然而,由于服务层通常是由Spring容器管理的,调用服务层方法的类并不是直接调用服务层的实现类,而是调用代理对象的方法。而Spring安全注解是通过在代理对象的方法上进行拦截和验证的,因此当调用服务层方法时,代理对象并没有被触发,导致安全注解无法起作用。
为了解决这个问题,可以将安全注解放在控制层(Controller)或者Web层上,这样在请求到达控制层时,代理对象会被触发,安全注解也会生效。另外,还可以通过在服务层方法中手动调用安全注解所对应的验证方法来实现安全验证。
总结起来,Spring安全注解在服务层上不起作用的原因是因为服务层通常由Spring容器管理,调用服务层方法时直接调用的是代理对象的方法,而安全注解是通过AOP实现的,需要代理对象被触发才能生效。解决方法是将安全注解放在控制层或Web层上,或者手动调用安全注解所对应的验证方法。
领取专属 10元无门槛券
手把手带您无忧上云