2011-03-23 10 views
10

मैं अपने वसंत MVC नियंत्रक में इस विधि द्वारा निर्धारित किए गए:JUnit कैसे एक @PreAuthorize एनोटेशन और वसंत एमवीसी नियंत्रक द्वारा निर्दिष्ट अपने वसंत ईएल परीक्षण करता है?

@RequestMapping(value = "{id}/content", method=RequestMethod.POST) 
@PreAuthorize("principal.user.userAccount instanceof T(com.anonym.model.identity.PedagoAccount) AND principal.user.userAccount.userId == #object.pedago.userId AND #form.id == #object.id") 
public String modifyContent(@PathVariable("id") Project object, @Valid @ModelAttribute("form") ProjectContentForm form) { 
    .... 
} 

तब मेरे JUnit परीक्षण में मैं इस विधि कॉल और सुनिश्चित करें कि PreAuthorize हालत सत्यापित किया गया है करना चाहते हैं। लेकिन जब मैंने अपने जुनीट परीक्षण में उपयोगकर्ता के प्रिंसिपल को खराब खाते से सेट किया है तो कोई त्रुटि नहीं है और विधि पूरी हो जाती है। ऐसा लगता है कि एनोटेशन को छोड़ दिया गया है।
लेकिन जब मैं इस विधि को सामान्य तरीके से (परीक्षण नहीं) कहता हूं, तो प्री-प्राधिकरण सत्यापित होता है।

यदि यह संभव है, तो जूनिट टेस्ट में इस एनोटेशन का परीक्षण कैसे करें और अपवाद को कैसे पकड़ें यदि यह एक फेंकता है?

धन्यवाद,
निकोलस

+0

प्री-प्राधिकरण में "प्रिंसिपल" का उपयोग करने वाले अन्य लोगों के लिए बस एक नोट, यह एक nullpointerexcpetion के साथ असफल हो जाएगा, और जब तक आप या तो प्रमाणीकृत() या तो पूर्व प्राधिकृत एनोटेशन में या security.xml – chrismarx

उत्तर

15

आप स्प्रिंग AOP के माध्यम से कार्यान्वित सुविधाओं का परीक्षण करना चाहते हैं के बाद से, आप आवेदन संदर्भ के खिलाफ परीक्षण चलाने के लिए Spring TestContext ढांचे का उपयोग करने की आवश्यकता है।

abstract-security-test.xml:

<security:authentication-manager alias="authenticationManager"> 
    <security:authentication-provider user-service-ref = "userService" /> 
</security:authentication-manager> 

<security:global-method-security pre-post-annotations="enabled" /> 

<bean id = "userService" class = "..." /> 

AbstractSecurityTest.java:

@ContextConfiguration("abstract-security-test.xml") 
abstract public class AbstractSecurityTest { 
    @Autowired 
    private AuthenticationManager am; 

    @After 
    public void clear() { 
     SecurityContextHolder.clearContext(); 
    } 

    protected void login(String name, String password) { 
     Authentication auth = new UsernamePasswordAuthenticationToken(name, password); 
     SecurityContextHolder.getContext().setAuthentication(am.authenticate(auth)); 
    } 
} 

अब आप इसे अपने परीक्षण में उपयोग कर सकते हैं:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(...) 
public class CreatePostControllerSecurityTest extends AbstractSecurityTest { 
    ... 

    @Test 
    @ExpectedException(AuthenticationCredentialsNotFoundException.class) 
    public void testNoAuth() { 
     controller.modifyContent(...); 
    } 

    @Test 
    @ExpectedException(AccessDeniedException.class) 
    public void testAccessDenied() { 
     login("userWithoutAccessRight", "..."); 
     controller.modifyContent(...); 
    } 

    @Test 
    public void testAuthOK() { 
     login("userWithAccessRight", "..."); 
     controller.modifyContent(...); 
    } 
} 

तो फिर तुम कम से कम सुरक्षा विन्यास के साथ एक आधार परीक्षण बनाने

+0

धन्यवाद में किसी भी प्रमाणीकरण() के प्रभाव में कुछ शामिल नहीं करते हैं आप, यह प्रमाणीकरण के लिए ठीक काम करता है, लेकिन अगर प्री-प्राधिकृत एनोटेशन में परिभाषित पूरे स्प्रिंग ईएल का परीक्षण करना चाहते हैं, तो मैं कैसे करूँ?
Nico

+0

धन्यवाद, यह प्रमाणीकरण के लिए ठीक काम करता है, लेकिन अगर मैं पूर्व प्राधिकृत एनोटेशन में परिभाषित पूरे स्प्रिंग ईएल का परीक्षण करना चाहता हूं, तो मैं कैसे करूँ? मेरा मतलब है प्रिंसिपल.user.userAccount.userId == # object.pedago.userId और # form.id == # object.id को सत्यापित करने के लिए, जहां #object और #form संशोधित सामग्री के चर निर्दिष्ट करता है। क्या एक असत्यापित सुरक्षा स्प्रिंग ईएल को पकड़ने के लिए कोई अपवाद है? – Nico

+0

@ निको: अपडेटेड। – axtavt

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