【问题标题】:Spring Security 3.1弹簧安全 3.1
【发布时间】:2016-07-22 07:49:41
【问题描述】:

有人可以帮我解决这个问题吗?感谢您的帮助。

我正在使用带有 create-session="stateless" 选项的 Spring security 3.1。 其中抛出“InsufficientAuthenticationException”:“访问此资源需要完全身份验证”ExceptionTranslationFilter 异常。

我无法理解我做错了什么以及为什么会出现此异常。由于此异常表明凭据不正确,但我可以看到凭据正在通过请求。我仍然收到 401 未授权

事实是用户能够正确登录并且我也在控制台上收到消息。但由于访问被拒绝异常,它再次重定向到登录页面。

我把代码放在这里

Spring-Security.xml

<http entry-point-ref="negotiateSecurityFilterEntryPoint"
         create-session="stateless" >
        <intercept-url pattern="/user/loginuser"  access="ROLE_ANONYMOUS"/> 
        <intercept-url pattern="/**" access="ROLE_USER"/>   
         <custom-filter ref="securityContextPersistenceFilter"          after="BASIC_AUTH_FILTER" />
        <custom-filter ref="ldapAuthFilter" position="CAS_FILTER" />                
        <custom-filter ref="databaseAuthFilter" position="FORM_LOGIN_FILTER" />
</http> 


<bean id="securityContextPersistenceFilter" class="org.springframework.security.web.context.SecurityContextPersistenceFilter">
        <property name='securityContextRepository'>
            <bean class='org.springframework.security.web.context.HttpSessionSecurityContextRepository'>
                <property name='allowSessionCreation' value='false' />
            </bean>
        </property>
    </bean>

【问题讨论】:

  • 请编辑您的问题标题,使其成为一个实际问题,因为它目前不是一个问题。

标签: spring-security


【解决方案1】:

据我所知,这正是无状态的意思。

一旦你将 create-session 参数设置为无状态,在每次 http 调用时,SecurityContextPersistenceFilter 甚至都不会被调用(默认情况下),或者即使你根据你的配置强制调用它,它也不会是 SecurityContextHolder 中的任何会话级安全信息。

这种无状态模式旨在用于 Rest 风格的架构,在这种架构中,每个请求都会发送身份验证和授权信息。更好的说法是,除非您正在开发完整的无状态应用程序,否则我认为不应该使用无状态会话创建模式

我发现了一篇关于此的好帖子,Spring Security Session Management,请仔细查看 2 部分。会话何时创建?

所以无状态会话创建策略不适合经典的登录表单模式。

在您的场景中,我猜想正在发生的事情是,一旦登录请求完成并且请求通过身份验证,它可能会使用 HTTP 301 或 302 重定向重定向到一种欢迎页面,重定向又是没有携带认证信息,所以结束再次重定向到登录页面。

如果您只是使用“ifRequired”作为会话创建,或者因为它是默认值,请不要设置它,我敢打赌您的登录会成功结束并重定向到它应该正确的位置而不要求再次登录.而且,如果您这样做,请避免设置 SecurityContextPersistenceFilter,它是自动配置的。

【讨论】:

  • 谢谢 lumietu.. 是的,如果我使用“ifrequired”,那肯定会起作用,但你认为它会是无状态的应用程序吗?因为它最终是在创建会话
  • 正如你所说的登录表单模式不适合无状态会话创建。那么我们如何才能将该登录表单排除为无状态而将其他请求排除为无状态。
  • 如果您想保护无状态应用程序,您必须在每个请求中发送身份验证信息,甚至使用一种会话令牌。
  • 当我尝试在每个请求的标头中传递用户名和密码时,我得到 401 Unauthorized resposne。你能知道任何链接,我将通过登录获得这种示例,然后使用令牌保护其他请求。
  • 我明白你的意思,应用程序不是无状态的。我们正在进行的 http 调用是无状态的,这是我们在创建会话中设置的。因此,在我的情况下,调用变得无状态,并且从下一个请求开始,我没有获得授权请求,所以我已经对所有请求进行了身份验证,这就是 JWT 所说的,我们必须通过从令牌中获取数据来授权所有请求。跨度>
猜你喜欢
  • 2023-01-03
  • 2018-09-08
  • 1970-01-01
  • 2017-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多