session - GRAILS:如何通过Spring Security核心插件获取当前登录用户的数量?

标签 session grails spring-security grails-plugin

我的问题是,我想限制可以同时登录我的应用程序的用户数量(该值存储在数据库中)。首先,我尝试在 tomcat 或其他 Web 容器中进行一些配置 - 但存在问题,如果用户未登录,也会使用 session (显示登录页面也需要在 tomcat 中使用 session )。 .所以我需要检查有多少用户“真正”登录。 我发现了很多 acegi 插件的代码示例,但对于 springsecurity 核心插件没有什么真正有用的。

到目前为止我的片段:

在 resources.groovy 中我定义了我的 beans:

beans = {
    sessionRegistry(org.springframework.security.concurrent.SessionRegistryImpl)

    concurrentSessionController(org.springframework.security.concurrent.ConcurrentSessionControllerImpl) { 
        sessionRegistry = ref('sessionRegistry') 
        maximumSessions = -1 
   }
}

在 BootStrap.groovy 中,init 的请求是:

class BootStrap {

    def springSecurityService

    def authenticationManager
    def concurrentSessionController
    def securityContextPersistenceFilter

    def init = { servletContext ->
        authenticationManager.sessionController = concurrentSessionController
        ...

在 Config.groovy 中我添加了:

grails.plugins.springsecurity.providerNames = ['concurrentSessionController', 'daoAuthenticationProvider', 'anonymousAuthenticationProvider', 'rememberMeAuthenticationProvider'] 

但是一旦应用程序启动(grails run-app),当它尝试配置 SpringSecury 时就会崩溃:

...
Running Grails application..

Configuring Spring Security ...
Application context shutting down...
Application context shutdown.
limepix@turbo:~/develop/testproject$

我已经为我的应用程序配置了日志记录 - 我的日志文件中的内容/最后一个条目是:

2011-07-11 11:19:43,071 [main] ERROR context.GrailsContextLoader  - Error executing bootstraps: No bean named 'concurrentSessionController' is defined
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'concurrentSessionController' is defined
        at SpringSecurityCoreGrailsPlugin$_createBeanList_closure22.doCall(SpringSecurityCoreGrailsPlugin.groovy:648)
        at SpringSecurityCoreGrailsPlugin.createBeanList(SpringSecurityCoreGrailsPlugin.groovy:648)
        at SpringSecurityCoreGrailsPlugin.this$2$createBeanList(SpringSecurityCoreGrailsPlugin.groovy)
        at SpringSecurityCoreGrailsPlugin$_closure4.doCall(SpringSecurityCoreGrailsPlugin.groovy:581)
        at org.grails.tomcat.TomcatServer.start(TomcatServer.groovy:212)
            at grails.web.container.EmbeddableServer$start.call(Unknown Source)
        at _GrailsRun_groovy$_run_closure5_closure12.doCall(_GrailsRun_groovy:158)
        at _GrailsRun_groovy$_run_closure5_closure12.doCall(_GrailsRun_groovy)
        at _GrailsSettings_groovy$_run_closure10.doCall(_GrailsSettings_groovy:280)
        at _GrailsSettings_groovy$_run_closure10.call(_GrailsSettings_groovy)
        at _GrailsRun_groovy$_run_closure5.doCall(_GrailsRun_groovy:149)
        at _GrailsRun_groovy$_run_closure5.call(_GrailsRun_groovy)
        at _GrailsRun_groovy.runInline(_GrailsRun_groovy:116)
        at _GrailsRun_groovy.this$4$runInline(_GrailsRun_groovy)
        at _GrailsRun_groovy$_run_closure1.doCall(_GrailsRun_groovy:59)
        at RunApp$_run_closure1.doCall(RunApp.groovy:33)
        at gant.Gant$_dispatch_closure5.doCall(Gant.groovy:381)
        at gant.Gant$_dispatch_closure7.doCall(Gant.groovy:415)
        at gant.Gant$_dispatch_closure7.doCall(Gant.groovy)
        at gant.Gant.withBuildListeners(Gant.groovy:427)
        at gant.Gant.this$2$withBuildListeners(Gant.groovy)
        at gant.Gant$this$2$withBuildListeners.callCurrent(Unknown Source)
        at gant.Gant.dispatch(Gant.groovy:415)
        at gant.Gant.this$2$dispatch(Gant.groovy)
        at gant.Gant.invokeMethod(Gant.groovy)
        at gant.Gant.executeTargets(Gant.groovy:590)
        at gant.Gant.executeTargets(Gant.groovy:589)

也许有人可以向我指出一些文档、示例,或者可以直接告诉我如何获取当前登录用户的数量。

来自德国纽伦堡的问候

limpix

最佳答案

谢谢您的回答!现在我明白了...

我采取的步骤是:

定义 Bean:

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' 
        } 
} 

然后在我的 Controller 中注入(inject):

class SystemController {    

    def sessionRegistry

并检查当前正在使用的 session 数量:

    def sessioncount = {
        def cnt = 0

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

        render cnt
    }

必须执行的其他步骤:

  1. 从 grails 安装模板 (grails install-templates)
  2. 向 web.xml 添加监听器:

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

现在可以了!

太棒了! :)

(现在接下来的步骤是 - 定义一个事件监听器(当用户登录时)检查许可证( session )的数量并允许或拒绝他的访问。但我认为这并不那么棘手......我们'会看到...)

关于session - GRAILS:如何通过Spring Security核心插件获取当前登录用户的数量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6648100/

相关文章:

grails - 使用 Grails Resources 插件,如何根据用户的语言环境加载 Javascript 文件?

Grails 域列等于 ID

java - N 分钟后绝对 session 过期,即使用户正在使用系统

security - GORM 的这个实现目前不支持基于字符串的查询,如 [executeQuery]

node.js - socket.io session ID 和 Express session

java - 在 JBoss AS 中部署的 2 个 Java EE 应用程序之间共享 session

React 中 Axios 调用时 API 中的 PHP-Session 发生变化

grails - 在 Grails 中,如何从 g :select 调用 Controller 操作

spring - 如何在混合的 Apache 和 Tomcat 环境中保持 session

python - 使用来自 appengine-utilities 的 session 在 Windows 上出错