2016-08-14 4 views
11

해당 자원의 모든 권한이 부여 된 사용자가 로그인 한 경우에만 자원을 사용할 수 있어야하는 Java 기반 웹 응용 프로그램을 빌드해야합니다. 또한 승인 된 사용자가 로그 아웃하면, 자원을 더 이상 사용할 수 없어야합니다.Java 웹 응용 프로그램에서 협업 인증 구현

자원은

이 요구 사항의 유형을 지원하는 기존의 인증 표준/프로토콜 있는가 (HTML 페이지, PDF 문서, 스프레드 시트 등) 모든 종류의 수 또는 전에서이 구축했습니다 할퀴다?

+2

이미 특정 웹 프레임 워크를 사용하고 있습니까? –

+0

스프링 프레임 워크에 익숙합니다. 이 요구 사항을 지원한다면 다른 프레임 워크로 전환 할 준비가되었습니다. –

답변

1

특정 웹 프레임 워크를 사용하는 데 제약이 없으면 저지에 대한 다음 필터 기반 구현을 자유롭게 시도해보십시오. 저지는 이에 필요한 기본 도구 만 제공하기 때문에 "일괄 인증"논리를 처리하는 데 상당한 양의 사용자 지정 코드를 추가해야하며 전체 개념을 명시 적으로 구현하지는 않습니다. 높은 수준에서 수행 할 수있는 방법은 다음과 같습니다.

class AuthorizationProvider { 

    public void authenticate(ContainerRequestContext requestContext) { 

     // Here you would need to query your database to get the Collection of Users belonging 
     // to the "Collective" Role. You would then check if they are all logged in. 
     // A really abstract version would look like this, assuming you've already queried the DB 
     // and have a reference to the above mentioned Collection. 

     if (collectiveUsers.size == collectiveUsers.stream().filter(User::isLoggedIn).count()) { 
      return true; 
     } 
     return false; 
    } 
} 

class AuthorizationRequestFilter implements ContainerRequestFilter { 

    private final AuthorizationProvider authorizationProvider; 

    @Override 
    public void filter(ContainerRequestContext requestContext) { 

     if (authorizationProvider.authenticate(requestContext)) { 
      // serve whatever it is you want to serve if all required users are logged in 
     } else { 
      // otherwise reject the request 
      requestContext.abortWith(Response 
       .status(Response.Status.UNAUTHORIZED) 
       .entity("Resource available only after collective login") 
       .build()); 
     } 
    } 
} 

@ApplicationPath("/") 
class MyApplication extends ResourceConfig { 

    public MyApplication() { 
     // Register the filter 
     register(AuthorizationRequestFilter.class); 
    } 
} 

이 외에도 로그인 부분도 처리해야합니다. 이러한 특정 사용자에게 집단 역할을 할당하면 로그인 인증을 통과 할 때마다 로그인으로 표시됩니다.

위의 모든 조건이 충족 될 경우, 당신은 성공적으로 모든 "단체"사용자가 로그인 한 경우에만, 당신의 "단체 전용"페이지를 제공 할 수 있어야한다.

이는 부분을 커버 곳 중 한 경우 이러한 사용자 중 로그 아웃하면 데이터베이스에 상태를 저장합니다 (isLoggedIn = false로 집단 사용자 표시). 따라서이 시점부터 누군가가 페이지를 요청할 때마다 Unauthorized가 반환됩니다.

반대로 누군가가 로그 아웃하면 프런트 엔드 부분을 적극적으로 업데이트하기 위해 SSE (Server sent events)를 구현할 수도 있습니다. 이렇게하면 페이지가 이미 이전에 가져 왔더라도 적극적으로 사용할 수 없게됩니다. 참조

컨테이너 요청 필터 소스 및 예컨대,

+0

답변 해 주셔서 대단히 감사합니다. 그것은 나를 도왔고 나는 나의 요구를 성취했다. 불행히도, 나는 몇 가지 이유로 내 솔루션을 게시 할 수 없습니다. –

+0

도움이 되니 기쁩니다! 조금 늦을지라도 위의 하나 또는 위의 것을 허용 된 것으로 표시하십시오. 건배! –

+0

답변이 자동 선택되고 이에 따라 현상금이 수여되기를 바랍니다. –

4
해당 리소스의 모든 허가 된 사용자가 로그인되어있는 경우에만 자원을 사용할 수 있어야한다. 또한

jersey docs, 어떤 권한이있는 사용자가 로그 아웃 할 경우, 자원 어느 누구도 더 이상 사용할 수 없습니다.

사용자에게 리소스에 대한 액세스 권한을 부여하면이 사용자는 PDF 문서, 이미지, 오디오 파일이든 상관없이 스크린 샷을 다운로드/저장/기록 할 수 있습니다. 나는 당신이 만들고자하는 것의 맥락과 목표를 알지 못하지만, 어쨌든 그것이 안전하지 않다는 것을 알아야합니다.

이 고려 사항을 제쳐 놓고도 실시간 솔루션이 필요합니다. 사용자가 리소스가 포함 된 페이지를로드하면 수정 권한을 숨기거나 거부 할 수 있어야합니다. 즉, 클라이언트 측에서 WebSockets 또는 Ajax Polling과 같은 것을 사용하여 프론트 엔드가 서버가 모든 필수 사용자가 온라인이 아니라고 간주하고 리소스에 대한 액세스가 "거부"되어야한다고 생각하게해야 함을 의미합니다. 그러나 이것이 클라이언트 쪽 코드이기 때문에 쉽게 변경하거나 변경할 수 있으므로 보내는 요청은 사용자가 쉽게 차단할 수 있으므로 다시 한번 이 안전하지 않습니다.

여기서 약간의 컨텍스트를 제공하고 해결하려는 문제를 설명하는 것이 좋습니다. 왜냐하면 해결할보다 합리적인 해결책이 가장 많기 때문입니다.

"리소스 소유자"가 모두 온라인이 아니라면 수정 권한을 거부하는 것일 경우 서버 측에서 수정 작업이 이루어 지므로 더 쉽게 수행 할 수 있습니다. 이 경우 웹 소켓을 사용하는 솔루션을 쉽게 구현할 수 있지만 이러한 일을하는 라이브러리 또는 프레임 워크를 알지 못합니다. 가장 가능성이 높습니다.

+0

답변 해 주셔서 대단히 감사합니다. 그것은 나를 도왔고 나는 나의 요구를 성취했다. 불행히도, 나는 몇 가지 이유로 내 솔루션을 게시 할 수 없습니다. –

+0

기꺼이 도와 드리겠습니다! 내 대답이 당신의 문제를 해결했다고 생각하면 동의하십시오. 그렇지 않으면 당신이 질문에 던진 현상금이 사라집니다. – christophetd

+0

죄송합니다. 아래 게시물은 또한 나를 도왔습니다. 너의 것 또는 아래의 것을 받아 들일 지 혼란 스럽다. –

관련 문제