grails with spring security:手动注销选定用户

grails with spring security:手动注销选定用户,grails,spring-security,logout,manual,Grails,Spring Security,Logout,Manual,作为应用程序管理员,我希望能够注销任何用户,例如,在为所选用户设置标志“enabled=false”之后。在春季安检中可能吗 我应该补充一点,我的应用程序允许用户使用“记住我” 我正在使用: Grails2.2.1 插件spring安全核心1.2.7.3 设置spring安全核心(config.groovy): 有没有人有过类似的问题? 提前感谢:)将UserDetails.enabled标志设置为false将导致在用户的下一个安全请求中引发DisabledException。这可以将用户发送到

作为应用程序管理员,我希望能够注销任何用户,例如,在为所选用户设置标志“enabled=false”之后。在春季安检中可能吗

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

我正在使用: Grails2.2.1 插件spring安全核心1.2.7.3

设置spring安全核心(config.groovy):

有没有人有过类似的问题?
提前感谢:)

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

如果未在应用程序中的任何其他位置使用
启用
标志,则可以将
禁用异常
指向清除身份验证会话(并记住)的操作,然后重置
启用
标志

另一种可能的方法是创建一个自定义过滤器,并将其注入
引导程序中的spring安全过滤器链中


url异常映射和筛选器配置都在

中描述。谢谢Codelark,我正在阅读有关筛选器的内容并尝试使用它们:) 不幸的是,当我为所选用户应用程序设置enabled=false时,它不会重定向到“/login/authfail”。 最重要的是,这些更改(enabled=false)对用户配置文件是可见的,但缺少所需的效果

我想补充一点,我试图设置“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),会话将不再可见。这是可以理解的,因为它已经过期了


但尽管用户会话已过期。他可以继续在申请中工作。应用程序不会让您注销

您的意思是这些用户必须立即从系统注销(阻止下次登录对您来说是不够的)?
sess.expireNow()