在Play FrameWork中正确使用@ Security.Authenticated(Secured.class)语句

时间:2014-01-11 19:56:43

标签: java http session playframework

您好我无法理解如何正确使用         @ 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的存在,还检查它是否与帐户匹配

1 个答案:

答案 0 :(得分:2)

也许我不理解您的问题,但在documentation中,您会看到如何创建登录表单并实际执行身份验证。只有在那之后才会存在电子邮件会话值。如果该值在会话中,则用户必须使用正确的凭据登录并且必须已经过身份验证。

当然,如果用户A知道用户B的凭据,那么没有什么可以帮助。

如果你担心授权,决定谁可以在认证时看到什么,那么你可以做很多事情,包括利用Play中的OAuth支持或像this one这样的插件