2011-10-05 2 views
3

내가 작업하고있는 프로젝트에서 OpenEJB를 EJB를 테스트하기위한 프레임 워크로 사용하고 있습니다. 프로그래밍 방식으로 InitialContext을 생성하고이를 사용하여 트랜잭션 관리자와 다양한 EJB를 얻습니다.OpenEJB에서 프로그래밍 방식으로 내 사용자/역할을 지정하는 방법은 무엇입니까?

그러나 지금 테스트해야하는 EJB에는 @RolesAllowed 주석이 있으므로 OpenEJB는 EJB를 가져 오지 않고 필요한 권한이 없다고 주장합니다.

이 테스트가 시뮬레이트해야하는 사용자와 그와 관련된 역할을 OpenEJB에 어떻게 지정합니까?

답변

5

@RunAs 제안 bkail 언급은 확실히 좋은 방법입니다. 내부 클래스를 포함하지 않는 두 번째 방법은 테스트 케이스에 로그인하는 것입니다.

당신이 OpenEJB를 부트 스트랩하는 경우, 다음과 같이 InitialContext 속성에서 통과/사용자 지정

로그인 방법 :

public void testAsManager() throws Exception { 
    Properties p = new Properties(); 
    p.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.LocalInitialContextFactory"); 
    p.put(Context.SECURITY_PRINCIPAL, "jane"); 
    p.put(Context.SECURITY_CREDENTIALS, "waterfall"); 

    InitialContext context = new InitialContext(p); 

    try { 
     movies.addMovie(new Movie("Quentin Tarantino", "Reservoir Dogs", 1992)); 
     movies.addMovie(new Movie("Joel Coen", "Fargo", 1996)); 
     movies.addMovie(new Movie("Joel Coen", "The Big Lebowski", 1998)); 

     List<Movie> list = movies.getMovies(); 
     assertEquals("List.size()", 3, list.size()); 

     for (Movie movie : list) { 
      movies.deleteMovie(movie); 
     } 

     assertEquals("Movies.getMovies()", 0, movies.getMovies().size()); 
    } finally { 
     context.close(); 
    } 
} 

그리고 아마도 다른 사용자로 다시 테스트 :

public void testAsEmployee() throws Exception { 
    Properties p = new Properties(); 
    p.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.LocalInitialContextFactory"); 
    p.put(Context.SECURITY_PRINCIPAL, "joe"); 
    p.put(Context.SECURITY_CREDENTIALS, "cool"); 

    InitialContext context = new InitialContext(p); 

    try { 
     movies.addMovie(new Movie("Quentin Tarantino", "Reservoir Dogs", 1992)); 
     movies.addMovie(new Movie("Joel Coen", "Fargo", 1996)); 
     movies.addMovie(new Movie("Joel Coen", "The Big Lebowski", 1998)); 

     List<Movie> list = movies.getMovies(); 
     assertEquals("List.size()", 3, list.size()); 

     for (Movie movie : list) { 
      try { 
       movies.deleteMovie(movie); 
       fail("Employees should not be allowed to delete"); 
      } catch (EJBAccessException e) { 
       // Good, Employees cannot delete things 
      } 
     } 

     // The list should still be three movies long 
     assertEquals("Movies.getMovies()", 3, movies.getMovies().size()); 
    } finally { 
     context.close(); 
    } 
} 

사용자 및 그룹 테스트

다음과 같이 구성 할 수 있습니다. 테스트 케이스의 클래스 경로에 users.propertiesgroups.properties 파일을 넣어 사용자 및 그룹을 평가합니다. 받는다는에서 그 다음 위치에있을 것입니다 :

  • SRC/테스트/자원/users.properties
  • SRC/테스트/자원/groups.properties

users.properties 파일처럼 보일 수 있습니다 그래서

등이

joe=cool 
jane=waterfall 

그리고

+0

그래서 LocalInitialContextFactory를 생성하면 스레드 보안 컨텍스트가 설정되고 닫히면 종료됩니다. 흥미 롭 군. 글쎄, 나는 그것이 OpenEJB 예제 페이지에 속해 있다고 생각한다 ;-). –

+0

좋은 생각 같습니다. 나는 직장에서 그것을 시도 할 것이고, 그것이 나의 문제를 해결한다면 당신에게 현상금을 줄 것이다. :) –

+0

그것은 완벽하게 일했습니다. 덕분에 너무 많이! –

1

OpenEJB Testing Security Example을 참조하십시오. 기본적으로 @RolesAllowed가없는 테스트 빈을 통해 간접적으로 사용하지만 두 번째 빈을 호출하기 전에 @RunAs를 사용하여 역할을 전환합니다.

+0

이 예제도 시도해 보겠지만 @ David의 답변은 동일한 테스트에서 인증 메커니즘을 테스트하기 위해 상당히 흥미로운 것으로 보입니다. 나는 당신의 대답 모두 upvote거야 :) –

+0

글쎄, 고마워. David의 대답은 질문이었던 프로그래밍 방식의 로그인을 다루므로 이해가됩니다. –