0

로그인 페이지를 만들면 로그인 자격 증명을 관리자로 입력하면 액세스 할 수 있습니다. 관리자가 아닌 경우 로그인 페이지로 다시 연결됩니다. 내 데이터베이스에는 부울 유형의 필드가 있습니다.사용자 역할 및 권한

isAdmin <--datatype(byte") 

어떻게하면 가장 좋은 방법일까요?! 나는 단위 테스트를 쉽게하기 때문에 저장소 패턴 방식으로 이것을하고 싶다.

나는 이것을 많이 봤고 문제에 대해 조금 혼란스러워하기 시작했다. 얼마나 많은 수업, 모델 등을 가져야합니까?! 나는 하나의 컨트롤러가 할 것 같아요. 누구든지 좋은 아이디어있어?! 나는 사용자 역할에 대한 DCI 패턴을 읽었지만 기본적으로 데이터베이스의 부울을 확인하는 것은 "과도"일 것입니다. 모든 의견에 감사드립니다.

답변

2

을 시작하기에 좋은 장소입니다. 귀하의 질문에서 귀하는 기본 회원 제공자를 사용하지 않는 것으로 보입니다 (적어도있는 그대로). 나도하지 않았다. 그래서 내가 한 것은 새로운 인증 속성을 만드는 것입니다. 귀하의 경우는 다음과 같이 보일 수 있습니다 : 쿼리가 공급 된 사용자의 ID에 해당하는 부울을 확인하는대로

public class AdminOnlyAttribute : AuthorizeAttribute { 
    IUserRepository _UserRepository; 

    public SimpleUser SimpleUser { get; set; } 

    public AdminOnlyAttribute() { 
     _UserRepository = new SqlUserRepository(new DbContext()); 
    } 

    protected override bool AuthorizeCore(HttpContextBase httpContext) { 
     bool baseAuthorized = base.AuthorizeCore(httpContext); 
     if (!baseAuthorized) { 
      return false; 
     } 

     //Here you use your repository to check if a user is an admin or not 
     bool isAdmin = _UserRepository.IsAdmin(int.Parse(httpContext.User.Identity.Name)); 

     if (!isAdmin) { 
      return false; 
     } 

     return true; 
    } 
} 

저장소 방법 IsAdmin는 간단 수 있습니다. 이런 식으로 뭔가 (SingleOrDefault()이 필요한 아닌지 한 번 확인하시기 바랍니다) : 다음

public bool IsAdmin(int userID) { 
    bool isAdmin = (from user in db.Users 
        where user.ID == userID 
        select user.isAdmin).SingleOrDefault(); 
    return isAdmin; 
} 

그리고 당신과 같이 할 작업이를 사용

[AdminOnly] 
public ActionResult Index(){ 
    //Code here... 
} 

를이 false를 반환하면, 당신의 ActionResult는 것 이론 상으로는 로그인 페이지로 리다이렉트해야하는 HttpUnauthorizedResult.

+0

매우 유용한 피드백에 감사드립니다. 내가 저장소 메소드 IsAdmin이 어떻게 보일 것인가에 대해서는 분명하지 않다.또한 메서드에 반환 형식이 있어야합니다 : public AuthorizeAttribute() – Tim

+0

@Tim 내가 생성자에 실수를했기 때문에 가져 오는 오류가 있습니다. 그것은 AuthorizeRAttribute라고하고 클래스는 AdminOnlyAttribute라고합니다. AdminOnlyAttribute로 변경하면 제대로 작동합니다. 그 방법에 관해서, 나는 나의 대답을 업데이트 할 것이다. –

+0

감사합니다. 그럼 ActionResult에서 나는 사용자가 admin 인 경우 조건부를 수행해야합니까? – Tim

0

isAdmin 열이 조금입니까? 아니면 바이트입니까? 그것은 아마 조금이어야합니다. 자격 증명과 IsAdmin 열을 확인하는 쿼리를 만들면됩니다. 행이 리턴되면 로그인은 성공한 것입니다.

+0

는 그래, 난 당신이 같은 것을 의미하므로 조금 :) – Tim

+0

괜찮다는 다음 경우 (ModelState.IsValid) db.Users 에서 유에서 { var에 userResults의 = 경우 u.UserName == "관리자"는 것을 의미 && u.Password == "password" select u; } – Tim

+0

아니요, Kensai가 IsAdmin 저장소 방법에서 위의 글에서 사용자 이름과 암호를 전달할 수 있다는 것을 제외하고 작성한 것과 같습니다. '공용 사용자 IsAdmin (string 사용자 이름, 문자열 암호) {반환 (db.Users에서 user.username == 사용자 이름 && user.password == 비밀 번호 && user.IsAdmin == 사실 선택 사용자) 사용자 .SingleOrDefault(); }' – bmosh

관련 문제