2012-11-30 6 views
6

사용자가 액세스 할 수있는 모든 리소스 목록을 검색하는 권장 방법은 무엇입니까?인증 서비스 - 인증 된 리소스 목록 반환

필자가 보아온 많은 예에서 인증은 개별 서비스에 배치됩니다. 개별 서비스에 사용할 수있는 isAuthorized()와 유사한 메소드를 제공하는 인증이 종종 있습니다 ("사용자가 리소스 ABC ? ") 및 대량 쿼리 ("사용자는 다음 리소스 목록 중 하나를 사용할 수 있습니까? "). 인증 로직가 인증 서비스에 존재하는 동안

집행 권한 부여 정책의은 응용 프로그램 자체 (내 유지 예를 들어, 실제로 결과에 따라, 리소스에 대한 액세스를 구현하기위한 비즈니스 로직 계층 권한 부여 서비스의 결과에 따라 개별 옵션을 표시/숨기기위한 표현 계층).

예를 들어, 내 데이터 액세스 레이어가 잠재적으로 수십억 개의 "리소스"를 반환 할 수있는 경우이를 선호하는 방법은 무엇입니까? 비즈니스 로직 계층은 모든 데이터를 쿼리 (네트워크를 통해 모든 데이터 전달) 한 다음 거대한 목록을 권한 부여 서비스 (네트워크를 통해 다시 전달)를 통해 "허용/거부"목록의 거대한 목록 만 가져옵니다. 비즈니스 논리로 되돌려 보내겠습니까? 분명히 그 말이 맞지 않을 것입니다.

데이터 액세스, 인증 논리 및 비즈니스 논리를 "깨끗하게"구분할 수없는 경우입니까? 대신 사용자가 액세스 할 수있는 모든 리소스의 목록 만 나에게 반환하도록 데이터 액세스 계층에 요청해야합니다.이 리소스는 단순한 데이터베이스 조인으로 구현 될 수 있지만 누가 데이터를 액세스 할 수 있는지를 결정하는 논리를 필요로합니다 (예 : 인증 정책)이 데이터 액세스 코드에 내장되어있는 어떤 리소스에 대한 액세스 권한을 가지므로 해당 정책이 내 코드 기반으로 확산됩니다 (예 : 일부 인증 논리가 내 데이터 액세스 레이어, 일부는 내 권한 부여 레이어에 있을까요?)?

성능이 "깨끗한"아키텍처보다 우수 할 수도 있지만 더 좋은 방법 일 수 있습니까?

+0

내가 작업하고있는 대규모 레거시 앱을 사용하는 비슷한 수수께끼에 직면하고 있습니다. "큰 결과 세트"시나리오는 까다롭기 때문에 sJhonny가 암시하는 것과 같이 문제가 아닌 것으로 생각합니다. ** 모든 ** 레코드의 결과 세트가 좋은 디자인은 아니지만 레코드 수 또는 페이지 수 (그리고 좋은 디자인 *) *를 제공하려는 경우에도 여전히 문제가 발생합니다. 데이터 계층이 다른 기술 (예 : SQL 저장 프로 시저)을 기반으로 구현되는 경우 더욱 어려워집니다. 승인 로직을 복제하는 것에 동의하더라도 다른 언어로되어 있습니다! – Snixtor

답변

0

나는 당신의 질문에 확실한 대답이 없어,하지만 난 어떤 pointers-

  • 당신이


    내 비즈니스 로직 계층 쿼리를 모두합니까 물어 제공 할 수 있습니다 그 데이터를 누른 다음 승인 서비스에 거대한 목록을 전달에만 "허용/거부"의 거대한 목록을 얻으려면 비즈니스 로직에 보냈지?

글쎄, 그게 나에게 일어날 가능성이있는 시나리오 같지는 않습니다. 모두 사용자에게 사용 가능한 레코드를 표시하려는 상황을 생각해 볼 수 있습니까? 이러한 레코드 (유형, 날짜 등)를 추가로 필터링하는 것이 더 합리적이지 않습니까? 아마도 사용자가 한입 크기 결과 집합을 얻을 수 있도록 페이지를 페이지에 배치해야 할 것입니다.
  • 가 만과 서비스의 레코드 '식별자를 통과 할 것 대부분 사실이 추가,이 방법은 당신을 위해 행할 것을 알 수 있습니다.

  • 인증 논리를 '서비스'로 사용한다고해서 반드시 다른 기계에 있어야한다는 의미는 아닙니다. 별도의 논리 모듈로 구현하고 동일한 시스템에서 실행되도록 할 수 있습니다 (원하는 경우 응용 프로그램과 동일한 프로세스에서 가능할 수도 있음). 따라서 네트워크 트래픽 문제를 피할 수 있습니다.

  • 데이터 액세스의 일부로 권한 부여를 구현하는 것이 까다로울 수 있다는 관찰에 따르면 그러나이를 지원하는 인프라 도구가 있습니다. 예를 들어, 오라클의 virtual private database, (n)hibernate filters 등이 있습니다.

다시 말하지만,이 완전한 대답 아니지만, 그들은 당신을 위해 작동하는 솔루션으로 당신을 이끌 수 있습니다.
Google의 인증 프레임 워크 + [가장 좋아하는 프로그래밍 언어] '라고 제안하고 싶습니다.'; 나는 누군가가 이미 이전에 그것을했다고 확신합니다 :)

0

나는 실제적인 경험에 근거한 것이 아니라 초기 관점에서 그럴듯한 배아 아이디어를 가지고 있습니다.

인증 서비스가있는 이유는 무엇입니까? 데이터 소스가 완전한 작업을 수행하지 못하기 때문에이 서비스의 일부 기능이 있다고 주장합니다. 우리가 RDBMS 데이터베이스 만 데이터 소스로 사용한다면 데이터베이스는 주요 인증 범주를 공격 할 수 있습니다. 뷰에 대해 작업하고 뷰에 액세스 할 수있는 권한을 부여하여 테이블 및 열을 원하는대로 보호 할 수 있습니다. 그런 다음이 종류의 규칙이 남아 있습니다.

직원에 대한 급여 정보는 a)에 표시 할 수 있습니다. 직원, b). 관리자 및 두 번째 라인 관리자, c). HR 보수 팀 구성원. 그것은 표현되지

can This employee see That employee's salary? 

:

나는 그런 권한 부여 규칙이 사업의 의미를 가지고 있고, 최고의 인증 서비스 구현 및 해당 서비스의 발현은 비즈니스 오브젝트의 측면에 있다고 생각 테이블, 행 및 열을 포함하지만 거친 비즈니스 의미있는 세분성을 제공합니다. 이를 구현하려면 권한 부여 규칙을 표현하는 데이터 모델을 작성해야하며, 엄격히 말해 비즈니스 로직이라고 말하면 구현을 캡슐화하기 위해 권한 서비스에 대해 리팩터링하는 것뿐입니다.

뷰, 테이블 및 열의 관점에서 표현 된 세분화 된 엔티티 권한과 대조됩니다. 내 주장은 이것이 데이터 소스에 적절하게 속해 있으며 데이터 소스가 데이터 소스를 구현할 수 없거나 구현하지 못한다면 데이터 액세스 레이어에 구현해야합니다. DAO는 자신이 사용하는 뷰/테이블을 "알고"있으며 아마도 요청이 실행중인 사용자를 대신하여 ID를 알고 있으므로 액세스가 허용되는지 여부를 결정합니다.

DAO는 SQL을 가지고있어 엔티티를 알고 있으므로 결정할 수 있습니다. (예, 일부 백엔드에는 SQL이 없을 수도 있지만 DAO는 검색중인 내용을 이해하는 객체입니다.) 주어진 사용자에 대해 허용되는 액세스 메소드를 나열하는 메소드로 풍부해질 수 있습니다.

CustomerDAO.whatIsAuthorised("joeCoder") => READ, QUERY 

CustomerDAO.whatIsAuthorised("phb") => READ, QUERY, UPDATE 
1

인증은 외부화하는 것이 좋습니다. 권한 부여는 종종 외부화에 너무 많은 응용 프로그램에 의존합니다. 작은 시스템에서는 작동 할 수 있습니다. 그러나 큰 시스템의 경우 이미 예상대로 스케일링 문제가 발생합니다.

또 다른 것은 거대한 데이터 세트를 반환하고 있습니다. 이것이 내게보고하는 것이 더 나은 것으로 보인다. 비즈니스 프로세스에서 집중된 데이터가 필요하고 대량 데이터와 추상화를보고해야하기 때문에 서로 다른 요구 사항을 가진보고 모듈과는 별도로 첫 번째 프로세스 모듈을 분리하십시오.

인증은 계층이 아닙니다. 그것은 하나의 측면입니다. 적어도 적절한 mock으로 대체하지 않으면 응용 프로그램이 레이어 없이는 작동하지 않을 수 있습니다. 하지만 애스펙트를 제거하면 애플리케이션을 실행하는 데 문제가 없어야합니다. 프로그램에서 아무 것도 기록하지 않거나 볼 수있는 것보다 많은 데이터를 볼 수는 있지만 여전히 작동합니다.

승인은 응용 프로그램 도메인에서 외부화해야합니까? 비즈니스 로직과 분리되어야합니까? 예. 적절한 메커니즘 : Aspects (AspectJ, Proxy-Pattern, Template-Class-Pattern). 이것은 나의 일반적인 제안이다.

비즈니스 프로세스의 "거대한 데이터"에 대한 나의 특별한 제안은 다음과 같습니다. 도메인 모델을 적절하게 분할하여 데이터를 집중시키지 마십시오 (주제 "사용성"또는 "사용자 경험"). 그런 다음 제 제안으로 돌아가십시오.

비즈니스 프로세스에서 엄청난 양의 데이터를 처리해야하는 경우 : "Make It Work Make It It Right Fast"를 사용하십시오. 느린 속도로 진행될 것으로 예상되는 특별한 데이터 요청에 대한 최적화라고 생각하십시오. 이 경우 특별한 SQL 쿼리, 프리 로딩, 캐싱 등을 사용하십시오. DAO-Layer는 DAO-Layer의 적절한 위치, 캐싱 측면 또는 최적화 측면 일 수 있습니다. 빠른.

내가 제안한 제안은 일반적인 비즈니스 사용 사례를 참조하십시오. 큰 데이터 나보고에 대해 말하는 것이 아닙니다. 언급했듯이이 분야는 다른 요구 사항을 가지고 있습니다.