역할에 의한 액세스를 제한하기 위해 주석이 필요한 Java 6/Spring 3에서 구현 된 서비스 클래스가 있습니다.인터페이스에서 주석과 일치하는 Spring AOP pointcut
I는 그 값이 열거라고 OPERATIONTYPE에서 하나 개 이상의 특성 값으로 가지는 주석이라고 RequiredPermission 정의한 :
public @interface RequiredPermission {
/**
* One or more {@link OperationType}s that map to the permissions required
* to execute this method.
*
* @return
*/
OperationType[] value();}
public enum OperationType {
TYPE1,
TYPE2;
}
package com.mycompany.myservice;
public interface MyService{
@RequiredPermission(OperationType.TYPE1)
void myMethod(MyParameterObject obj);
}
package com.mycompany.myserviceimpl;
public class MyServiceImpl implements MyService{
public myMethod(MyParameterObject obj){
// do stuff here
}
}
I 또한 다음의 화면 정의 가지고
/**
* Security advice around methods that are annotated with
* {@link RequiredPermission}.
*
* @param pjp
* @param param
* @param requiredPermission
* @return
* @throws Throwable
*/
@Around(value = "execution(public *"
+ " com.mycompany.myserviceimpl.*(..))"
+ " && args(param)" + // parameter object
" && @annotation(requiredPermission)" // permission annotation
, argNames = "param,requiredPermission")
public Object processRequest(final ProceedingJoinPoint pjp,
final MyParameterObject param,
final RequiredPermission requiredPermission) throws Throwable {
if(userService.userHasRoles(param.getUsername(),requiredPermission.values()){
return pjp.proceed();
}else{
throw new SorryButYouAreNotAllowedToDoThatException(
param.getUsername(),requiredPermission.value());
}
}
을 매개 변수 개체에는 사용자 이름이 들어 있으며 메서드에 대한 액세스를 허용하기 전에 사용자에게 필요한 역할을 조회하려고합니다.
MyServiceImpl의 메소드에 어노테이션을 추가하면 모든 것이 잘 작동하고 포인트 컷이 일치하며 애스펙트가 시작됩니다. 그러나 어노테이션이 서비스 계약의 일부이며 인터페이스가 게시되어야한다고 생각합니다. 별도의 API 패키지 그리고 분명히, 주석을 서비스 정의와 구현 (DRY)에 두는 것을 좋아하지 않을 것입니다.
애스펙트가 하나의 인터페이스 메소드 (예 : 트랜잭션)에 의해 트리거되는 Spring AOP의 경우가 있음을 알고 있습니다. 여기에 특별한 문법이 있나? 아니면 상자 밖에서는 불가능한 일이다.
추신 : 봄철 설정을 게시하지 않았습니다. 정상적으로 작동하는 것 같습니다. 그리고 아니요, 그것들은 원래의 클래스도 메소드 이름도 아닙니다.
PPS : 나는 당신이 올바른 이해한다면
<aop:aspectj-autoproxy proxy-target-class="false" />
<bean class="com.mycompany.aspect.MyAspect">
<property name="userService" ref="userService" />
</bean>
그래서, 내가 제대로 이해한다면, 당신은 원래의 질문에 대해 볼 수있는 가장 좋은 방법 (즉,에 주석을 가진 인터페이스는 구현에 포함되지 않음)는 서비스 공급자 인터페이스의 전체 패키지를 일치시킨 다음 ProceedingJoinPoint에서 인터페이스의 메서드 주석을 찾기 위해 인트로 스펙 트하는 것입니다. 그게 가능한가? 이것은 대단한 스레드이며 동일한 질문으로 새로운 것을 시작하고 싶지 않습니다! 감사!! – espinchi
@espinchi 실제로 저는 인터페이스에서 구현 된 클래스로 모든 주석을 복사하고 인터페이스의 모든 메소드를 검사하고 동일한 주석을 구현하는 클래스를 구현하는 rigurus unit 테스트를 실시하여 매우 실망했습니다. 정확히 AOP가 아니야, 나도 알아. 나는 그것이 안정적으로 작동하지 않는다고 말하고 싶지만, 결국은 –