2009-08-18 2 views
6

성 Windsor입니다. 컨트롤러 생성자가 사용중인 저장소를 전달할 때 유용합니다. ASP.NET MVC의 권한 부여 특성에 저장소를 전달하는 방법

private IStoryRepository Repository; 
public StoryController(IStoryRepository Repository) 
{ 
    this.Repository = Repository;     
} 

는 지금은 주요 관리자 메뉴를 표시 할 수있는 관리 지역에 액션이있다. 내가 얻을 수있는 방법은 성이 같은 속성 생성자에 저장소를 통과 단지 로그인 한 사용자는 관리자가 (사용자 테이블에서 단지 isAdmin 플래그)

[AdminAuthorize] 
public ActionResult Menu() 

private IStoryRepository Repository; 
/// <summary> 
/// Initializes a new instance of the <see cref="AdminAuthorizeAttribute"/> class. 
/// </summary> 
public AdminAuthorizeAttribute(IStoryRepository Repository) 
{ 
    this.Repository = Repository; 
} 

/// <summary> 
/// Checks if the user is authorised 
/// </summary> 
/// <param name="httpContext">The HTTP context.</param> 
/// <returns> 
/// <c>true</c> if authorized; otherwise, <c>false</c>. 
/// </returns> 
protected override bool AuthorizeCore(HttpContextBase httpContext) 
{ 
    return this.Repository.UserIsAdmin(httpContext.User.Identity.Name); 
} 

있는지 확인하는 사용자 지정 권한 부여 특성을 사용했다 컨트롤러 생성자에 해당합니까?

답변

1

기본적으로 두 가지 옵션이 있습니다. 필터를 프록시로 감싸면 좋은 예가 here입니다.

또는 사용자 지정 필터에서 명시 적 컨테이너 호출을 수행 할 수 있습니다. StructureMap를 사용하여 예를 들어

ObjectFactory.GetInstance(IStoryRepository) 

가 주입을 할 수있는 ActionInvoker을 확장하는 세 번째 방법이있을 수 있습니다하지만이 완료 될 얼마나 확실하지 않다 (I 광범위에는 사용 성이 없다).

0

나는 FluentMVC 프로젝트를 살펴볼 가치가 있습니다. 시작시 특성을 구성 할 수 있고 후드 아래에서 윈저를 사용하기 때문에 쉽게 프라 티트를 주입 할 수 있습니다. 위의 코드는 로그인을 제외한 모든 행동과 홈 컨트롤러 프로젝트의 현재 상태가 있지만, 몇 번 사용하고있는 어떤

확실하지 않음에 AuthorizeAttribute을 추가합니다

FluentMvcConfiguration.Configure = x => { 
           x.UsingControllerFactory(new WindsorControllerFactory());                x.WithFilter<HandleErrorAttribute>(); 
           x.WithFilter<AuthorizeAttribute>(
            Except 
             .For<AccountController>(ac => ac.LogOn()) 
             .AndFor<AccountController>(ac => ac.LogOn(null, null, false, null)) 
             .AndFor<HomeController>()); 
          }; 

예를 들어 꽤 잘 작동합니다 나를 위해.

0

속성은 가로 챌 수 있고 컨테이너에 위임 한 호출로 대체 될 수있는 호출 대신 리플렉션에 의해 생성된다는 점이 문제입니다.

DI를 지원할 수있는 필터를 만드는 데 사용할 수있는 다양한 방법이 있습니다. 가장 간단한 IMHO는 액션 호출자를 확장하고 GetFilters를 재정의하여 속성을 사용하여 필터 유형을 결정한 다음 해당 유형을 해석하는 구현을 제공합니다 컨테이너에서. 이 접근법의 구현은 MvcTurbine (http://mvcturbine.codeplex.com/sourcecontrol/changeset/view/37298?projectName=mvcturbine#758440)에서 볼 수 있습니다.

0

필터 생성자 내부의 정적 팩토리 메소드에서 IRepository 객체를 가져 오지 않는 이유는 무엇입니까? DI가 작업을 수행 할 수 있도록하는 방식으로 팩토리 메소드를 사용하기 만하면됩니다.

DI는 표준 "생성자 매개 변수"방식 대신 "게이트웨이"방식에서 작동합니다.

관련 문제