如何使用Spring AOP实现基于注释的安全性?

时间:2013-07-29 17:20:17

标签: java spring aop aspectj spring-el

我是Spring AOP的新手(和AOP一般),需要实现以下内容:

@HasPermission(operation=SecurityOperation.ACTIVITY_EDIT, object="#act")
public Activity updateActivity(Activity act)
{
   ...
}

@HasPermission是我的自定义注释,用于标记所有需要预授权的方法。我正在使用基于Apache Shiro的自定义安全检查实现。一般来说,我想我需要定义与所有带注释的方法匹配的切入点,并提供方面的实现(在之前或之前)。

我有的问题是。方面实施。

  • 如何从注释中提取操作对象参数?
  • 如何在对象定义中解析SpEL表达式并将对象作为'act'参数传递?

1 个答案:

答案 0 :(得分:0)

我知道这是一个迟到的答案,但在我们将一些JavaEE项目迁移到Spring之后,我们基于 AspectJ 制作了一些基本的安全模型:

首先,我们使用自定义 @OperationAuthorization 注释我们的服务方法:

@OperationAuthorization
public ListOfUserGroupsTo getUserGroupsByClientId(Integer clientId) throws GenericException {
    return userGroupRepository.getAllUserGroupsForClient(clientId);
}

然后我们有一个 @Aspect & @Component 注释拦截具有特定注释的方法:

@Aspect 
@Component
public class AuthorizationAspect {

@Autowired
AuthorizationService authorizationService;

@Before(value = "@annotation(ch.avelon.alcedo.authorization.annotations.OperationAuthorization)")
public void before(JoinPoint joinPoint) throws Throwable {
    Object[] args = joinPoint.getArgs();
    Method method = ((MethodSignature) joinPoint.getSignature()).getMethod();

    authorizationService.checkOperationAuthorization(method, args);
}

AuthorizationService 中,传递包含所有参数的方法。检查客户端是否有权获取用户组。如果不是:抛出我们的异常并停止方法。