2012-05-08 14 views
10

Tôi đang sử dụng lò xo Plugin lõi bảo mật (1.2.7) với grails 2.0Làm thế nào để xác thực người dùng chống lại an ninh mùa xuân trong các thử nghiệm đơn vị

Hãy nói rằng tôi có điều khiển với một phương pháp có sử dụng chú thích @Secured.

class ArticleController { 
    def springSecurityService 

    @Secured(['ROLE_PREMIUM_USER']) 
    def listPremium() { 
     render 'premium content' 
    } 
} 

trong thử nghiệm đơn vị của tôi Tôi muốn kiểm tra xem người dùng có vai trò 'ROLE_PREMIUM_USER' có thể xem nội dung của phương pháp listPremium hay không. Tôi có thể làm cái này như thế nào?

Tôi biết rằng nó nên bắt đầu như sau:

@TestFor(ArticleController) 
@Mock([SpringSecurityService]) 
class ArticleControllerTests { 
    void testListPremium() { 
    defineBeans { 
     springSecurityService(SpringSecurityService) 
    } 
     //but how to login the user here in order to see premium content? 

     controller.listPremium() 
     assert response.text() == 'premium content' 
    } 
} 

Tôi không chắc chắn làm thế nào tôi có thể xác thực người dùng hoặc hành động giả để kiểm tra ROLE_PREMIUM_USER. Bất kỳ giúp đỡ?

+0

Hãy xem plugin này: [mùa xuân -security-mock] (http://grails.org/plugin/spring-security-mock) – mpccolorado

+0

thử controller.springSecurityServce.ifAnyGranted ("ROLE _PREMIUM_USER ") bạn có thể phải mở rộng lớp của bạn từ ControllerUnitTestCase – allthenutsandbolts

Trả lời

5

Bạn có thể sử dụng

SpringSecurityUtils.reauthenticate username, null 
+0

Có vẻ như liên kết bị hỏng. –

+1

Có vẻ như họ đã tái cấu trúc mã, tôi đã sửa liên kết – chrislovecnm

4

Chúng tôi tạo ra AuthenticationHelper tùy chỉnh của chúng tôi:

public final class AuthenticationHelper { 

    public static Authentication authenticate(UserDetailsService userDetailsServiceImpl, String userName) { 

     UserDetails userDetails = userDetailsServiceImpl.loadUserByUsername(userName); 

     UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(userDetails, userDetails.getPassword()); 

     UsernamePasswordAuthenticationToken result = new UsernamePasswordAuthenticationToken(userDetails, token.getCredentials(), userDetails.getAuthorities()); 
     result.setDetails(token.getDetails()); 
     Authentication auth = result; 

     SecurityContextHolder.getContext().setAuthentication(auth); 
     auth = SecurityContextHolder.getContext().getAuthentication(); 

     Assert.assertTrue(auth.isAuthenticated()); 

     return auth; 
    } 
} 

Phần quan trọng là:

SecurityContextHolder.getContext().setAuthentication(auth);