2011-03-23 12 views
10

Benim Bahar MVC denetleyicisi bu yöntemi tanımladığınız: JUnit, bir @PreAuthorize açıklamasını ve bir yay MVC Denetçisi tarafından belirtilen yayı EL'yi nasıl test eder?

@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) { 
    .... 
} 

Sonra benim JUnit testinde bu yöntemi çağırın ve ön provizyon durum doğrulandı sağlamak istiyorum. Ama JUnit testimde kullanıcı sorumlusunu kötü bir hesapla ayarladığımda hata yok ve yöntem tamamlandı. Ek açıklama baypas edilmiş gibi görünüyor.
Ancak bu yöntemi normal bir şekilde (test etme) aradığımda, Yetkilendirildi doğrulanır.

Mümkünse, bu açıklamanın bir deneme sınavında nasıl test edileceği ve eğer bir tane atarsa ​​istisnanın nasıl yakalanacağı.

sayesinde

+0

Ön Yetkilendirme'de "asıl" kullanan diğer kişiler için bir not, bu bir nullpointerexcpetion ile başarısız olur ve isAuthenticated() ya PreAuthorize ekinde veya security.xml – chrismarx

cevap

15

Eğer Spring AOP aracılığıyla uygulanan özellikleri test etmek isteyen yana
Nicolas, uygulama bağlamında karşı testler Spring TestContext çerçevesini kullanmak gerekir.

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

Artık testlerde kullanabilirsiniz:

@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(...); 
    } 
} 

Sonra asgari güvenlik yapılandırmasıyla ilgili bir taban testi oluşturmak

+0

içinde bir şey eklemediğiniz sürece bir yeniden yetkilendirme tetiklemez. siz, kimlik doğrulaması için iyi çalışır, ancak Ön Yetkisizlik notunda tanımlanan tüm Spring EL'yi test etmek isterseniz, nasıl yapabilirim?
Nico

+0

Teşekkür ederim, kimlik doğrulaması için iyi çalışıyor, ancak Ön Yetkisizlik notunda tanımlanan tüm Spring EL'yi test etmek istersem, nasıl yapabilirim? Principal.user.userAccount.userId == # object.pedago.userId AND # form.id == # object.id öğesinin nasıl doğrulanacağı. ChangeContent yönteminin #object ve #form değişkenlerini göstermesi. Doğrulanmamış bir güvenlik için Bahar EL'yi yakalamak için bir istisna var mı? – Nico

+0

@Nico: Güncellendi. – axtavt