نقاط الربيع AOP التي تطابق التعليق التوضيحي على الواجهة

StackOverflow https://stackoverflow.com/questions/2847640

سؤال

لدي فئة خدمة تم تنفيذها في Java 6 / Spring 3 التي تحتاج إلى تعليق توضيحي لتقييد الوصول حسب الدور.

لقد حددت تعليقًا توضيحيًا يسمى المطلوبة والذي يحتوي على قيم قيمته واحدة أو أكثر من التعداد يسمى OperationType:

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
   }
}

لدي أيضًا تعريف الجانب التالي:

/**
 * 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 ، كل شيء يعمل بشكل جيد ، يتم مطابقة نقطة النقطة ويبدأ الجوانب. ومع ذلك ، أعتقد أن التعليق التوضيحي جزء من عقد الخدمة ويجب نشره مع الواجهة في حزمة واجهة برمجة تطبيقات منفصلة . ومن الواضح أنني لا أرغب في وضع التعليق التوضيحي على كل من تعريف الخدمة والتنفيذ (جاف).

أعلم أن هناك حالات في الربيع AOP حيث يتم تشغيل الجوانب بواسطة التعليقات التوضيحية طرق واجهة واحدة (مثل المعاملات). هل هناك بناء جملة خاص هنا أم أنه من المستحيل خارج الصندوق.

ملاحظة: لم نشرع تكوين الربيع الخاص بي ، حيث يبدو أنه يعمل بشكل جيد. ولا ، هذه ليست أسماء صفي الأصلي أو الأسلوب.

PPS: في الواقع ، إليك الجزء ذي الصلة من تكوين الربيع الخاص بي:

<aop:aspectj-autoproxy proxy-target-class="false" />

<bean class="com.mycompany.aspect.MyAspect">
    <property name="userService" ref="userService" />
</bean>
هل كانت مفيدة؟

المحلول

إذا فهمت أنك تصحح ، فأنت تريد نقطة تجد جميع الطرق في الفصول التي تمتد إلى myservice ويتم شرحها ومع الحجج المفضلة.

أقترح أن تحل محل:

execution(public * com.mycompany.myserviceimpl.*(..))

مع:

execution(public * com.mycompany.myservice.MyService+.*(..))

يتم استخدام علامة Plus إذا كنت تريد نقطة Joinpoint لتتناسب مع فئة MyService أو فئة تمددها.

اتمني ان يكون مفيدا!

نصائح أخرى

Espen ، رمزك يعمل فقط لفئة واحدة:

execution(public * com.mycompany.myservice.MyService+.*(..))

ولكن ماذا لو أردت هذا السلوك لجميع الخدمات في*com.mycompany.services. ** حزمة؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top