【问题标题】:How to implement annotation based security using Spring AOP?如何使用 Spring AOP 实现基于注解的安全性?
【发布时间】:2013-07-29 14:36:57
【问题描述】:

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

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

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

我的问题是。方面实施。

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

【问题讨论】:

标签: java spring aop aspectj spring-el


【解决方案1】:

我知道这是一个迟到的答案,但是在我们将一些 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 中传递了一个包含所有参数的方法。检查客户端是否有权获取用户组。如果不是:抛出我们的异常并且方法停止。

【讨论】:

  • 我遇到了同样的问题——如何通过使用 AOP 只为授权用户授予对 rest api 方法的访问权限——换句话说,如何使用方面不仅用于日志记录,还用于安全目的。因此,如果您在方面抛出异常,那么您将阻止访问,但您的系统将不会返回有意义的 http 状态。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-13
  • 1970-01-01
  • 1970-01-01
  • 2015-03-25
  • 2012-01-15
  • 1970-01-01
  • 2017-02-20
相关资源
最近更新 更多