2014-02-17 63 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)