2011-03-03 3 views
0

다른 유형의 사용자에 대해 다른 페이지보기를 만들어야합니다. 나는 이미 여기에서 물었다 : How to create pages with different permissions' views다른 사용 권한보기로 페이지를 만드는 방법

그리고 Aldeel의 대답이 작동하더라도, 그것은 나를위한 최상의 해결책으로 보이지 않는다. 나는 이유를 설명 할게. 나는 여러분 중 일부가 나를 도울 수있을 것입니다 매우 상세하고 hopefuly 필요가 무엇인지 설명하려고합니다

: D

나는 다른보기를 표시해야하지만, 그것은 단지 그런 아니다. 각 사용자는 페이지의 다른 부분에 액세스 할 수 있습니다.

내가 예를 들어주지

:

이 구조 페이지를 'X'상상을

Field A 
Field B 
Field C 
Field D 

그룹 G1 방문 페이지 X 시스템에서 사용자 U1는 해당 그룹의 권한에 대한 DB를 확인하는 경우 페이지 X. 사용자 U1Field AField B을 볼 수 있지만 Field A 만 편집하십시오.

사용자 U2 아니 그룹 방문 페이지 X으로 설정됩니다. 시스템에서 페이지 X에 대한 자신의 권한을 확인합니다. 사용자 U2은 모든 입력란을보고 수정할 수 있습니다.

그룹 G2U3 사용자가 페이지 X을 방문하면 시스템은 해당 그룹의 페이지 X에 대한 사용 권한을 확인합니다. 사용자 U3Field CField D을 볼 수 있지만 수정할 수는 없습니다. 내가 이해하기 쉽게 희망

...

나는 특정 사용자의 허가에 대한 데이터의 많은을 ViewData를 채우는 대신에 할 수있는 방법을 찾을 coudn't. 내 예제에서는 4 개의 필드 만 있지만 현재 프로젝트에서는 20 개 미만의 필드가있는 화면이 없습니다. 그래서 나는 당신이 얼마나 추악하고 생산적이지 않은지를 볼 수있을 것입니다.

내가 말했듯이 아이디어는 소셜 네트워크와 유사합니다 (facebook example). 사용자가 UserX의 페이지를 방문하면 UserX가 허용 한 것을 볼 수 있습니다.

정말 감사드립니다.

감사합니다.

답변

4

당신이하고자하는 것을하기 위해서, 당신은 당신의 견해를 통제해서는 안됩니다. 컨트롤러 속성을 통해이 작업을 수행 할 수 있습니다. 다음과 유사한 내용 :

[Authorize] 
public class MyController { 
} 

이렇게하면 전체 컨트롤러를 보호 할 수 있습니다. 사용자가 인증되지 않으면 해당 컨트롤러 내의 모든 작업이 응답하지 않습니다 (특히 401 응답을 받음). 당신은 아래의 예와 같이 개별 사용자 또는 개별 역할 권한을 부여하여이를 확장 할 수 있습니다 : 귀하의 경우

[Authorize(Users="eestein,JasCav") 
public class MyController { 
} 

[Authorize(Roles="Administrator")] 
public class MyController { 
} 

, 당신은 그것에 인증과 전체 컨트롤러를 갖고 싶어하지 않을 수 있습니다. 음, 훌륭하게 ASP.NET MVC는 동작 수준의 인증 제어를 제공합니다. 따라서 다음 작업을 수행 할 수 있습니다.

public class MyController { 

    public ActionResult Index() { } 

    [Authorize(Roles="Administrator")] 
    public ActionResult Admin() { } 

} 

이 아이디어를 사용하면 사용자가 페이지에서 볼 수있는 것을 제어 할 수 있습니다. 페이지의 여러 측면을로드 할 수 있도록 작업의 일부 페이지를 반환하려고합니다. 예를 들어 일부 일반 데이터와 일부 비밀 데이터를 보여주는보기가있을 수 있습니다. 정상 데이터는 정상 페이지를 통해 반환 될 수 있습니다. 비밀 데이터는 페이지 내에서 부분보기로 반환되어야합니다. 그러나 401이 발생하면이를 처리하고 아무 것도 표시하지 않을 수 있습니다.

매우 간단합니다. .NET 팀은이를 설정하는 작업을 훌륭하게 수행 했으므로 컨트롤러 내에서 개별적으로 사용 권한을 확인할 필요가 없습니다. 도움이되기를 바랍니다. 권한 부여 특성을 사용하는 방법에 대한 자세한 내용은 온라인 검색을 수행하십시오.

업데이트 권한을 제어하는 ​​페이지의 관리자가있는 경우 권한 부여 속성을 설정하는 방법에 대해 현명해야합니다. 여기에서 "역할"은 매우 중요합니다 (위의 예제를 참조하십시오). 예를 들어 관리자가 "John Doe를 SpecialUser 역할에 추가하려고합니다."라고 말하면 John Doe 사용자는 역할이 SpecialUser로 설정된 모든 작업에 액세스 할 수 있습니다 (실제로 그렇다면 시스템에 대한 역할).

분명히 관리자에게이 작업을 수행 할 수있는 방법을 제공해야하며 권한 부여 특성은이를 완벽하게 수행해야합니다. 페이지에 대한 사용 권한을 가진 사용자를 확인하려면 데이터베이스를 쿼리하여 누가 어떤 역할의 일부인지 확인해야합니다. 다음은 설정에 대해 생각할 수있는 방법입니다.

  • 작업의 역할을 제어합니다.
  • 관리자가 해당 역할을 부여받는 사람을 제어합니다.
  • (간단한 쿼리를 통해) 누가 어떤 역할에 할당되었는지 확인할 수 있습니다. 그런 다음 (역할에 대한 지식을 통해) 누가 사이트의 어떤 부분을 볼 수 있는지 볼 수 있습니다.

이 내용이 명확 해지기를 바랍니다. 나는 네가하려는 일이 가능하다고 생각한다.

업데이트 2 예, 여기에는 컨트롤러에 정적 그룹이 있고 모든 새 그룹을 프로그래밍 방식으로 추가해야한다고 가정합니다. 어떤 종류의 유스 케이스가 다른 사용 권한 유형을 즉석에서 만들어야하는지 알고 싶습니다. 남용 가능성이있는 것처럼 보입니다. 어쨌든, 나는 이것을위한 해결책이 없다.

<%= Html.RenderAction("Partial1") %> 
<%= Html.RenderAction("Partial2") %> 

경우 : 작동하는 방법을 일부 전망에 관해서는

은 ... 당신이 뭔가를해야합니다, 당신의 Index.aspx 파일 내부

public class ProductController : Controller 
{ 
    // 
    // GET: /Index/ 
    public ActionResult Index() 
    { 
     return View(); 
    } 

    public ActionResult Partial1() 
    { 
     return PartialView(); 
    } 

    [Authorize] 
    public ActionResult Partial2() 
    { 
     return PartialView(); 
    } 
} 

...이 같은 뭔가 사용자는 두 번째 RenderAction을 처리 할 수있는 권한이 없으므로보기가 표시되지 않습니다. (컨트롤러에서 확인할 수 있습니다.)

희망을 분명히하는 희망! 나는 뛰고있어, 이제 더 이상 확장 할 수 없다.

+0

@JasCav 답변 해 주셔서 감사합니다. 이미 [Authorize] 속성을 사용하고 있습니다. 네가 구체적으로 말한대로는 아니야. 무단 액세스를 방지하기 위해서만 사용하고 있습니다. 그러나 그것이 작동하는 방식을 완전히 이해할 수 없다면 또 다른 문제가 있습니다. 사용 권한은 특정 페이지의 adm에 의해 설정됩니다 (그 이유는 페이스 북의 예를 사용했기 때문입니다). 나는 그가 DB를 확인하는 대신에 다른 사람들이 보길 바라는 것을 볼 방법이 없다. 특정 부분 뷰를 어떻게 반환 할 수 있습니까? 사용자는 필드 a 및 b 또는 c 또는 기타에 대한 권한을 가질 수 있습니다. 당신의 솔루션은이 경우에 효과가 있습니까? 다시 한번 감사드립니다. – eestein

+0

@eestein - 내 솔루션은 올바르게 설정되었다고 가정하고 설명하는 경우 작동 할 수 있습니다. 지금 내 대답에 대한 업데이트를 작성 중입니다. 잠시 후 찾으십시오. – JasCav

+0

@JasCav 감사합니다. 기다릴게요. – eestein

1

"additive"보안을 권장합니다. 사용자의 사용 권한 및 그의 그룹의 사용 권한은 함께 허용되는 일련의 작업을 제공합니다. 권한이 필요한 무언가를 명시 적으로 허락하지 않은 경우, 허락을받지 못합니다. 사용자 U1과 그룹 G1 사이에는 사용자가 필드 A와 필드 B를보고 필드 A를 편집 할 수있는 충분한 권한이 있습니다. 사용자 또는 그룹을 통해 권한이 명시 적으로 부여되지 않았기 때문에 필드 B를 편집하거나 필드 C 및 D를 보거나 편집하려면 해당 권한이 없습니다.

코드 비헤이비어에 사용자와 권한을 나타내는 개체를 허용하는 메서드를 넣어이 유형의 사용 권한을 구현하고 해당 권한을 조사하여 필드의 가시성을 결정합니다. 모든 필드는 보이지 않는 것으로 시작해야하며,이 메서드는 해당 필드를 표시 및/또는 편집 가능하게 만듭니다. 당신이/숨기기 필드를 표시하기 위해 .NET 서버 측 도구를 사용하고 있는지 확인

  • :

    상황이 알고 있어야합니다. 필드의 Visible 속성이 서버 측에서 false로 설정된 경우 렌더링 된 페이지는 해당 필드를 HTML에 포함하지 않습니다. 대조적으로, 스타일을 추가하거나 속성을 모호하게하기 위해 JavaScript를 사용하면 DOM 및 HTML에서 해당 스타일이 유지되므로 "숨겨진 소스"를 통해이 방식으로 숨겨진 필드를 볼 수 있습니다.

  • 클라이언트 측 코드를 사용하여 보안을 구현하지 마십시오. JavaScript, ActiveX 컨트롤 등은 거부되거나 비활성화되거나 조작 될 수 있습니다. 데이터를 표시하는 클라이언트 측 코드는 데이터가 페이지의 소스 어딘가에 있어야하므로 페이지 소스를 보면 매우 쉽게 찾을 수 있습니다.
  • 동일한 토큰으로 편집 할 수없는 필드의 데이터가 변경되지 않는다고 믿지 마십시오. HTML 및 클라이언트 측 코드는 FireBug와 같은 도구로 쉽게 변경할 수 있습니다.
  • 넓은 오픈 액세스로 시작하고 숨기기보다 모든 것을 보이지 않거나 비활성화 한 상태에서 시작하고 표시/설정하게하면 코드가 더 안전 해집니다. 새로운 것을 숨기는 것을 잊어 버리면 모든 갑작스런 고객이 만지지 말아야 할 새로운 분야를 보게됩니다. 권한을 기반으로 새 필드를 표시하는 코드를 추가하는 것을 잊어 버린 경우에도 여전히 수정해야하지만 존재하지 않는 필드를 악용하는 것은 훨씬 어렵거나 불가능합니다.
관련 문제