【问题标题】:Hazelcast not working with Spring security (no SessionRegistry bean found)Hazelcast 不适用于 Spring 安全性(未找到 SessionRegistry bean)
【发布时间】:2015-01-27 07:45:35
【问题描述】:

我正在使用带有 Spring security 3.2.5 的 Hazelcast 3.4。当我部署应用程序并尝试登录时,登录成功但抛出异常,导致错误页面。无论我登录的错误页面是什么,我的会话都是“活动的”。但是每次登录后,我总是会得到执行结果,因此会出现在错误页面上(我已设置为出现未处理的异常)。

我在 web.xml 中的 Hazelcast 配置:

     <filter>
    <filter-name>hazelcast-filter</filter-name>
    <filter-class>com.hazelcast.web.spring.SpringAwareWebFilter</filter-class>
    <init-param>
        <param-name>map-name</param-name>
        <param-value>at-sessions</param-value>
    </init-param>

    <init-param>
        <param-name>sticky-session</param-name>
        <param-value>true</param-value>
    </init-param>
    <init-param>
        <param-name>cookie-name</param-name>
        <param-value>hsessionId</param-value>
    </init-param>
    <init-param>
        <param-name>cookie-http-only</param-name>
        <param-value>true</param-value>
    </init-param>
    <init-param>
        <param-name>instance-name</param-name>
        <param-value>hazelcastInstance</param-value>
    </init-param>
    <init-param>
        <param-name>shutdown-on-destroy</param-name>
        <param-value>false</param-value>
    </init-param>
</filter>

<listener>
    <listener-class>com.hazelcast.web.SessionListener</listener-class>
</listener> 


 <filter-mapping>
    <filter-name>hazelcast-filter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>INCLUDE</dispatcher>
    <dispatcher>REQUEST</dispatcher>
</filter-mapping>

我在 Spring 上下文 xml 中的 hazelcast 配置:

<hz:hazelcast id="hazelcastInstance">
    <hz:config>
        <hz:instance-name>hazelcastInstance</hz:instance-name>
        <hz:group name="${hazelcast.group.name}" password="${hazelcast.group.password}"/>
        <hz:properties>
            <hz:property name="hazelcast.jmx">true</hz:property>
            <hz:property name="hazelcast.logging.type">slf4j</hz:property>
        </hz:properties>
        <hz:network port="${hazelcast.port}">
            <hz:join>
                <hz:multicast enabled="false"/>
                <hz:tcp-ip enabled="${hazelcast.tcp.ip.enabled}">
                    <hz:members>${hazelcast.tcp.ip.members}</hz:members>
                </hz:tcp-ip>
                <hz:aws enabled="${hazelcast.aws.enabled}"
                    access-key="${hazelcast.aws.access.key}"
                    secret-key="${hazelcast.aws.secret.key}"
                    region="${hazelcast.aws.region}"
                    tag-key="${hazelcast.aws.tag.key}"
                    tag-value="${hazelcast.aws.tag.value}"
                />
            </hz:join>
        </hz:network>
        <hz:map name="at-sessions"
            in-memory-format="${hazelcast.sessions.in.memory.format}"
            backup-count="${hazelcast.sessions.backup.count}"
            async-backup-count="${hazelcast.sessions.async.backup.count}"
            time-to-live-seconds="${hazelcast.sessions.ttl.seconds}"
            max-idle-seconds="${hazelcast.sessions.max.idle.seconds}"
            eviction-policy="LRU"
            max-size-policy="USED_HEAP_PERCENTAGE"
            max-size="${hazelcast.sessions.max.size}"
            eviction-percentage="${hazelcast.sessions.eviction.percentage}"
            merge-policy="${hazelcast.sessions.merge.policy}"
        />
    </hz:config>

</hz:hazelcast>

我得到以下异常:

Caused by: javax.servlet.ServletException: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.security.core.session.SessionRegistry] is defined
    at org.apache.jsp.WEB_002dINF.views.common.general_002derror_jsp._jspService(general_002derror_jsp.java:195) ~[na:na]
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) ~[jasper.jar:7.0.57]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) [servlet-api.jar:na]
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432) ~[jasper.jar:7.0.57]
    ... 97 common frames omitted

没有 Hazelcast,登录工作完全正常。任何帮助将不胜感激。

【问题讨论】:

    标签: java spring spring-security hazelcast


    【解决方案1】:

    我也有同样的问题。原因是我使用 DSL 使用 Spring Java Config for Spring Security。使用当前的 Spring Security 4.0.1,配置器将仅按需创建 SessionRegistry 并且(看起来)不是作为注册的 bean 组件。

    我已经用 SessionRegistry 的明确定义解决了这个问题。

        http
            .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
                .sessionFixation()
                    .migrateSession()
                    .maximumSessions(10)
                    .sessionRegistry(sessionRegistry()) // << this here!
                    .and()
                .and()
    

    @Bean
    public SessionRegistry sessionRegistry() {
        return new SessionRegistryImpl();
    }
    

    除非使用 Hazelcast 的 WebFilter,否则这不是必需的,因为 Spring 的 SessionManagementConfigurer 将确保创建 SessionRegistry 的实例。但是使用SessionRegistry这个类型是找不到的。

    【讨论】:

      【解决方案2】:

      看来一切正常。您已经配置了所有关于规格的内容。

      HazelCast Documentation

      您在此配置中没有最常见的错误,即使用 com.hazelcast.web.Webfilter,而不是 com.hazelcast.web.SpringAwareWebFilter 在您的过滤器定义中。

      此外,您可以检查您对“sessionRegistry”bean 的定义是否以这种方式完成。

      <beans:property name="sessionRegistry" ref="sessionRegistry"/> 
      

      无论如何,您都可以查看 Hazelcast 代码示例,以便逐步比较您的所有配置。

      HazelCast Code Samples

      希望对你有用。 问候。

      【讨论】:

        【解决方案3】:

        如果你对spring上下文使用xml配置,一定要定义

        <bean id="sessionRegistry"
          class="org.springframework.security.core.session.SessionRegistryImpl" />
        

        spring-security.xml(或者你用来配置spring安全上下文的任何文件)

        【讨论】:

          猜你喜欢
          • 2012-08-30
          • 1970-01-01
          • 2021-01-02
          • 1970-01-01
          • 2012-09-02
          • 2020-10-02
          • 2015-10-09
          • 1970-01-01
          • 2019-05-25
          相关资源
          最近更新 更多