您好我无法理解如何正确使用 @ Security.Authenticated(Secured.class) PlayFrameWork中的声明。
我正在尝试确保只有经过身份验证的用户才能访问其帐户。根据{{3}}中提供的示例,看起来他们的身份验证允许单个用户在登录后访问每个用户的帐户 - 而不仅仅是他们自己的帐户。
通常我会假设你只是在行动中得到会话值,比如
public static Result viewAccount(String account) {
//get session value and check against account name
}
然而,文档使用另一条路线: 他们定义了一个类
public class Secured extends Security.Authenticator {
@Override
public String getUsername(Context ctx) {
return ctx.session().get("username");
}
@Override
public Result onUnauthorized(Context ctx) {
return redirect(routes.Application.login());
}
}
显然现在只是使用声明: @ Security.Authenticated(Secured.class) 在行动之前确保其经过身份验证。但是通过我的理解和测试,这并不会阻止用户登录到anyones帐户,因为它只是在会话值存在时通过 - 而不是匹配。 如何解决这个问题?
我应该直接比较会话值吗?那么目的是什么呢? @ Security.Authenticated(Secured.class)?
由于 (编辑) 澄清: 我想允许用户仅被授权查看自己的帐户,而不是其他人 所以当声明
@Security.Authenticated(Secured.class)
使用,我希望它不仅检查会话ID的存在,还检查它是否与帐户匹配
答案 0 :(得分:2)
也许我不理解您的问题,但在documentation中,您会看到如何创建登录表单并实际执行身份验证。只有在那之后才会存在电子邮件会话值。如果该值在会话中,则用户必须使用正确的凭据登录并且必须已经过身份验证。
当然,如果用户A知道用户B的凭据,那么没有什么可以帮助。
如果你担心授权,决定谁可以在认证时看到什么,那么你可以做很多事情,包括利用Play中的OAuth支持或像this one这样的插件