Play框架 - 资产认证

时间:2014-02-17 20:48:54

标签: playframework-2.0

我正在开发一个应用程序,我希望限制对资产的访问权限。我创建了其他文件夹

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吗?如果有,怎么样?我看不懂scala
  2. 如果有办法使用Assets类,如何使其工作?返回操作不会触发@Authenticate,所以我可以验证它是否可以。

1 个答案:

答案 0 :(得分: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)