【问题标题】:How to logout specific User in Spring ? Programatically如何在 Spring 中注销特定用户?以编程方式
【发布时间】:2019-11-01 06:35:48
【问题描述】:

所以我有应用程序,用户可以通过社交网络或正常登录登录。 我希望能够登录管理员帐户并禁止用户,当我将用户状态更改为禁止时,我想通过代码将他注销!我该如何实现?

我添加了会话监听器

    @Component
public class SessionListener implements HttpSessionListener {

    private static int totalActiveSessions;
    List<HttpSession> sessionList = new ArrayList<>();

    public static int getTotalActiveSession() {
        return totalActiveSessions;
    }

    @Override
    public void sessionCreated(HttpSessionEvent httpSessionEvent) {
        totalActiveSessions++;
        if (sessionList.contains(httpSessionEvent.getSession())) {
            sessionList.add(httpSessionEvent.getSession());
        }
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
        totalActiveSessions--;
        if (sessionList.contains(httpSessionEvent.getSession())) {
            sessionList.remove(httpSessionEvent.getSession());
        }
    }
}

调试时 - 我不知道如何识别用户,而且会话似乎是在用户登录之前创建的,只是通过访问站点,似乎不是正确的方法。

【问题讨论】:

  • 这取决于您使用的身份验证方法。如果您直接使用会话,则可以在用户登录时跟踪会话——此时您也应该能够识别用户。如果您使用一些基于令牌的机制,例如 OAuth,您可以在身份提供者中锁定/禁止用户,并使用非常短暂的身份验证令牌(例如 5 分钟)。这样用户应该在短时间内退出,因为刷新令牌会失败。
  • @aksappy 它是如何重复的? 2 个不同的问题....
  • @Thomas 我同时使用 OAuth 和 basic ,在 basic 中,我的意思是默认情况下来自 spring security 的用户名密码身份验证。不知道它是如何在幕后工作的,我的印象是它使用会话来识别登录用户。 Bud 在我看来,当我调试添加新会话的断点时,它是在登录之前触发的,而不是在登录期间触发的。
  • 嗯,在许多应用程序中,您会在第一次请求时立即获得会话,即在登录之前。但是,出于安全原因,您应该在登录后获得一个新会话,例如以防止会话固定攻击等 - 您仍然必须跟踪哪些会话属于哪个登录用户。

标签: java spring security httpsession


【解决方案1】:

创建一个元用户信息模型,如

public class UserInfoContext implements Serializable {

private static final long serialVersionUID = 1L;

private String id;
private String name;
private String authType;

// more fields type of requirements

// Getter and Setters

// Constructor

}

在basic或者OAuth认证的时候,把meta信息放到这个对象里面,然后把这个放到Session里面

UserInfoContext context = new UserInfoContext(id,name,type);

HttpSession session = request.getSession();
session.setAttributes("UserContext",context); 

上面的会话监听器会在会话创建时触发

你可以通过在SessionListener中设置getAllSessionList()来获取所有的会话列表

public List<HttpSession> getAllSessionList(){
    return this.sessionList;
}

假设您想禁止会话并使用户无效,当您实现业务逻辑时获取特定会话并 使用

使其无效
session.invalidate();

还尝试找到用户的JSESSIONID id并将其添加到元上下文类成员中,您也可以需要使其无效

这可能会帮助您获得所需的解决方案

【讨论】:

  • 是的,这看起来应该可以,我会尝试一下或者它的一些变体,这是我喜欢的方法。
【解决方案2】:

您还可以使用 Servlet 过滤器来过滤所有请求并查看用户是否处于活动状态。如果您需要示例,请告诉我。

【讨论】:

    猜你喜欢
    • 2014-04-17
    • 2012-06-15
    • 1970-01-01
    • 2013-09-28
    • 2011-03-07
    • 2017-01-15
    • 2012-01-27
    • 1970-01-01
    • 2012-04-16
    相关资源
    最近更新 更多