25.1 AOP Alliance (MethodInvocation) Security Interceptor(AOP联盟(方法定位)安全拦截器)
方法安全性是通过使用MethodSecurityInterceptor来实现的,它保护方法位置的安全。根据配置方法的不同,拦截器可能特定于单个bean,也可能在多个bean之间共享。拦截器使用MethodSecurityMetadataSource实例来获取应用于特定方法调用的配置属性。mapbasedmethodsecuritymetadasource用于存储由方法名(可以是通配符)键入的配置属性,并且当使用< intercept-methods >或< protect-point >元素在应用程序上下文中定义属性时,将在内部使用该属性。其他实现将用于处理基于注释的配置。
25.1.1 Explicit MethodSecurityInterceptor Configuration(显式方法安全接口配置)
当然,您可以直接在您的应用程序上下文中配置一个MethodSecurityIterceptor,用于Spring AOP的代理机制之一:
25.2 AspectJ (JoinPoint) Security Interceptor(AspectJ(连接点)安全拦截器)
AspectJ安全拦截器非常类似于上一节讨论的AOP联盟安全拦截器。事实上,我们将只在这一部分讨论差异。
AspectJ拦截器被命名为AspectJSecurityInterceptor。AOP联盟的安全拦截器依赖于Spring应用程序上下文通过代理来编织安全拦截器,而AspectJSecurityInterceptor则不同,它是通过AspectJ编译器来编织的。在同一个应用程序中使用两种类型的安全拦截器并不罕见,AspectJSecurityInterceptor用于域对象实例安全,而AOP Alliance Methodsecurityinterceptor用于服务层安全。
让我们首先考虑AspectJSecurityInterceptor在Spring应用程序上下文中是如何配置的:
如您所见,除了类名之外,AspectJSecurityInterceptor与AOP联盟安全拦截器完全相同。事实上,这两个拦截器可以共享同一个securityMetadataSource,因为SecurityMetadataSource使用的是java.lang.reflect.Method,而不是一个特定于AOP库的类。当然,您的访问决策可以访问相关的特定于AOP库的调用(即MethodInvocation或JoinPoint),因此在做出访问决策时可以考虑一系列的添加标准(如方法参数)。接下来,您需要定义一个AspectJ方面。例如:
在上面的例子中,安全拦截器将应用于PersistableEntity的每个实例,它是一个未显示的抽象类(您可以使用您喜欢的任何其他类或切入点表达式)。对于那些好奇的人来说,AspectJCallback是必需的,因为process();语句只有在环绕()体内才有特殊意义。当AspectJSecurityInterceptor希望目标对象继续时,它会调用这个匿名的AspectJCallback类。
您需要配置Spring来加载方面,并将其与AspectJSecurityInterceptor连接起来。实现这一点的bean声明如下所示:
就这样!现在你可以在你的应用程序中的任何地方创建你的beans,使用任何你认为合适的方法(例如新的Person();)并且他们将应用安全拦截器。