我对AOP有点新意,对我面临的问题感到困惑。我有一个注释@AuthorizeUser
,它作用于表示层上的方法。我需要检查User是否有权执行该方法。以下是AuthorizeUserAspect
的代码:
@Aspect
public class AuthorizeUserAspect {
@AuthoWired
private UserService service;
@Before(value = "@annotation(com.company.annotation.AuthorizeUser)")
public void isAuthorized(JoinPoint jp) {
// Check if the user has permission or not
// executing some Service Layer services and
// Persistence Layer, corresponding to that
service.checkUser();
// Is there a way I can make this method Conditional. something like:
if ( /* User has permission */ ) {
// do nothing, so the method will be executed after this
}
else {
// 1) Prevent the Method to be executed [and/or]
// 2) Pass some Parameters to the method for checking [and/or]
// 3) Execute another method on that class [e.g showAccessDenied()]
}
}
}
这与这个问题有点类似Spring MVC + Before Advice check security。但它建议返回一些字符串(即“不行”)。我的应用程序中有两种类型的UI(Struts和Jersey),因此会有两种类型的返回类型(分别为String
和Response
)。所以我想这可能不是最好的方法
如果你能告诉我一个解决方法,我会很高兴。
这甚至是一个好方法吗?
答案 0 :(得分:2)
首先,你看过Spring Security了吗?它完全是声明性的,不需要您自己编写方面。如果用户未经过身份验证或没有所需的权限,它会通过抛出异常来保护方法。
关于两种不同返回类型的问题:
第一个选项:创建两种不同的建议,特定于方法的返回类型:
@Before("@annotation(com.company.annotation.AuthorizeUser) && execution(String *.*(..))")
public void isAuthorizedString(JoinPoint jp) {
...
}
@Before("@annotation(com.company.annotation.AuthorizeUser) && execution(Response *.*(..))")
public void isAuthorizedResponse(JoinPoint jp) {
...
}
第二个选项:通过反射找出建议方法的返回类型,并根据该值返回不同的值:
@Before("@annotation(com.company.annotation.AuthorizeUser")
public void isAuthorized(JoinPoint jp) {
Class<?> returnType = ((MethodSignature)jp.getStaticPart()
.getSignature()).getReturnType();
if(returnType == String.class)
...
else
...
}