当前位置: 首页 > 知识库问答 >
问题:

Spring Security中的会话管理

公冶俊达
2023-03-14

我是Spring保安的新手。我有一个要求做一个基于URL的身份验证,其中用户需要被认证基于唯一的引用,将发送每次作为一个参数在URL。我将把这个引用传递给webservice,获取所需的数据,然后对用户进行身份验证(并设置角色)。身份验证和授权部分工作正常。

但是,当我再次尝试访问应用程序时(现在在URL中使用了不同的引用),它表示“SecurityContextholder没有用匿名令牌填充,因为它已经包含了...”,并显示了以前请求的详细信息。我尝试使用SecurityContextHolder.getContext().SetAuthentication(null)和SecurityContextHolder.ClearContext()清除安全上下文。

下面是我的web.xml(只有Spring Security性部分):

<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>
</filter-mapping>

<listener>
<listener-class>
          org.springframework.web.context.ContextLoaderListener
    </listener-class>
</listener>

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

<session-config>
<session-timeout>30</session-timeout>
</session-config>

spring-security.xml:

<http use-expressions="true" auto-config="false" entry-point-                   
                            ref="http403ForbiddenEntryPoint">
<intercept-url pattern="/paymentPortalInternal.*" access="hasRole('Internal')"/>
<intercept-url pattern="/paymentPortalExternal.*" access="hasRole('External')"/>

<custom-filter position="PRE_AUTH_FILTER" ref="customAuthenticationFilter"/>
<custom-filter position="CONCURRENT_SESSION_FILTER" ref="concurrencyFilter" />
<session-management session-authentication-strategy-ref="sas"/>
</http>

<beans:bean id="concurrencyFilter"
class="org.springframework.security.web.session.ConcurrentSessionFilter">
<beans:property name="sessionRegistry" ref="sessionRegistry" />
<beans:property name="expiredUrl" value="/session-expired.htm" />
</beans:bean>

<beans:bean id="http403ForbiddenEntryPoint"
  class="org.springframework.security.web.authentication.Http403ForbiddenEntryPoint"/>
<beans:bean id="customAuthenticationFilter"
  class="com.xxx.xxx.xxxxx.security.CustomAuthenticationFilter">
      <beans:property name="sessionAuthenticationStrategy" ref="sas" />
  <beans:property name="authenticationManager" ref="authenticationManager" />
</beans:bean>

<beans:bean id="sas" 
              class="org.springframework.security.web.authentication.session.
                                               ConcurrentSessionControlStrategy">
<beans:constructor-arg name="sessionRegistry" ref="sessionRegistry" />
<beans:property name="maximumSessions" value="1" />
<beans:property name="exceptionIfMaximumExceeded" value="true" />
</beans:bean>

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

<authentication-manager alias="authenticationManager">
    <authentication-provider ref="preauthAuthProvider" />
</authentication-manager>

<beans:bean id="preauthAuthProvider" 
                class="org.springframework.security.web.authentication.preauth.
                                       PreAuthenticatedAuthenticationProvider">
<beans:property name="preAuthenticatedUserDetailsService">
    <beans:bean class="com.XXX.XXXX.XXX.UserServiceImpl" />
    </beans:property>
</beans:bean>

如果我需要提供更多信息,请让我知道。

我的理解是安全上下文holder存储所有用户的详细信息。但是在这种情况下,我不能从不同的选项卡/浏览器启动应用程序。

共有1个答案

陈弘厚
2023-03-14

如果您的CustomAuthenticationFilter正在扩展AbstractPreAuthenticatedProcessingFilter,以下两个属性可能会让您有所了解。1.CheckForPrincipalChanges2。InvalidateSessionOnPrincipalChange

 类似资料:
  • 问题内容: 我正在研究GWT-ext应用程序。在此应用程序中,我管理了客户端会话。为此,我编写以下代码: 管理会话:import com.google.gwt.user.client.Timer; 获取用户活动: 这段代码可以正常工作,但是我的问题是:随着时间的推移,该代码将自动注销。对于我的代码,我希望单击或按下它即可注销。情况如下:如果用户登录并且注销时间为5分钟,则根据上述代码,用户现在没有

  • 成功登录后,我想用新的url继续进行进一步的请求处理。但url正在调用springmvc中的公开服务,其中的安全配置不会检查会话身份验证以获取传入url。请看下面的代码。 当jsp页面提交登录验证时,J_security_check调用目标url,该URL随后调用拦截器模式/home*并验证登录凭证。 如果我在登录之前调用公开的服务“/address/userid/”,它将直接调用服务方法,使其成

  • 成功开发 Web 应用程序的难题之一是在一次用户访问,即会话期间,当用户在一个应用程序的页与页之间跳转的同时,维护用户信息。HTTP 是一种无状态协议,也就是说,Web 服务器将某页的每次访问都当作相互无关的访问来处理;服务器不保留前一次访问的任何信息,即使访问就发生在当前访问的几秒钟之前。正因为这种不记忆以前访问的特性使得编写联机目录之类的应用程序很困难,此类应用程序可能需要跟踪用户在目录的不同

  • 问题内容: 在Node.js中管理会话变量的最佳方法是什么?有图书馆吗? 问题答案: 您可以使用以下命令轻松完成此操作: 连接: http : //senchalabs.github.com/connect/ Connects就像Ruby中的Rack。它为您提供了一个额外的层,您可以在其中“玩”身份验证,会话,Cookie等。 另一种选择是使用框架: Express.js: http://expr

  • 问题内容: 我们有以下设置。 STM(Stingrey Traffic Manager)进行负载平衡+会话粘性 Weblogic的“集群” 由第三方工具处理的身份验证 因此,我不必担心有关水平缩放/运行应用程序多个实例的会话。STM / Weblogic集群确保后续请求到达同一托管服务器。 我们目前拥有的是一个整体应用程序,并且我们正在尝试转向微服务。同样,我们也不会离开当前的基础架构(即STM

  • 问题内容: 我正在开发一个小型Web应用程序,很有趣,目前仅使用Java Servlet。我有两个页面,test1和test2。目前,我正在test1中创建一个新会话,如下所示: 在test2中,我像这样检索会话: 因此,问题在于,如果我先进入test2,我总是会得到一个有效的会话,因为浏览器会创建一个会话。我想限制从test1到test2的流量,因此我必须先进入test1。我的计划是最终创建一个