如何在 Play 2.5 框架中使用授权 ActionBuilder 保护静态文件

Posted

技术标签:

【中文标题】如何在 Play 2.5 框架中使用授权 ActionBuilder 保护静态文件【英文标题】:How to protect static files with authorization ActionBuilder In Play 2.5 Framework 【发布时间】:2017-07-27 08:16:16 【问题描述】:

我在 Play 2.5 应用程序的大多数 REST 端点上使用了一个 ActionBuilder:

  def IfAuthorized(auths: Authorizations*): ActionBuilder[AuthRequestWithAuthorization] = 
    new MyAuthActionBuilder(auths.toList)
  

我可以用作:

  def status = IfAuthorized(Editor).async  implicit authReq =>
      //eventually return Result
  

现在我想将静态文件请求包装在同一个ActionBuilder 中。目前我使用这个 oneliner,它使我能够提供 html、js、css 等,所有这些都返回/缓存而不受我的干扰:

GET         /ui/*file                  controllers.Assets.versioned(path="/public", file: Asset)

我不知道如何推入 ActionBuilder。返回初始 html 页面的失败尝试包括:

  def index()= IfAuthorized(Editor)   authReq =>
    val contentStream = this.getClass.getResourceAsStream("/public/index.html")
    Ok.chunked(Enumerator.fromStream(contentStream)).as(HTML)
  

这个Action 只能返回一个特定的 html 文件,而我希望从 1 条路由返回所有静态资产,并受我的自定义 ActionBuilder 保护

【问题讨论】:

【参考方案1】:

您需要实现自己的资产控制器:路由

GET   /auth/*file   controllers.AuthAssets.at(path="/public", file: String)

将指向以下端点:

class AuthAssets extends Controller 
    def at(path: String, file: String) = IfAuthorized(Editor)   authReq =>
        val contentStream = this.getClass.getResourceAsStream(path + file)
        Ok.chunked(Enumerator.fromStream(contentStream))
    

【讨论】:

以上是关于如何在 Play 2.5 框架中使用授权 ActionBuilder 保护静态文件的主要内容,如果未能解决你的问题,请参考以下文章

休眠 3.2.5 与 Play Framework 1.2.5

java 如何使用Play Framework 2.5测试具有多部分数据的路径

如何使用 play framework 2.5 代理 HTTP 方法?

Fixtures.load_Model 在 Play 框架中不起作用

在 Play 框架中重定向到同一控制器中的动作

Play framework 1.2.5 应用启动慢