2011-04-08 6 views
2

나는이 질문을 조용하게 오래하고 여기에서 군중의 지혜를 구할 생각을했습니다.검색 값을 저장하는 가장 좋은 방법

내 응용 프로그램에는 10 개의 사용자 역할이 허용됩니다. 그것의 ASP.NET MVC2 응용 프로그램. 각 제어기 메소드는 특정 사용자 역할에 의해서만 액세스 될 수 있습니다.

이것을 구현하기 위해 UserRoleType Enum을 만들었습니다.

public enum UserRoleType 
{ 
     SystemAdministrator = 1, 
     SeniorLevelExecutive = 2, 
     SeniorManager = 3, 
     JuniorManager = 4, 
     SeniorAdmin = 5, 
     JuniorAdmin1 = 6, 
     JuniorAdmin2 = 7, 
     SeniorAppraiser = 8, 
     JuniorAppraiser = 9, 
     SeniorResearch = 10 
} 

이 값은 데이터베이스 (UserRole 테이블이 10 개 행)의 내용과 일치합니다.

또한 사용자의 UserRoleId는 [User] 테이블에 저장됩니다. 사용자가 로그인하면 우리는 데이터베이스에서 사용자의 roleId를 가져 와서 위의 열거 형과 일치시킵니다. 예를 들어 사용자의 roleId가 4 인 경우 주니어 관리자임을 의미합니다.

이 응용 프로그램은 현재 생산되지 않습니다. 내가 볼 수있는 단점은 사용자 역할 유형 테이블의 값이 어떤 이유로 열거 형과 일치하지 않을 때 우리가 살면 우리가 큰 어려움에 처하게 될 때입니다. 대안은 무엇입니까? 또는 데이터베이스에 일치하는 값이 있는지 확인하는 데 집중해야합니다. 어떤 도움을 주시면 감사하겠습니다.

고맙습니다.

답변

0

간단한 방법의 응답은 UserRole 테이블에 이름 필드를 추가 할 수 있으며, 응용 프로그램 시작시, 당신의 열거 반복 ID로 UserRole 것을 찾아 볼 것 , 이름이 UserRoleType.ToString()과 일치하는지 확인하십시오. 주요 코드를 변경하지 않고도이 기능을 구현할 수 있어야합니다.

private void VerifyUserRoles() 
{ 
    foreach (UserRoleType role in Enum.GetValues(typeof(UserRoleType))) 
    { 
     string dbName = /* SELECT Name FROM UserRole WHERE UserRoleId = (int)role */; 
     if(role.ToString() != dbName) throw new Exception(); 
    } 
} 

더 복잡한 방법은 열거 형을 전혀 사용하지 않는 것입니다. 롤의 목록을 데이터베이스로 완전히 구동하려면 UserRoleType을 전용 생성자가있는 클래스로 만들고 데이터베이스 읽기를 수행하여 객체 목록을 만듭니다. (이 패턴의 이름이 무엇인지는 모르지만 그 패턴이 무엇인지는 모르겠다.) 분명히 이것은 기존 코드에 대한보다 중요한 변화 일 것입니다.

public class UserRole 
{ 
    static List<UserRole> roles = new List<UserRole>(); 

    static UserRole() 
    { 
     foreach (/* SELECT * FROM UserRole */) 
     { 
      roles.Add(new UserRole(...)); 
     } 
    } 

    private UserRole(...){...} 

    // Permissions that the role consists of. 
    private bool CanEditEverything { get; private set; } 

    // Use this whenever you need to display a list of UserRoles. 
    public static ReadOnlyCollection<UserRole> AllUserRoles { get { return roles.AsReadOnly(); } } 

    // If you still need to explicitly refer to a role by name, rather than 
    // its properties, do these and set them in the static constructor. 
    public static UserRole SystemAdministrator { get; private set; } 
} 
+0

자세한 답변을 주셔서 감사합니다. 그것은 도움이 !! – user629161

1

내 생각에, DB 및 구성 파일에서 자신의 구성을 신뢰할 수 없다면 어쨌든 개울입니다. DB 레코드의 값이 자동 생성 행 ID가 아닌 특정 열 값으로되어 있는지 확인하십시오.

+0

글쎄, 내 구성을 신뢰할 수 있지만 최선의 방법으로 구현하고 싶습니다. 따라서 누군가가 "설정이 올바른지 확인하십시오"이외의 것을 알고 있다면이 게시물에 회신 해주십시오. – user629161

+2

또한 프로젝트에 대한 통합 테스트를 만들고 열거 형의 각 값에 대해 DB에 동일한 값이 들어 있는지 확인하십시오. 그런 다음 최소한 환경과 DB가 일치하는지 확인해야합니다. – Tejs

1

RoleID 값이 Enum의 범위에 있지 않으면 사용자를 기록하지 마십시오.

관리자에게 이메일을 보내 문제를 해결할 것입니다.

0

나는 이것을한다.하지만 제약 조건 설명이 열거 형을 가리 키도록 DB에 적절한 제약 조건을 추가한다.

0

열거 형과 같은 정적 데이터 구조를 사용하여 테이블과 같은 동적 요소의 요소를 모델링해야하는지 확신하지 못합니다. UserRole 엔터티 클래스와 UserRoleCollection 컬렉션 클래스를 갖는 것이 더 좋지 않습니까? 그렇게하면 사용자 역할 집합이 좀 더 동적 일 수 있습니다. 물론 코드에서 이러한 데이터 구조를 사용할 때마다 알 수없는 사용자 역할이 발생하면 특정 리소스에 대한 액세스가 항상 거부되는 오류 방지 메커니즘을 구축해야합니다. 물론 알 수없는 역할이 어떻게 든 데이터베이스에 입력되면 코드는 설명적인 메시지를 생성합니다.

+0

예. 그게 더 좋습니다. "새 사용자 추가"에서 데이터베이스에서 사용자 역할을 채우는 경우 내 질문에 기분을 상하게하려면 그러나 모든 사용자 요청의 유효성을 검사하고 있습니다.이 사용자 역할에이 컨트롤러 메소드에 대한 액세스 권한이 있는지 여부. 이를 위해 로그인 된 사용자 역할을 세션에 저장하고 사용자 역할이 Enum에도 존재하는지 확인합니다. 사용자가 admin이거나 그렇지 않은 경우 모든 요청에 ​​대해 데이터베이스를 조회하는 것은 좋지 않을 수 있습니다. – user629161

관련 문제