2016-07-18 4 views
0

認証に対応するために独自のActionRefinerを作成しようとしていますが、何らかの理由でrefine[A]関数で暗黙の変数を使用できません。Play 2.5のimplicitsの使用ActionRefiner

trait Auth { 
    object AuthenticatedAction extends ActionBuilder[AuthRequest] with ActionRefiner[Request, AuthRequest] { 

    def refine[A](request: Request[A])(implicit userCollection: UserCollection, ex: ExecutionContext): Future[Either[Result, AuthRequest[A]]] = { 
     request.session.get("username") match { 
     case Some(username) => userCollection.findByEmail(username).map { userOpt => 
      userOpt.map(new AuthRequest(_, request)).toRight(Results.Redirect(routes.LoginController.login())) 
     } 
     case None => Future.successful(Left(Results.Redirect(routes.LoginController.login()))) 
     } 
    } 
    } 
} 

class AuthRequest[A](val user: User, request: Request[A]) extends WrappedRequest[A](request) 

Scalaコンパイラは、メソッドrefine[A](request: R[A]): Future[Either[Result, P[A]]]が定義されていないことを通知します。それが登録する暗黙の変数を削除すると、いいえで私を残しますUserCollection ...

したがって、どのように正しくActionRefinerを使用しますか?

+0

これは、暗黙的な引数を追加すると、関数が 'ActionRefiner'の' refine'の抽象定義に一致しなくなるためです。そのため、あなたは「定義されていない」メッセージを受け取ります。 – handler

答えて

0

this topicのおかげで、私はそれを動作させる方法を見つけました。代わりに、暗黙的に使用して、私はトレイトでUserCollectionを定義することができますので、同じように、私のコントローラからそれを渡す:

trait Auth { 
    def userCollection: UserCollection 

    object AuthenticatedAction extends ActionBuilder[AuthRequest] with ActionRefiner[Request, AuthRequest] { 
    def refine[A](request: Request[A]): Future[Either[Result, AuthRequest[A]]] = { 
     ... 
    } 
    } 
} 

class HomeController @Inject()(val userCollection: UserCollection)(implicit executionContext: ExecutionContext) extends Controller with Auth { 
    def index = AuthenticatedAction { implicit request => 
    Ok(s"Hello ${request.user.name}") 
    } 
} 

私はちょうど私が完全にこの忘れ暗黙を使用するので、慣れていました。

関連する問題