【问题标题】:grails with spring-security: manually log out selected users带有spring-security的grails:手动注销选定的用户
【发布时间】:2013-03-19 21:49:48
【问题描述】:

作为应用程序管理员,我希望能够注销任何用户,例如,在将标志“启用 = false”设置为选定用户之后。春天安全有可能吗?

我应该补充一点,我的应用程序允许用户使用“记住我”。

我正在使用: 圣杯 2.2.1 插件 spring-security-core 1.2.7.3

设置 spring-security-core (config.groovy):

grails.plugins.springsecurity.useHttpSessionEventP ublisher = true 
grails.plugins.springsecurity.useSessionFixationPr evention = true 
grails.plugins.springsecurity.userLookup.userDomai nClassName = 'com.app.User' 
grails.plugins.springsecurity.userLookup.authority JoinClassName = 'com.app.UserRole' 
grails.plugins.springsecurity.authority.className = 'com.app.Role' 
grails.plugins.springsecurity.userLookup.usernameP ropertyName = 'email' 

grails.plugins.springsecurity.securityConfigType = "Requestmap" 
grails.plugins.springsecurity.rejectIfNoRule = true 
grails.plugins.springsecurity.requestMap.className ='com.app.Requestmap' 
grails.plugins.springsecurity.requestMap.urlField= 'url' 
grails.plugins.springsecurity.requestMap.configAtt ributeField='configAttribute' 
grails.plugins.springsecurity.rememberMe.cookieNam e = 'remember_me' 
grails.plugins.springsecurity.cacheUsers = false 
grails.plugins.springsecurity.rememberMe.tokenVali ditySeconds=604800 

有没有人可能遇到过类似的问题? 提前谢谢你:)

【问题讨论】:

  • 您的意思是这些用户必须立即从系统中注销(防止下次登录对您来说还不够)?

标签: grails spring-security logout manual


【解决方案1】:

UserDetails.enabled 标志设置为false 应该会导致DisabledException 在用户的下一个安全请求中被抛出。这可以将用户发送到默认的 authfail 处理程序,或者您可以在 UrlMappings 中配置异常处理程序以将用户发送到自定义控制器或操作。

如果您没有在应用程序的其他任何地方使用enabled 标志,您可以将DisabledException 引导到清除身份验证会话(和rememberMe)的操作,然后重置enabled 标志。

另一种可能的方法是创建一个自定义过滤器并将其注入您的Bootstrap 中的弹簧安全过滤器链中。

url异常映射和过滤器配置在Spring Security Plugin Documentation中都有描述

【讨论】:

    【解决方案2】:

    感谢 Codelark,我正在阅读有关过滤器的信息并尝试使用它们 :) 不幸的是,当我为选定的用户应用程序设置 enabled = false 时,它​​不会将其重定向到“/login /authfail”。 最重要的是,更改(启用 = 假)对用户配置文件可见,但缺乏预期的效果。

    我要补充一下,我尝试设置“expireNow”一个用户会话:

    def expireSession(User user) {          
        def orginalUser = springSecurityService?.principal.username
        springSecurityService?.reauthenticate(user?.email)  //modified user np: test@app.com
        springSecurityService?.reauthenticate(orginalUser)  //admin np: admin@app.com
    
        sessionRegistry.getAllPrincipals()?.each { princ ->         
            sessionRegistry.getAllSessions(princ, false);
    
            if(princ?.username?.equals(user?.email)) {      //killing sessions only for user (test@app.com) 
                sessionRegistry.getAllSessions(princ, false)?.each { sess ->
                    sess.expireNow()                
                }
            }//if
        }//each
    }//expireSession
    

    即 sessionRegistry 确实为每个用户获取活动会话,但通过调用:

    sess.expireNow()
    

    结果是再次为同一个用户调用expireSession(user),会话不再可见。这是可以理解的,因为它已经过期了。

    但尽管用户会话已过期。他可能会继续在应用程序中工作。该应用程序不会将您注销

    【讨论】:

      猜你喜欢
      • 2016-07-14
      • 2011-06-08
      • 2011-12-08
      • 2012-07-22
      • 2015-12-10
      • 2011-08-20
      • 2013-02-15
      • 2016-07-09
      • 1970-01-01
      相关资源
      最近更新 更多