作为应用程序管理员,我希望能够在向所选用户设置标志“enabled = false”之后注销任何用户。在弹簧安全方面有可能吗?
我应该补充一点,我的应用程序允许用户使用“记住我”。
我正在使用: grails 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
有没有人有过类似的问题? 提前谢谢你:)
答案 0 :(得分:0)
将UserDetails.enabled
标志设置为false会导致在用户的下一个安全请求上抛出DisabledException
。这可以将用户发送到默认的authfail
处理程序,也可以在UrlMappings
中配置异常处理程序以将用户发送到自定义控制器或操作。
如果您未在应用程序的任何其他位置使用enabled
标志,则可以将DisabledException
指向清除身份验证会话(并记住Me)的操作,然后重置{{1国旗。
另一种可能的方法是创建自定义过滤器并将其注入enabled
中的弹簧安全过滤器链。
url异常映射和过滤器配置都在Spring Security Plugin Documentation
中描述答案 1 :(得分:0)
谢谢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),会话不再可见。这是可以理解的,因为它已经过期了。
但是尽管用户会话已过期。他可以继续在申请中工作。该应用程序不会让您退出