2014-10-16 81 views
0

我实现了认证行动之前的作品,并把它在每一个方法开始在我的控制器 def addFile(itemId: Long) = AuthenticatedAction.async(FSBodyParser(itemId)){ request => ...BodyParser认证行动

然后我根据MultipartFormData

def FSBodyParser(itemId:Long): BodyParser[MultipartFormData[Future[BaseFileInfo]]] = { 
    multipartFormData(Multipart.handleFilePart { 
     case Multipart.FileInfo(partName, filename, contentType) => 
     //println(s"FileInfo($partName, $filename, $contentType)") 
     getIteratee(1, itemId, filename, contentType) 
    }) 
    } 
实现我自己的身体解析器

我发现我的文件首先上传,然后验证操作检查用户是否有效。我想检查用户身份验证的拳头,然后才保存上传的文件。

你有什么想法如何实现这个最好的方式?可能使用Play过滤器进行身份验证?

回答

0

我如下(使用EssentialAction)

def authenticate(): Future[Option[Long]] = { 
    // here we should pass correct user id 
    Future.successful(Some(421)) 
    } 

    def Authenticated[A](action: Action[A]) = EssentialAction{ rh => 
    Iteratee.flatten(authenticate() map{ 
     case Some(userId) => action(rh) 
     case None => Done(Results.Unauthorized) 
    }) 
    } 

//this is method of my service 
//Authenticated is called before FSBodyParser starts working 
def addFile(itemId: Long) = Authenticated{ 
    Action.async(FSBodyParser(itemId)){ requestHeaders => 
     ItemRepository.addFile(1, itemId, null) map(fileId => Ok) 
    } 
    } 
实现了它