如何让用户一次只能登录一次?

Sau*_*xit 2 grails spring-security

我在我的 grails 应用程序中使用了 Spring Security Core 插件,我想添加以下功能:

当用户已经登录时,将不允许用户使用相同的浏览器userNamepassword完全使用不同的计算机再次登录。

我认为它应该在 Spring Security 核心的某个地方,但不确定。

Sau*_*xit 5

可以使用一些配置设置来完成:

config.groovy上,添加以下行:

grails.plugins.springsecurity.useHttpSessionEventPublisher = true
Run Code Online (Sandbox Code Playgroud)

在bootstrap.groovy上:

导入这两个包:

    import org.codehaus.groovy.grails.plugins.springsecurity.SecurityFilterPosition
import org.codehaus.groovy.grails.plugins.springsecurity.SpringSecurityUtils
Run Code Online (Sandbox Code Playgroud)

然后是一些依赖注入:

    def authenticationManager
def concurrentSessionController
def securityContextPersistenceFilter
def authenticationProcessingFilter
def concurrentSessionControlStrategy
Run Code Online (Sandbox Code Playgroud)

然后在 init 中注册并发过滤器(在 Bootstrap 中):

    authenticationProcessingFilter.sessionAuthenticationStrategy = concurrentSessionControlStrategy

SpringSecurityUtils.clientRegisterFilter('concurrencyFilter', SecurityFilterPosition.CONCURRENT_SESSION_FILTER)
Run Code Online (Sandbox Code Playgroud)

最后在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
Run Code Online (Sandbox Code Playgroud)

然后在 beans 内添加:

 sessionRegistry(SessionRegistryImpl)

  concurrencyFilter(ConcurrentSessionFilter) {

    sessionRegistry = sessionRegistry
    logoutHandlers = [ref("rememberMeServices"), ref("securityContextLogoutHandler")]
    expiredUrl='/login/concurrentSession'
  }

  concurrentSessionControlStrategy(ConcurrentSessionControlStrategy, sessionRegistry) {
    alwaysCreateSession = true
    exceptionIfMaximumExceeded = true
    maximumSessions = 1
  }
Run Code Online (Sandbox Code Playgroud)

完成后,现在用户只能从一个地方登录。

我没有尝试使用 RememberMe 选项。