Java 如何在play framework中防止在同一帐户上多次登录?

Java 如何在play framework中防止在同一帐户上多次登录?,java,session,playframework,Java,Session,Playframework,我有一个使用PlayFramework2.3.4构建的系统,以及用于持久性的Ebean。我想确保,如果已经在一个会话中进行了身份验证的用户再次登录,那么他的另一个会话将无效 这将使两个人更难共享同一个帐户 这类功能是否有一个通用模式?我已经实现了一个解决方案,其中我使用名为sessionCounter的用户持久化一个整数属性。每次用户进行身份验证(如提供用户名密码)时,该值都会增加,并存储在用户记录和新会话中 每次使用现有会话访问系统时,都会将其与会话计数器进行比较,如果会话的值低于数据库中的值

我有一个使用PlayFramework2.3.4构建的系统,以及用于持久性的Ebean。我想确保,如果已经在一个会话中进行了身份验证的用户再次登录,那么他的另一个会话将无效

这将使两个人更难共享同一个帐户


这类功能是否有一个通用模式?

我已经实现了一个解决方案,其中我使用名为
sessionCounter的用户持久化一个整数属性。每次用户进行身份验证(如提供用户名密码)时,该值都会增加,并存储在用户记录和新会话中

每次使用现有会话访问系统时,都会将其与会话计数器进行比较,如果会话的值低于数据库中的值,则该会话将无效

以下是验证方法:

/**
 * Handle login form submission.
 */
public static Result authenticate() {
    Form<Login> loginForm = form(Login.class).bindFromRequest();
    if(loginForm.hasErrors()) {
        return badRequest(login.render(loginForm));
    } else {
        User user = loginForm.get().user;
        session().clear();
        session("username", user.getEmail());
        session("counter", ""+user.incrementSessionCounter());
        user.setLastLoginDate(new Date());
        user.save();

您使用什么作为身份验证系统?我使用play.mvc.Security。我的实现只是将登录用户的电子邮件存储在会话中。我目前正在为此开发一个解决方案,在该解决方案中,我在用户和会话中存储会话id。我将采用相同的方法,但使用唯一令牌我选择了整数,因为不需要唯一性,因为PLAY_会话cookie确保您不能欺骗它。它还统计登录次数(这一点很有用)。
@Override
public String getUsername(Http.Context context) {
    final User user;
    if ( !context.args.containsKey("user") ) {
        user = ExtranetUser.findByEmail(context.session().get("username"));
        context.args.put("user", user);
    } else {
        user = (User) context.args.get("user");
    }
    if(user != null){
        final String counterStr = context.session().get("counter");
        if (user.getSessionCounter() > NumberUtils.toInt(counterStr, 0)) {
            Logger.debug("Session invalidated for " + user + " had session " + counterStr + " but latest session is " + user.getSessionCounter());
            context.flash().put("session", "user.duplicateSession");
            context.session().clear();
            return null; // results in redirect to login page with flash
        }
        return user.getEmail();
    } else {
        return null;
    }
}