这是使用 Spring AOP开发Maksim Demidas的解决方案:
定义“抛出建议”类型的 Spring AOP 建议。它实现接口 Ordered with HIGHEST_PRECEDENCE 以正确集成其他建议,例如@Secured
或@PreAuthorize
public class AccessDeniedExceptionInterceptor implements ThrowsAdvice, Ordered {
public void afterThrowing(AccessDeniedException e) throws GwtAccessDeniedException {
throw new GwtAccessDeniedException();
}
@Override
public int getOrder() {
return HIGHEST_PRECEDENCE;
}
}
在 Spring 上下文文件中,将拦截器定义为 bean:
<bean id="accessDeniedExceptionInterceptor" class="my.interceptor.package.AccessDeniedExceptionInterceptor"/>
在 Spring 上下文文件中,配置安全对象。在此示例中,特定实现的所有公共方法都是安全的:
<!-- Configure global method security for the secured object -->
<security:global-method-security>
<security:protect-pointcut access="ROLE_USER"
expression="execution(public * my.service.package.ServiceImpl.*(..))"/>
</security:global-method-security>
定义服务实现bean:
<bean id="rpcServiceTarget" class="my.service.package.ServiceImpl"/>
为服务定义一个代理,并将其连接到拦截器:
<bean id="rpcService" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces" value="my.service.package.Service"/>
<property name="target" ref="rpcServiceTarget"/>
<property name="interceptorNames">
<list>
<value>accessDeniedExceptionInterceptor</value>
</list>
</property>
</bean>
就是这样。如果您使用代理,您将获得从 Spring 的 AccessDeniedException 到您的自定义 GwtAccessDeniedException 的转换。