Hazelcast不使用Spring安全性(未找到SessionRegistry bean)

时间:2015-01-27 07:45:36

标签: java spring spring-security hazelcast

我正在使用带有Spring安全性3.2.5的Hazelcast 3.4。当我部署应用程序并尝试登录时,登录成功但抛出异常,从而导致出现错误页面。无论我登录的错误页面和我的会话是“活着”。但是每次登录后我总是得到execption,结果是错误页面上的一块土地(我设置为出现未处理的异常)。

我在网络浏览器中的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上下文中的hazelcast配置xml:

<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,登录工作完全正常。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:2)

我遇到了同样的问题。原因是我使用DSL使用Spring Java Config for Spring Security。使用当前的Spring Security 4.0.1,Configurer将仅按需创建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无法找到它。

答案 1 :(得分:0)

似乎一切都好。您已经配置了有关规格的所有内容。

HazelCast Documentation

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

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

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

在任何情况下,您都可以查看Hazelcast代码示例,以便逐步比较所有配置。

HazelCast Code Samples

我希望它对你有用。 问候。

答案 2 :(得分:0)

如果对spring上下文使用xml配置,请确保定义

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

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