1

아무도 도와 줄 수 있습니까?엔티티 프레임 워크 : 사용 권한, 사용자 등에 대한 관계형 모델 도움말

권한 관리를위한 좋은 관계형 모델을 만들려고합니다.

저는 현재 Users 테이블과 Customers, Suppliers와 같은 다양한 테이블을 가지고 있습니다.

사용자는 공급자, 공급자 중 하나에서보기, 편집, 만들기 권한이 필요합니다.

나는 등의 형태 여부를 표시하는 사용자가 액세스하고 날씨가 어떤 결정 EF에서이 테이블을 사용합니다

내가 그 잘못 생각하지만 그것은 dosn't로 내 원래 모델은, 다음과 같이 간다 권한에 대해 언급하십시오.

사용자 UsersCustomers (사용자와 고객 사이의 관계를 포함) UsersSuppliers (사용자 및 공급자 사이의 관계를 포함) 고객 (고객 테이블) 공급 업체 (공급 업체 테이블).

예를 들어 사용자와 고객을 연결하는 것처럼 작동합니다. 단지 옳지 않은 것처럼 보입니다.

나는 사용자 테이블을 링크 할 수있는 Id와 UserId가있는 Permissions라는 중간 테이블을 넣을 생각을하고있었습니다. 그런 다음 사용 권한을 테이블에 연결할 수 있습니다.

Permissions 고객과 고객 간의 관계가있는 고객 (UsersCustomers 대신).

나는 이것이 내가 최적의 디자인을 얻지 못하는 곳이라고 생각한다. 이 디자인이 올바르면 사용자가 고객에게 부여한 권한 유형 (예 : 편집, 만들기 또는보기 만)을 지정하는 표가 누락됩니다.

나는 의견이나 강한 예를 들어보고 싶습니다. 이런 기능을하는 모델. 고객, 공급 업체와 관련하여

이 단지 2 예는, 제비 등 deliveryLocation, accountsLedger 같은 더 테이블이있을 것이다

내가 나에게 모두 표시 "라고 질의를 할 수 있다면 그것은 좋은 것입니다 사용 권한은 사용자 X ", 현재 내 설정과 함께 나는 각각의 중급 테이블을 별도로 쿼리해야 할 것입니다.

저는 이것을 ORM과 유사한 엔티티 프레임 워크를 통해 사용할 것입니다.

관계형 모델의 구조에 약간의 손실이 있습니다.

미리 감사드립니다.

+0

정말로 고객 별 및 공급 업체별 권한을 유지 관리 하시겠습니까? 즉, 사용자가 300 명의 고객과 100 개의 공급 업체에 대한 사용 권한을 가지고있는 경우 사용 권한 테이블에 400 개의 행이 있습니까? 이것은 설치가 어렵고 유지 보수가 어려울 것 같습니다. 다른 방법 (즉,이 사용자는 오하이오 주에있는 모든 고객 또는 sales> $ 1m 등으로 고객을 수정할 수 없습니다)이 아닙니까? –

+0

안녕하세요 Ej, 예 매우 그렇습니다. 그러나 시스템에는 15 개의 고객 (사용자 정의 시스템)과 5 개의 공급 업체 만 포함될 것입니다. 많은 사람들이 없을 것입니다. 그리고 사용자에게 부여 된 권한이 있어야합니다. Customer/Supplier를 통해 특정 일을 할 수 있습니다. – Martin

답변

2

매우 적은 수의 고객과 공급 업체 (총 20 개)를 보유하게되므로 매우 복잡한 시스템이 필요하지 않습니다. 내가 비슷한 상황에서 수행 한 내용을

이 같은 구조의 권한 테이블 설정을 가지고 있습니다 :

  • 사용자 아이디 (사용자 아이디)
  • 역할 ID (역할 테이블에 연결하는 ID와 '고객 편집', '공급 업체 삭제', 고객보기 등)
  • ObjectId가 (이 때문에 어느 공급 업체 ID 또는 고객 ID, 객체는 보안을 원하는 식별 ID 것)

역할 테이블 것이다 :.

  • 이드
  • 이름 (역할의 고유 한 이름, 즉 '편집 고객')

을 (고유 ID는 권한 테이블에 역할 ID 관련) 그런 다음 각 사용자 엔터티는 사용 권한 테이블에 연결되며 각 사용자는 여러 사용 권한을가집니다. 사용자가 로그인 할 때 일반적으로 모든 사용 권한을 메모리 목록에로드하여 사용자에게 사용 권한 목록을 제공합니다. 권한 목록 그냥 ObjectId가, 그리고 RoleName 및/또는 역할 ID를했을 내가 원하는 경우,

protected bool HasPermission(long ObjectId, string RoleName) 
{ 

//Users in the Administrator role have access to everything in the system. 
if (this.IsAdministrator) { 
    HasPermission = true; 
    return; 
} 

foreach (Permission P in Permissions) { 
    if (P.ObjectID == ObjectID & P.RoleName == Role) { 
     HasPermission = true; 
     return; 
    } 
} 
return false; 

} 

다음 (난 당신이 예에서 아래에 볼 수있는 코드를 읽기 쉽도록하기 rolename을 사용하는 경향이있다)

if (myUser.HasPermission(CustomerId, "Edit Customer") { 
    //allow the user to edit the customer 
else 
    //allow the user to only view the customer (for example) 

또는

if (myUser.HasPermission(SupplierId, "Print Supplier") { 
    //allow the user to print the record 
else 
    //give user a warning 

이 열쇠는, 각각의 역할은 '고유해야, 당신은 일반적인을 가질 수있다 : 뭔가의 허가와 같은 사용자가 내가 이런 짓을 했을까 알고 '편집'역할. 동일한 ID를 가진 고객 및 공급 업체가 있고 '수정'권한이 있는지 확인하려면 잘못된 결과가 표시 될 수 있습니다. 그래서 '고객 편집 (Edit Customer)'역할과 '공급 업체 편집 (Edit Supplier Edit)'역할을합니다.

이 솔루션은 잘 확장되지 않지만 보안이 필요한 수십 개의 레코드가있는 데이터베이스의 경우 제대로 작동하고 구현 및 유지 관리가 간단합니다. 또한 실제 관계형으로 설정되지 않습니다. 즉, 사용 권한 테이블의 ObjectId가 공급자 테이블이나 고객 테이블과 관련이 없습니다.

(이 시나리오에서 필자는 내 사용자 객체가 관리자인지 아닌지 알고 있기 때문에 관리자는 권한 설정이 필요하지 않으며 모든 것에 대한 액세스 권한이 있으므로 권한 검색이 필요하지 않습니다. 몇 나노초의 시간 절약)

+0

"이 솔루션은 잘 확장되지 않습니다."비슷한 스케일의 모델이 있습니까? 어쩌면 항목 그룹 또는 다른 역할보다 큰 역할에 대한 사용 권한을 갖고있을 수 있습니까? – sports