如何在 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 方法?