在 playframework 中提供具有身份验证的静态文件

Posted

技术标签:

【中文标题】在 playframework 中提供具有身份验证的静态文件【英文标题】:Serving static files with authentication in the playframework 【发布时间】:2011-10-26 17:48:52 【问题描述】:

是否有一种简单/内置的方法让控制器检查连接是否被授权访问静态文件而不是服务器(使用数据库查找),然后在需要时提供访问权限。

有大视频文件,我想a)检查是否允许用户访问文件,b)如果用户被授权我想记录视频已经被观看过。

【问题讨论】:

【参考方案1】:

有两种方法可以做到这一点。

第一个也是最优雅的方法是使用 Play Plugin 功能。

您可以在How to extend the playframework? 找到更多信息 这是javadoc: http://www.playframework.org/documentation/api/1.2.3/play/PlayPlugin.html

第二个是从路由提供文件

如果文件是基于路由/控制器的,那么您可以像保护任何其他控制器一样保护它们。如果我错了,请有人纠正我。

我会做类似的事情(注意此代码尚未经过测试):

@With(Secure.class)保护

public static void getImage() 
    File file = new File( "~/image.png" );
    response.contentType = "image/png";
    renderBinary( file );

然后是路线

GET     /static/image1    Application.getImage

或者你可以让它更优雅。

GET     /static/image/fileName   Application.getImage
GET     /static/image/id         Application.getImageById

   public static void getImage(String fileName) 
        File file = new File( "~/" + fileName );
        response.contentType = "image/png";
        renderBinary( file );
    

或者更进一步。

public static void getImage( String fileName, String username ) 
    File file = new File( "~/" + fileName );

    if ( file.exists() ) 
        User user = User.find( "byName", username ).fetch();
        user.watch = true;
        user.save();

        response.contentType = "image/png";
        renderBinary( file );
    

如果文件不存在,显然你需要在其中进行一些尝试和捕获。

祝你好运。

【讨论】:

以上是关于在 playframework 中提供具有身份验证的静态文件的主要内容,如果未能解决你的问题,请参考以下文章

防止 Spring Security 通过下一个身份验证提供程序对具有 BadCredentialException 的用户进行身份验证

具有自定义身份验证提供程序的 OAUTH2 用户服务

具有多个身份验证提供程序的 Spring 安全性 - UsernameNotFoundException

具有身份验证的网络 IPC(在 Python 中)

具有 Spring Security 和 Java Config 的自定义身份验证提供程序

具有自定义后端的 Next-auth 自定义身份验证提供程序