GRAILS: how to get the number of currently signed in users via spring security core plugin?

后端 未结 2 1945
误落风尘
误落风尘 2020-12-09 13:52

my problem is, that i want to limit the number of users that can simultaneously be logged in my application (this value is stored in the database). first i tried to do that

2条回答
  •  慢半拍i
    慢半拍i (楼主)
    2020-12-09 14:45

    Thanks for your answer! Now i got it...

    The steps i took are:

    Defining the beans:

    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 = { 
    
            sessionRegistry(SessionRegistryImpl) 
    
            sessionAuthenticationStrategy(ConcurrentSessionControlStrategy, sessionRegistry) { 
                    maximumSessions = -1 
            } 
    
            concurrentSessionFilter(ConcurrentSessionFilter){ 
                    sessionRegistry = sessionRegistry 
                    expiredUrl = '/login/concurrentSession' 
            } 
    } 
    

    then in my controller i injected:

    class SystemController {    
    
        def sessionRegistry
    

    and the check, how many sessions are currently in use:

        def sessioncount = {
            def cnt = 0
    
            sessionRegistry.getAllPrincipals().each{
                cnt += sessionRegistry.getAllSessions(it, false).size()
            }    
    
            render cnt
        }
    

    additional steps that must be made:

    1. install templates from grails (grails install-templates)
    2. add listener to web.xml:

      
          org.springframework.security.web.session.HttpSessionEventPublisher
      
      

    and now it works!

    great! :)

    (now the next steps are - defining an eventlistener (when the user logs in) check the number of licenses(sessions) and permit or deny access to him. but i think that´s not that tricky... we´ll see...)

提交回复
热议问题