对于Ajax调用,SecurityContextHolder.getContext()。getAuthentication()为null

时间:2013-12-31 11:41:25

标签: ajax spring security authentication

我的情况是,我们有两个单独的主页用于登录和未签名的用户。但我们正在尝试使用cloudfront缓存这些页面。主页的一部分是动态的,我们正在尝试使用Ajax / jquery调用restful服务并在模板javascript中设置输出值来设置它。这个javascript是在加载签名的JSP时执行的。

我相信登录后会调用SecurityContextHolder.getContext()。setAuthentication()。

在Ajax调用的Restful webservice中,我试图让Loggedin用户使用 SecurityContextHolder.getContext()。getAuthentication()。getPrincipal()。但是getAuthentication()返回null。

我的web.xml如下

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        WEB-INF/classes/persistence-context.xml 
        WEB-INF/xyz-servlet.xml
        WEB-INF/classes/environment-context.xml
        WEB-INF/classes/transactional-context.xml
        WEB-INF/classes/spring-security-context.xml
        WEB-INF/classes/services-context.xml
        WEB-INF/classes/aop-context.xml
    </param-value>
</context-param>


<!-- Spring Security Filter -->
<filter>
  <filter-name>springSecurityFilterChain</filter-name>
  <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

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

在spring-security-context.xml中,我有以下值

<http use-expressions="true" auto-config="false" create-session="never" entry-point-ref="authenticationProcessingFilterEntryPoint">
    <access-denied-handler ref="exceptionResolver" />

    <intercept-url pattern="/xyz/myaccount/**" access="hasRole('FRONT_END_USER')" />
    <intercept-url pattern="/xyz/form-clickref*" access="hasRole('FRONT_END_USER')" />

    <intercept-url pattern="/**" filters="none" />

    <form-login login-page="/xyz/login" login-processing-url="/xyz/j_spring_security_check"
                authentication-failure-handler-ref="xyzAuthenticationFailureHandler"
                authentication-success-handler-ref="simpleUrlAuthenticationSuccessHandler" />
    <logout logout-url="/xyz/logout" invalidate-session="true" success-handler-ref="logoutSuccessHandler" />

    <remember-me services-ref="rememberMeServices" key="fe2c667b-d39e-4277-ba66-709ca0bee944" />

    <anonymous enabled="false" />
    <request-cache ref="nullRequestCache" />
    <session-management session-fixation-protection="none" />
</http>

1 个答案:

答案 0 :(得分:1)

我猜,应用程序在您的AJAX请求中失去了对用户http会话的跟踪。

通常有两种(三种)方式来跟踪用户的会话:

  • 使用JSessionID作为url查询参数
  • 使用包含JSessionID的cookie
  • (混合模式:服务器决定使用上述两种技术中的哪一种)

我猜你的AJAX请求没有发送Cookie也没有发送JSessionId请求参数。

要理解这个问题,我会使用一些工具/ Firefoxplugin(FireBug,Http Live Headers,...)来查看发送给服务器的REQUEST。我会检查“正常”请求,看看我是否可以找到JSessionID(url查询参数或会话)。然后我会看看AJAX请求,并寻找相同的信息。

如果正常请求中有JSessionId,但AJAX请求中没有,那么我的猜测是正确的。然后您需要做的就是向AJAX请求提供此信息。 祝你好运