我在我的 grails 应用程序中使用了 Spring Security Core 插件,我想添加以下功能:
当用户已经登录时,将不允许用户使用相同userName
的password
浏览器或完全使用不同的机器再次登录。
我认为它应该在弹簧安全核心的某个地方,但不确定。
我在我的 grails 应用程序中使用了 Spring Security Core 插件,我想添加以下功能:
当用户已经登录时,将不允许用户使用相同userName
的password
浏览器或完全使用不同的机器再次登录。
我认为它应该在弹簧安全核心的某个地方,但不确定。
可以使用一些配置设置来完成:
在config.groovy上,添加以下行:
grails.plugins.springsecurity.useHttpSessionEventPublisher = true
在bootstrap.groovy上:
导入这两个包:
import org.codehaus.groovy.grails.plugins.springsecurity.SecurityFilterPosition
import org.codehaus.groovy.grails.plugins.springsecurity.SpringSecurityUtils
然后是一些依赖注入:
def authenticationManager
def concurrentSessionController
def securityContextPersistenceFilter
def authenticationProcessingFilter
def concurrentSessionControlStrategy
然后在 init 中注册并发过滤器(在 Bootstrap 中):
authenticationProcessingFilter.sessionAuthenticationStrategy = concurrentSessionControlStrategy
SpringSecurityUtils.clientRegisterFilter('concurrencyFilter', SecurityFilterPosition.CONCURRENT_SESSION_FILTER)
最后在resources.groovy中:
导入几个包:
import org.springframework.security.web.authentication.session.ConcurrentSessionControlStrategy
import org.springframework.security.web.session.ConcurrentSessionFilter
import org.springframework.security.core.session.SessionRegistry;
import org.springframework.security.core.session.SessionRegistryImpl
import org.springframework.security.web.authentication.session.SessionAuthenticationStrategy
然后在豆子里面添加:
sessionRegistry(SessionRegistryImpl)
concurrencyFilter(ConcurrentSessionFilter) {
sessionRegistry = sessionRegistry
logoutHandlers = [ref("rememberMeServices"), ref("securityContextLogoutHandler")]
expiredUrl='/login/concurrentSession'
}
concurrentSessionControlStrategy(ConcurrentSessionControlStrategy, sessionRegistry) {
alwaysCreateSession = true
exceptionIfMaximumExceeded = true
maximumSessions = 1
}
完成,现在用户只能从一个地方登录。
我没有尝试使用 rememberMe 选项。
您可以尝试使用Persistent Logins 和 Remember-Me Cookie。这个想法是将记住我的令牌保存在数据库中,并在随后的登录尝试中检查数据库中是否存在 cookie。如果存在 cookie,则不允许登录。
这必须与密钥一起使用,rememberMe.tokenValiditySeconds
以便令牌过期并从数据库中清除。
You would get more insight and throw some light to this scenario if you look at