gpt4 book ai didi

grails - 使用Spring Security插件强制注销已认证的用户

转载 作者:行者123 更新时间:2023-12-02 15:25:38 25 4
gpt4 key购买 nike

我有以下问题:我具有默认的用户和角色域,并且使用spring安全插件。有一个特殊要求,即如果admin使用USER_ROLE删除用户并且此用户已通过身份验证,则应立即将该用户踢出应用程序。如果我们拥有该用户的对象实例,是否可以通过编程方式为该用户注销? Somethig喜欢

def(User user) {

someSpringService.forceLogout(user)

}

谢谢!

最佳答案

我是个新手。最近,我的任务是通过admin强制注销用户的特权。
所以,经过一番研究,这是我的解决方案。我一直在跟踪用户 session ,一旦更改了他的 session ,我只会使他的 Activity session 过期。

在web.xml文件中,添加此侦听器

<listener>
<listener-class>
org.springframework.security.web.session.HttpSessionEventPublisher
</listener-class>
</listener>

在resources.groovy中
import org.springframework.security.web.authentication.session.ConcurrentSessionControlStrategy
import org.springframework.security.web.session.ConcurrentSessionFilter
import org.springframework.security.core.session.SessionRegistryImpl
import org.springframework.security.web.authentication.session.SessionAuthenticationStrategy

beans = {
// bind session registry
sessionRegistry(SessionRegistryImpl)
sessionAuthenticationStrategy(ConcurrentSessionControlStrategy,sessionRegistry){
maximumSessions = -1 }
concurrentSessionFilter(ConcurrentSessionFilter){
sessionRegistry = sessionRegistry
expiredUrl = '/login/auth?f=true'
}
}

在 Controller 中
def expireSession(User user) {
log.info("Process to expire session begins")
def orginalUser = springSecurityService?.principal.username
log.info("session infos for all principals: ${sessionRegistry.getAllPrincipals()}")
sessionRegistry.getAllPrincipals()?.each { princ ->
def allSessions = sessionRegistry.getAllSessions(princ, true);
log.info("all sessions: ${allSessions}")
log.info("principal: $princ; email: ${user?.email}; username: ${princ?.username}")
if(princ?.username?.equals(user?.email)) { //killing sessions only for user (test@app.com)
sessionRegistry.getAllSessions(princ, true)?.each { sess ->
log.info("session: ${sess}; expiring it")
if(sess.expireNow())
log.info("----session expired----")
springSecurityService?.reauthenticate(user?.email)
springSecurityService?.reauthenticate(orginalUser)
}

}
}
}

在RequestFilters.groovy中,在每个请求上测试 session 是否有效或已过期的位置
class RequestFilters {

def springSecurityService
def sessionRegistry

def filters = {
all(controller:'*', action:'*') {
before = {
log.info(controllerName + '/' + actionName + " : " + params)
log.info("request ${request}; session: ${request?.session}")
def sessInfo = sessionRegistry.getSessionInformation(request?.session?.id)
log.info("sessionRegistry: ${sessionRegistry}")
log.info("Session Id: ${request?.session?.id}")
log.info("session info: ${sessInfo}; is expired: ${sessInfo?.expired}")
if(sessInfo?.expired==true)
response.sendRedirect(grailsApplication.config.grails.serverURL+"/j_spring_security_logout");

}
after = { Map model ->

}
afterView = { Exception e ->

}
}
}

关于grails - 使用Spring Security插件强制注销已认证的用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28051887/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com