【问题标题】:If the user is disabled by admin, the active session of user must be killed如果用户被管理员禁用,用户的活动会话必须被杀死
【发布时间】:2015-07-09 12:04:18
【问题描述】:

我有一个使用 Spring Security 的 Spring 应用程序。具有ADMIN 角色的用户可以查看在系统中注册的所有用户的列表,并且可以禁用(暂停)任何用户(例如,如果违反了系统使用条款和条件)。如果用户如此禁用然后尝试登录,他们将被拒绝登录,因为他们的用户帐户已被禁用。

但是,如果如此禁用的用户在其用户帐户被禁用时已登录,他们将继续使用系统,直到他们注销或会话超时。

我们希望当管理员用户禁用用户帐户时,其帐户被禁用的用户不得进一步使用系统,即使他们在禁用帐户时已登录。

有没有办法通过 Spring Security 实现这一点?

【问题讨论】:

    标签: java spring-mvc spring-security


    【解决方案1】:

    我们的系统中有一个类似的功能,如果用户在已经登录系统的情况下被管理员更改了用户权限,则会强制用户再次登录。

    我们已经实现如下:

    1. 所有用户都由他们的用户名标识(这是他们的安全主体)。
    2. 有一个内存缓存,用于维护访问权限已更改的主体以及更改权限的时间戳。
    3. 更改用户访问权限的代码部分将更改后用户的主体和当前时间戳推送到内存缓存中。
    4. 有一个 servlet 过滤器在处理每个请求之前对其进行检查。此过滤器为与请求对应的用户选择主体,并检查该主体是否存在于内存缓存中,其时间戳晚于当前会话的开始时间。如果检查通过,则当前会话立即失效,并将用户重定向到登录页面。主体也会从缓存中删除。如果在缓存中找不到主体,则允许请求照常进行。

    我们使用分布式缓存,以便所有应用程序服务器维护相同的主体缓存,从而允许将请求路由到任何应用程序服务器而不会丢失功能。

    存在用户未登录并更改其访问权限的情况,从而将其主体推入缓存。当用户下次登录时,过滤器在缓存中找到用户的主体,但发现缓存的时间戳早于会话开始时间,因此允许用户正常使用系统。

    【讨论】:

    • 不,我已经给你大方向了,写代码就看你自己了。
    【解决方案2】:

    if(user.isDisabled()){

    列出主体 = sessionRegistry.getAllPrincipals(); for(对象主体:主体){

    AuthenticatedUser users = (AuthenticatedUser) 主体;

                        String username= users.getUsername();
                        List<SessionInformation> sessionInformations = sessionRegistry.getAllSessions(users, false);
                        for(SessionInformation information : sessionInformations){
                            if(username.equalsIgnoreCase(user.getUserName())) {
                                 information.expireNow();
                             }
                        }
                    }
                }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-17
      • 2015-09-30
      • 2023-01-28
      • 2014-10-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多