2014-02-17 79 views
0

我正在開發一個應用程序,我想限制對資產的訪問。我創建了附加文件夾Play框架 - 資產認證

secret/ 

它保存數據。然後,我創建了路線

/media/secret/*file  controllers.Media.file(file) 

和控制器媒體

public class Media extends Controller 
{ 
@Authenticate 
public Result file(String file) 
{ 
    String path = /home/foo/secretpath/ 
    File f = new File(path, file); 
    if(!f.exists()) 
    { 
     return notFound(); 
    } 

    return ok(f, true); 
} 

這有點兒工作,唯一的問題是不存在的Etag或高速緩存控制。檢查Assets.scala實現(https://github.com/playframework/playframework/blob/master/framework/src/play/src/main/scala/play/api/controllers/Assets.scala)的一切都已在此處開發。我的問題是

  1. 我應該編寫額外的代碼來實現Etag和Cache-Control嗎?如果是,如何?我無法閱讀斯卡拉
  2. 如果有一種方法可以使用Assets類,如何使它工作?返回Action不會觸發@Authenticate,所以我可以驗證它的好與不好。

回答

1

您可以使用動作組成,參見:https://www.playframework.com/documentation/2.2.x/ScalaActionsComposition

簡單地說這應該解決您的問題:

(1)新的行動

def OnlyAuthenticated[A](action: Action[A]) = Action.async(action.parser) { request => 
    request.session.get("username") match { 
     case Some(username) => 
      User.findByUsername(username) match { 
       case Some(user) => 
        action(request) 
       case _ => 
        Future.successful(Forbidden(views.html.defaultpages.unauthorized.render())) 
      } 
     case _ => 
      Future.successful(Redirect(routes.Application.login(request.path))) 
    } 
} 

(2)控制器動作

def privateAsset(file:String) = OnlyAuthenticated{ 
    Assets.at(s"/private", file) 
} 

( 3)路線

GET  /private/*file  controllers.Application.privateAsset(file)