2012-07-19 3 views
0

Jquery를 사용하여 내 MVC 응용 프로그램에서 탐색 메뉴를 만들려고합니다. 나는 이것을 위해 http://users.tpg.com.au/j_birch/plugins/superfish/을 사용하고 있습니다.JQuery 탐색 메뉴 권한

그러나 사용자 역할에 따라 메뉴 항목을 표시하고 싶습니다. 즉, 사용자에게 필요한 역할이 없으면 특정 메뉴 항목이 표시되지 않도록 ASP 멤버 자격 인증 논리를 포함하고 싶습니다.

누구든지 진행 방법을 제안 할 수 있습니까?

감사 superfish 이후

+0

내가 잘못 될 수있다 확실하지 오전하지만 메뉴가 표시됩니다 생각하고 doesnot 사용자가 특정 액세스 권한이있는 경우 페이지가 Access denied 페이지로 리디렉션 된 메뉴 항목을 다시 클릭합니다. 제 의견. – freebird

+0

예, 할 수 있지만 사용자가 페이지를 볼 수 없으면 메뉴 항목 자체를 표시하고 싶지 않습니다. 어쨌든 고마워. – gunnerz

답변

2

은 당신이 단지 당신이 서버 측을 정의하는 첫 번째 장소에서 올바른 HTML을 가지고 있는지 확인해야 클라이언트 측 작동합니다.

역할 공급자에 IsUserInRole 및 GetRolesForUser가 있습니다. 이를 사용하여 HTML을 빌드 할 수 있습니다. 예를 들어

:

@if (RoleProvider.IsUserInRole(user.username, "admin")) { 
    <li>Admin<li> 
} 
+0

다른 주석에서 지적한 것처럼 위에서 수행 한 작업이 반드시 가장 효율적인 것은 아니지만 간단하고 명료하며 클라이언트가 절대로 안되는 메뉴 항목을 보지 못하도록합니다. 사용자가 절대로 보지 않아야하는 메뉴 항목이 브라우저에 표시되지 않도록하는 보안 고려 사항 일 수 있습니다. (물론 자바 스크립트를 사용하지 않으면 메뉴가 추악해질 수 있지만 올바른 항목은 계속 남습니다.) IsUserInRole은 일반적으로 캐시 될 것이지만 응답이 캐싱 될 때마다 데이터베이스 조회를 유발하지는 않습니다. –

1

당신은 당신이 하나 개의 테이블이 메뉴를 포함하고 다른 하나는 역할과 함께 메뉴를 매핑합니다, 테이블을 만들 수있는 데이터베이스에서 설정 한 사용자/역할을합니다.

데이터베이스를 쿼리하는 하위 작업을 만들어야 특정 역할의 메뉴 항목을 가져 와서 부분보기를 통해 메뉴를 렌더링 할 수 있습니다. 세션에있는 사용자의 메뉴 항목을 유지할 수도 있으며, 그렇게함으로써 각 요청에 대해 db를 치는 것을 피할 수 있습니다.

메뉴 항목을 숨기면 부분적으로 문제가 해결됩니다. 컨트롤러와 작업을 보호하려면 인증 필터를 사용해야합니다.

1

업데이트 :이 답변은 많은 클라이언트 측 작업을 수행하고 MVC 애플리케이션과 데이터 만 통신하는 경우에 더 적합합니다. 서버의 모든 페이지를 렌더링하는 경우 Steve의 대답을 사용하십시오.

JsonResult를 반환하는 컨트롤러 작업을 사용하여 사용자의 역할을 클라이언트 측에 전달해야한다고 생각합니다. 예 :

public class SecurityController : Controller 
{ 
    public ActionResult Roles() 
    { 
     return new JsonResult 
     { 
      Data = System.Web.Security.Roles.GetRolesForUser(), 
      JsonRequestBehavior = JsonRequestBehavior.AllowGet 
     }; 
    } 
} 

그런 다음 데이터 클라이언트 측을 검색 할 $.ajax를 사용하여 콜백의 요구 사항과 일치하지 않는 DOM에서 노드를 제거합니다. 예 :

<ul id="menu"> 
     <li data-roles="Administrator"> 
      Secured 
     </li> 
     <li>Any</li> 
    </ul> 
    <script type="text/javascript"> 
     $.ajax({ 
      url: "security/roles", 
      success: function(roles) { 
       $("#menu li[data-roles]").filter(function() { 
        var requiredRoles = (this.attr("data-roles") || "").split(","); 
        for (var requiredRole in requiredRoles) { 
         if (roles.indexOf(requiredRole) >= 0) { 
          return false; 
         } 
        } 

        return true; 
       }).remove(); 

       // TODO call your menu plugin here 
       // $("#menu").superfish(); 
      }, 
      error: function() { 
       $("#menu li[data-roles]").remove(); 
      } 
     }); 
    </script> 

건배, 딘