2013-07-01 4 views
1

나는 테이블 사용자, 역할 및 rolePrivilegesASP.NET MVC 역할 기반 권한은

사용자 ID 사용자 이름 암호 역할 ID] 값으로 ASP.NET MVC4 웹 응용 프로그램이 있습니다 1 USER1 12345 3, 2 사용자 2 12345 1 3 사용자 3 12345 2

[역할 ID, rolename] 값 : 1 관리, 2 클라이언트 게스트 3, 4 ...

[역할 ID, 액션, GrantAcce SS] 값 : 1/홈/인덱스 Y 1/홈/설정 Y 1/홈/대시 Y 2/홈/인덱스 Y 2/홈/설정 N 2/홈/대시 Y 3/홈/색인 Y 3/홈/설정 N 3 N 내가 ASP.NET MVC 폼 인증에 다음을 달성하고자하는

/홈/대시 보드 :

컨트롤러 액션 동적으로 부여해야 액세스가 거부 사용자가 액세스 권한을 부여받지 않은 컨트롤러 동작에 액세스하려고하면 응용 프로그램에서 로그 아웃해야합니다.

1) 나는 또한 할 필요가 사용자 특정 설정이)

이 작동하지 않습니다]) 권한 부여 등의 rolename (역할 = "admin"을 하드 코딩 때문에 이것을 달성하는 가장 좋은 방법을 알고 싶어요 사용자 로그인에 초기화, asp.net 양식에서 이것은 세션 변수에 저장되었습니다 동일한 asp.net에서 TempData를 사용하여 수행 할 수 있습니다 MVC는 이것이 가장 좋은 방법인가요?

답변

2

역할 대신 역할 그룹을 기반으로 작업 필터를 만들 수 있습니다. 역할 그룹은 1 대 다수 관계로 데이터베이스에 저장 될 수 있습니다. (즉, 1 그룹에는 많은 역할이 있음). 그런 다음 작업 필터에 그룹 이름을 입력하십시오.

public class RoleGroupFilterAttribute : ActionFilterAttribute 
{ 
    public string GroupName { get; set; } 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     string [] users = new string[] {}; 
     string [] roles = new string[] {}; 

     // get the roles/users for the group from your db or storage 
     // below is an example only 
     roles = mydb.RoleGroups.Where(r=>r.Name == GroupName).Select(r=>r.Roles).ToArray(); 

     var user = filterContext.HttpContext.User; 
     var userRoles = Roles.GetRolesForUser(); 

     if (!roles.Any(r => userRoles.Contains(r)) && !users.Contains(user.Identity.Name)) 
     { 
      // return a not found result or redirect to an action 
      filterContext.Result = new HttpNotFoundResult(); 
     } 
    } 
} 

사용하려면 단순히 역할 페이지를 관리하기위한 관리 페이지를 만들면됩니다. 컨트롤러 나 액션에 필터를 추가하는 것은 매우 쉽습니다.

[RoleGroupFilter(GroupName="MyGroup")] 
public ActionResult Index() 
{ 
    return View(); 
} 

위의 예에서 사용자를 역할 그룹에 추가하는 것도 허용되었지만 그 선택이 가능합니다.

+0

그룹이 데이터베이스에서 미리 정의된다는 의미입니까? – user2537609

+0

그래서 문자열 action = filterContext.RouteData.GetRequiredString ("action");을 사용하여 사용자에 대한 작업이 나열되어 있는지 확인하십시오. – user2537609

+0

예, 데이터베이스의 그룹을 미리 정의해야합니다. – nerdybeardo