2012-02-24 3 views
1

현재 JBoss 5.0에서 실행되는 공통 서비스에 액세스하는 여러 웹 응용 프로그램이 있습니다. 이 서비스는 Guice와 POJO를 사용하여 매우 간단합니다. 웹 응용 프로그램은 인증을 받았으며 사용자가 누구이며 역할이 무엇인지 알 수 있습니다. 서비스를 호출 할 때 어떻게이 인증 정보를 서비스에 전달해야합니까?Java의 응용 프로그램 계층간에 주체/주체/역할을 어떻게 전달해야합니까?

간단한 접근 방식은 인터페이스에 매개 변수를 추가하여 사용자 정보를 가져 오는 것입니다. 가능하게 주제. 그러나 이것은 현재 진행중인 작업과 관련이없는 상황 별 정보로 인터페이스를 혼란시키는 단점이 있습니다.

void doSomething(Subject subject, ...) { 
} 

내가 본 대안은, ThreadLocal를 저장을 사용하여 전화를하기 전에 거기에 사용자 정보를 넣어 서비스를 사용할 수있는 몇 가지 유틸리티 클래스를 통해이 액세스 할 수 있도록하는 것입니다. 이것은 인터페이스를 정리하지만 호출하기 전에 서비스 클라이언트가 사용자 정보를 설정해야한다는 사실을 숨 깁니다.

다른 방법이 있습니까? 나는 AOP가 여기에서도 사용할 수 있다는 느낌을 갖지만 어떻게 볼 수는 없다. 제가 실종시킨 "모범 사례"가 있습니까? EJB가 도움이 될까요?

+0

난 이후이 문제를 해결 [아파치 시로 (http://shiro.apache.org)을 가로 질러왔다. 방법을 잘 모르지만 그럴 수 있습니다. – pauli

답변

1

이렇게하면 인터페이스를 정리하지만 서비스의 클라이언트가 전화를 걸기 전에 사용자 정보를 설정해야한다는 사실을 숨 깁니다.

사실,하지만 응용 프로그램에서 특정 메서드에 무언가를 전달해야하는 경우 종속성 삽입을 사용하는 목적을 상실하게됩니다. 많은 서비스와 객체를 다른 서비스와 객체 등에 전달할 필요가 없기 때문에 필요한 모든 것을 가지고 생성됩니다.

다른 방법이 있습니까? 나는 AOP가 여기 사용의 일지도 모른다는 느낌을 받는다. 그러나 꽤 볼 수 없다. "모범 사례"가 있습니까 실종 됐습니까? EJB가 도움이 될까요?

이렇게하는 다른 방법은 Subject/User가 필요한 서비스를 호출하는 모든 Servlet에 단일 필터를 사용하는 것입니다. 필터에 사용자를 설정하고 try-finally 블록의 끝에 사용자를 지 웁니다. 사실 OWASP Esapi은 ThreadLocalUser를 설정할 때이 스타일을 사용하기 때문에 사용자가 응용 프로그램의 모든 부분에서 사용할 수 있습니다. 이 같은

뭔가 :

@Singleton 
public MyUserFilter extends FilterOfTheMonth { 

    private final Provider<Authenticator> authProvider; 

    @Inject 
    MyUserFilter(Provider<Authenticator> auth) { 
     this.authProvider = auth; 
    } 

    public void doFilter(ServletRequest request, ServletResponse response, 
      FilterChain chain) throws java.io.IOException, ServletException { 
     try { 
      // Authenticate and SET the current user utilizing the request and/or      
      // session objects 
      authProvider.get().authenticateUser(HttpRequest currentRequest); 

      // Continue on here along the servlet chain 
      ... other processing 
     } finally { 
      authProvider.get().getRidOfCurrentUser(); 
     } 
    } 
} 
+0

맞아요, 의존성 주사가 갈 길입니다. 나는 웹 애플 리케이션과 서비스 전반에 걸쳐 그것을 이미 사용하고있다 - 그러나 두 가지는 완전히 분리되어있다. 그래서 당신이 제안한 것을하기에는 아주 간단하지 않다. 내 생각에 필자가 제안한 것과 같은 인증 공급자에게 DI를 제안한 다음 impl을 사용하여 내 로컬 정보 저장소를 설정/액세스합니다. 이것은 DI'ed 인증 공급자를 사용하기 때문에 서비스에서 숨길 수 있습니다. – pauli

+0

네 말이 맞아. Owasp ESAPI는 현재 DI를 사용하는 API를 만들려고합니다.나는 AuthImpl의 다른 모든 것들이 쓰레드에 안전하다는 것을 확인하고, 그 상태 저장 Singleton을 사용할 때 Scope-Widening Injection의 위험에 대해 잊지 않는다. 행운을 빕니다. – oberger

0

인증 프로세스를 공용 서비스로 옮길 생각이십니까? 그런 다음 요청이 오는 사용자에 대한 모든 정보를 식별하기 위해 공통 서비스에서 세션 ID 만 필요합니다.

관련 문제