2010-04-01 19 views
13

की टिप्पणियां कैसे प्राप्त करें मैं वसंत/एओपी और एनोटेशन के साथ घोषणात्मक सुरक्षा को कार्यान्वित करना चाहता हूं। जैसा कि आप अगले कोड नमूने में देखते हैं, मेरे पास एक अनुशंसित विधि निष्पादित करने की अनुमति देने वाले को परिभाषित करने के लिए पैरामीटर "अनुमत रोल" के साथ प्रतिबंधित एनोटेशन है।वसंत एओपी: सलाह दी गई विधि

public Object checkPermission(ProceedingJoinPoint pjp) throws Throwable { 

    Signature signature = pjp.getSignature(); 
    System.out.println("Allowed:" + rolesAllowedForJoinPoint(pjp)); 
      ... 
} 

private Restricted rolesAllowedForJoinPoint(ProceedingJoinPoint thisJoinPoint) 
     { 
      MethodSignature methodSignature = (MethodSignature) thisJoinPoint.getSignature(); 
      Method targetMethod = methodSignature.getMethod(); 

      return targetMethod.getAnnotation(Restricted.class); 
     } 

विधि ऊपर हमेशा अशक्त रिटर्न (कोई एनोटेशन बिल्कुल पाए जाते हैं):

@Restricted(allowedRoles="jira-administrators") 
     public void setPassword(...) throws UserMgmtException {    
       // set password code 
       ... 
     } 

अब, समस्या यह है कि मेरी सलाह में मैं परिभाषित एनोटेशन के लिए कोई उपयोग कर सकते है है। क्या इसका कोई आसान समाधान है?

मैंने AspectJ एजेंट का उपयोग करने के बारे में कुछ पढ़ा लेकिन मैं इस एजेंट का उपयोग न करना पसंद करूंगा।

उत्तर

13

मुझे लगता है कि @Restricted आपकी एनोटेशन है। यदि ऐसा है, तो सुनिश्चित करें कि आपके पास यह है:

@Retention(RetentionPolicy.RUNTIME) 

आपकी एनोटेशन परिभाषा में। इसका मतलब है कि एनोटेशन रनटाइम पर बनाए रखा जाता है।

+0

धन्यवाद एक बहुत, कि कारण था। – hugri

2

आप Spring Security का उपयोग क्यों नहीं करते? यह लागू करने और उपयोग करने के लिए एक संक्षिप्त बात है, मैं वास्तव में पहिया को पुनर्जीवित करने में समय बर्बाद करने में बिंदु नहीं देखता हूं।

+0

धन्यवाद, मैं इसे जल्द ही देखूंगा – hugri

4

यहां तक ​​कि अवधारण नीति बदलने जैसे Bozho इस कॉल उल्लेख किया पाने के लिए के बाद एनोटेशन रिटर्न शून्य:

targetMethod.getAnnotation(Restricted.class); 

मैं क्या पाया आप एनोटेशन बाध्य करने के लिए है। इंटरफेस को देखते हुए इस तरह घोषित किया जाता है:

@Retention(RetentionPolicy.RUNTIME) 
public @interface Restricted { 
    String[] allowedRoles(); 
    } 

सलाह की आवश्यकता होगी इस तरह की घोषणा की:

 @Before("@annotation(restrictedAnnotation)") 
     public Object processRequest(final ProceedingJoinPoint pjp, Restricted restrictedAnnotation) throws Throwable { 
        String[] roles = restrictedAnnotation.allowedRoles(); 
        System.out.println("Allowed:" + roles); 
     } 

यह क्या करता है विधि हस्ताक्षर, restrictedAnnotation में पैरामीटर के लिए एनोटेशन बाध्य कर रहा है। जिस हिस्से के बारे में मुझे यकीन नहीं है वह यह है कि यह एनोटेशन प्रकार कैसे प्राप्त करता है, ऐसा लगता है कि यह पैरामीटर पर आधारित है। और एक बार आपके पास एनोटेशन हो जाने पर आप मूल्य प्राप्त कर सकते हैं।

2

Whith स्प्रिंग AOP अगर आप MyManagerImpl implements MyManager की तरह एक स्थिति pointcut interface विधि को लागू किया जाता है तो MethodSignature विधि MyManager पर परिभाषित है कि किसी भी टिप्पणी नहीं है वर्णन करता है। इसे ठीक करने के लिए मुझे मिला एकमात्र तरीका jp.getTarget() ऑब्जेक्ट की कक्षा का निरीक्षण करना और संबंधित विधि को पुनर्प्राप्त करना है।

27

जो भी अभी भी समस्या है रनटाइम पर एनोटेशन प्रतिधारण बदलने के बाद, आपको एक ही समस्या हो सकती है: getMethod() कार्यान्वयन कक्षा के बजाय इंटरफ़ेस विधि देता है। इसलिए, यदि आपके पास कक्षा में आपकी टिप्पणियां हैं तो स्वाभाविक रूप से इंटरफ़ेस विधि पर नोट्स() को शून्य मिल जाता है।

निम्नलिखित समाधान इस समस्या का समाधान:

final String methodName = pjp.getSignature().getName(); 
final MethodSignature methodSignature = (MethodSignature)pjp.getSignature(); 
Method method = methodSignature.getMethod(); 
if (method.getDeclaringClass().isInterface()) { 
    method = pjp.getTarget().getClass().getDeclaredMethod(methodName, method.getParameterTypes());  
} 

और यदि आप चाहें तो आप भी यहाँ इंटरफेस एनोटेशन से निपटने का विकल्प है।

कुछ और टिप्पणी यहाँ उपलब्ध है: getting template method instance from ProceedingJoinPoint

ओलेग

+0

हाय, भविष्य में बहुत धन्यवाद! –

संबंधित मुद्दे