使用Deadbolt播放java项目,拥有私有资产

时间:2015-01-12 11:59:43

标签: playframework deadbolt deadbolt-2

我一直在寻找一个如何配置资产文件夹的例子,让它通过@ routes.Assets表示法访问,但只有在用户通过身份验证时才返回资产。

我已经配置了deadbolt并使用谷歌帐户完美地工作,该应用程序也正常运行,但不幸的是,当我使用浏览器并记下用于应用程序部分的Javascript资产的直接URL时,它允许我可以毫无问题地下载它们。

因此,总体问题是:是否有办法配置只有在用户通过身份验证后才能访问的Assets文件夹?

非常感谢

Edit1:我现在正在做的方式是创建一个名为PrivateAssets的Controller,其方法名为“at”,它接受String路径和String文件参数。该方法用@SubjectPresent注释,然后在那里我去获取文件并返回它。

1 个答案:

答案 0 :(得分:0)

我是怎么做到的:

创建一个扩展PrivateAssets的{​​{1}},如下所示:

AssetsBuilder

我还以这种方式修改了我的Routes文件:

public class PrivateAssets extends AssetsBuilder {

    private final static Logger logger = LoggerFactory.getLogger(PrivateAssets.class);

    private static User getLocalUser(final Http.Session session) {
        final AuthUser currentAuthUser = PlayAuthenticate.getUser(session);
        final User localUser = User.findByAuthUserIdentity(currentAuthUser);
        return localUser;
    }

    private static Http.Session session() { return Http.Context.current().session(); }

    private static Http.Request request() { return Http.Context.current().request(); }

    private static Http.Response response() { return Http.Context.current().response();}

    @SubjectPresent
    public static Result at(String path , String file) {
        logger.debug(getLocalUser(session()).email + " -> secure asset call : " + path + " | " + file);
        return Results.ok(Play.application().getFile(path + File.separator + file), true);
    }
}

我的GET /assets/*file controllers.Assets.at(path="/public/public", file) GET /secure/assets/*file controllers.PrivateAssets.at(path="/public/private", file) 文件夹现在还有2个其他文件夹:

public

公众内部我拥有任何人都可以访问的所有资产结构。

私有内部我拥有只有经过身份验证的资产结构才能访问。

要获得任何私有资产,我会做这样的事情:

- public
- private

还有其他选项,例如修改2.3迁移指南中描述的<script src="@routes.PrivateAssets.at("private.min.js")"></script> 文件以添加另一个资产文件夹,以便为每种类型的资产提供两个不同的文件夹。这给了我比其他任何问题更多的问题,特别是在测试时。

希望这可以帮助其他需要此类事情的人。