使用 Deadbolt 玩 java 个项目,拥有私人资产
Play java project with Deadbolt, having private Assets
我一直在四处寻找如何配置资产文件夹的示例,通过@routes.Assets 符号访问它,但仅 returning 资产如果用户已通过身份验证。
我已经配置了门栓并使用 google 帐户完美运行,应用程序也运行良好,但不幸的是,当我使用浏览器并为 [= 写下直接 URL 24=] 用于应用程序部分的资产,它允许我毫无问题地下载它们。
所以,总体问题是:有没有一种方法可以配置只有在用户通过身份验证后才能访问的资产文件夹?
非常感谢
Edit1 :我现在的做法是创建一个名为 PrivateAssets 的控制器,使用一个名为 "at" 的方法接收字符串路径和字符串文件参数。该方法用@SubjectPresent 注释,我在那里获取文件并 return 它。
我的做法是:
创建一个扩展 AssetsBuilder
的 PrivateAssets
,如下所示:
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)
我的 public
文件夹现在有 2 个其他文件夹:
- public
- private
里面public我拥有任何人都可以访问的所有资产结构。
在 private 内部,我拥有所有只有经过身份验证的用户才能访问的资产结构。
要获得任何私人资产,我会这样做:
<script src="@routes.PrivateAssets.at("private.min.js")"></script>
还有其他选项,如 2.3 迁移指南中所述修改 build.sbt
文件以添加另一个资产文件夹,以便为每种类型的资产创建两个不同的文件夹。这给我带来的问题比其他任何事情都多,特别是在测试时。
希望这对其他需要此类东西的人有所帮助。
我一直在四处寻找如何配置资产文件夹的示例,通过@routes.Assets 符号访问它,但仅 returning 资产如果用户已通过身份验证。
我已经配置了门栓并使用 google 帐户完美运行,应用程序也运行良好,但不幸的是,当我使用浏览器并为 [= 写下直接 URL 24=] 用于应用程序部分的资产,它允许我毫无问题地下载它们。
所以,总体问题是:有没有一种方法可以配置只有在用户通过身份验证后才能访问的资产文件夹?
非常感谢
Edit1 :我现在的做法是创建一个名为 PrivateAssets 的控制器,使用一个名为 "at" 的方法接收字符串路径和字符串文件参数。该方法用@SubjectPresent 注释,我在那里获取文件并 return 它。
我的做法是:
创建一个扩展 AssetsBuilder
的 PrivateAssets
,如下所示:
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)
我的 public
文件夹现在有 2 个其他文件夹:
- public
- private
里面public我拥有任何人都可以访问的所有资产结构。
在 private 内部,我拥有所有只有经过身份验证的用户才能访问的资产结构。
要获得任何私人资产,我会这样做:
<script src="@routes.PrivateAssets.at("private.min.js")"></script>
还有其他选项,如 2.3 迁移指南中所述修改 build.sbt
文件以添加另一个资产文件夹,以便为每种类型的资产创建两个不同的文件夹。这给我带来的问题比其他任何事情都多,特别是在测试时。
希望这对其他需要此类东西的人有所帮助。