2017-01-26 1 views
0

스칼라 플레이 애플리케이션에서 Deadbolt를 테스트하고 있습니다. 난 단지 사용자가 projectId이 사용자에 속하는 경우 프로젝트를 얻을 권한을 부여하려면,이 경우매개 변수에 기반한 Deadbolt 인증

def getProject(projectId: Int) = actionBuilder.RestrictAction("user").defaultHandler() { 
    authRequest => 
    //retrieves project 
} 

: 내 컨트롤러 방법은 다음과 같을. 다른보다 복잡한 경우에는 쿼리 문자열 및/또는 게시물 본문에서 여러 개의 매개 변수가 필요합니다.

내가 이해하는 바로는 여기서 매개 변수를 DynamicResourceHandler으로 전달한 다음 각 사례별로 사용 ​​권한을 개별적으로 처리하는 것입니다. 그것은 가능하지만,이 사용 사례에 대해 Deadbolt로부터 좀 더 많은 지원을 기대하고있었습니다. 수신 된 매개 변수를 기반으로 요청을 인증하는 가장 좋은 방법은 무엇입니까?

답변

1

Deadbolt는 개발자를 특정 스타일로 강제하지 않으므로이 경우 meta 인수를 사용하여 제약 조건에 정보를 전달할 수 있습니다. 정의는

object DynamicAction { 

    def apply(name: String, meta: Option[Any] = None): DynamicAction.DynamicActionBuilder = DynamicActionBuilder(name, meta) 

    case class DynamicActionBuilder(name: String, meta: Option[Any] = None) extends DeadboltActionBuilder { 

     override def apply[A](bodyParser: BodyParser[A])(block: AuthenticatedRequest[A] => Future[Result])(implicit handler: DeadboltHandler) : Action[A] = 
     deadboltActions.Dynamic(name, meta, handler)(bodyParser)(block) 
    } 
    } 

그래서 컨트롤러 기능이 얻을 것이다이

def getProject(projectId: Int) = actionBuilder.DynamicAction(name = "checkProject", meta = Some(projectId)).defaultHandler() { 
    authRequest => 
    //retrieves project 
} 

처럼 보일 것입니다 DynamicResourceHandler (나는 이름이 좀 향후 버전에서 변경 될 수 있습니다 싫어 왔어요) 그리고 당신은 metaasInstanceOf를 사용해야합니다이 기능

def isAllowed[A](name: String, 
        meta: Option[Any] = None, 
        deadboltHandler: DeadboltHandler, 
        request: AuthenticatedRequest[A]): Future[Boolean] 

의 구현을 호출합니다.

더 복잡한 요구 사항의 경우 데이터를 어셈블 한 모든 데이터 (예 : 사례 클래스 또는지도)를 meta 인수로 전달할 수 있습니다.

+0

답변 해 주셔서 감사합니다. 그것은 내가 그것을 할 생각이었습니다. 나는 컨트롤러 대신 데드 볼트를 사용하는 방법에 대해서도 읽었지만 매개 변수 값에 바로 액세스하는 것이 더 어려울 것이라고 생각하십니까? – nmat

+0

실제로 - 경로에서는 메타 만 하드 코딩 할 수 있습니다. 또는 URL을 직접 파싱하여 값을 얻을 수도 있지만 이미 상당히 무거워지고 있습니다. –

관련 문제