如何在Spring中注销特定的用户?以编程方式

时间:2019-06-18 15:05:47

标签: java spring security httpsession

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

我添加了会话监听器

    @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());
        }
    }
}

调试时-我不知道如何识别用户,而且会话似乎是在用户登录后才创建的,实际上只是通过访问网站而已,这似乎不是正确的方法。< / p>

2 个答案:

答案 0 :(得分:4)

创建类似

的元用户信息模型
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

}

在进行基本身份验证或OAuth身份验证时,请将元信息放入此对象,然后将其添加到会话中

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并将其添加到meta上下文类成员中,您还可能需要使它无效

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

答案 1 :(得分:0)

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