如果管理员禁用了该用户,则必须终止用户的活动会话

时间:2015-07-06 10:13:22

标签: java spring-mvc spring-security

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

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

我们希望当管理员用户禁用某个用户帐户时,其帐户被禁用的用户必须无法进一步使用该系统,即使他们在禁用该帐户时已登录。

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

2 个答案:

答案 0 :(得分:1)

如果(user.isDisabled()){

List principal = sessionRegistry.getAllPrincipals(); for(Object principal:principals){

AuthenticatedUser users =(AuthenticatedUser)principal;

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

答案 1 :(得分:0)

我们的系统中有类似的功能,如果用户在登录系统时更改了用户权限,则会强制用户再次登录。

我们已按如下方式实施:

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

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