2011-03-23 129 views
10

我在我的Spring MVC控制器定義這個方法:如何JUnit測試@PreAuthorize註釋及其由彈簧MVC控制器指定的彈簧EL?

@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測試我想調用此方法,並確保預授權條件進行驗證。但是當我在一個壞帳戶的JUnit測試中設置用戶主體時,沒有錯誤並且方法完成。似乎這個註釋被繞過了。
但是,當我以正常方式(而不是測試)調用此方法時,PreAuthorize會被驗證。

如果可能的話,如何在junit測試中測試這個註解以及如何在拋出異常時捕獲異常?

謝謝
薩科

+0

只需在PreAuthorize中使用「principal」的其他人員註釋,此操作將失敗並顯示nullpointerexcpetion,並且不會觸發重新授權,除非您在PreAuthorize批註中或security.xml中包含isAuthenticated()的效果。 – chrismarx 2014-02-28 15:34:22

回答

15

既然你想測試通過的Spring 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

你,對於身份驗證來說工作正常,但是如果要測試PreAuthorize註釋中定義的整個Spring EL,我該怎麼做?
Nico 2011-03-23 12:49:56

+0

謝謝,它對身份驗證很有效,但如果我想測試PreAuthorize註釋中定義的整個Spring EL,我該怎麼做?我的意思是如何驗證principal.user.userAccount.userId ==#object.pedago.userId AND#form.id ==#object.id其中#object和#form指定modifyContent方法的變量。有沒有什麼例外可以找到未經驗證的安全性Spring EL? – Nico 2011-03-23 12:55:47

+0

@Nico:已更新。 – axtavt 2011-03-23 13:17:21