1.Set the concurrentSessionController in Bootstrap:
class BootStrap { def authenticationManager def concurrentSessionController def init = { servletContext -> authenticationManager.sessionController = concurrentSessionController } def destroy = {} }
2. then in resources.groovy I configured the missing concurrentSessionFilter :
import org.springframework.security.concurrent.ConcurrentSessionControllerImpl import org.springframework.security.concurrent.ConcurrentSessionFilter import org.springframework.security.concurrent.SessionRegistryImpl import org.springframework.security.providers.ProviderManager beans = { sessionRegistry(SessionRegistryImpl) concurrentSessionController(ConcurrentSessionControllerImpl) { maximumSessions = 1 sessionRegistry = sessionRegistry } concurrentSessionFilter(ConcurrentSessionFilter) { sessionRegistry = sessionRegistry expiredUrl = '/login/concurrentSession' } }
3. and took advantage of a new feature in the 0.3 version of the plugin, being
able to specify the FilterChainProxy filter list as a list of strings in
SecurityConfig.groovy:
filterNames = ['concurrentSessionFilter', 'httpSessionContextIntegrationFilter', 'logoutFilter', 'authenticationProcessingFilter', 'securityContextHolderAwareRequestFilter', 'rememberMeProcessingFilter', 'anonymousProcessingFilter', 'exceptionTranslationFilter', 'filterInvocationInterceptor']
结论及其他:
1.本文引自nabble讨论:http://old.nabble.com/dealing-with-concurrent-session-in-acegi-and-grails-td18987010.html
2.另一个nabble讨论提到acegi plugin将在0.6版本纳入此功能:http://jira.codehaus.org/browse/GRAILSPLUGINS-962