我正在开发一个应用程序,我希望限制对资产的访问权限。我创建了其他文件夹
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)这里已经开发了所有内容。我的问题是
答案 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)