gpt4 book ai didi

java - 在 Spring 中使用 Cookie 对 Restful 服务进行身份验证

转载 作者:行者123 更新时间:2023-11-29 05:43:50 25 4
gpt4 key购买 nike

我使用 Spring Security 来保护使用 Spring 构建的 RESTful Web 服务,但过去请求使用身份验证 header 进行身份验证。现在,当用户的凭据在 cookie 中时,我需要保护这样的应用程序。

我正在尝试找出最佳方法,要么从 cookie 中提取用户信息并将其放入身份验证 header 中,要么理想情况下仅将 cookie 的值用于 loadUserByUsername 方法在 UserDetailsS​​ervice bean 中。

到目前为止,我已经想出了一些关于如何做到这一点的想法:

  1. 我可以添加一个 HandlerInterceptor 以使用 cookie 向请求添加身份验证 header 。但是,并非所有请求都需要身份验证,因此如果我这样做,我想将其应用于某些方法或请求映射而不是其他,但我不知道该怎么做。

  2. 我可以实现一个 AuthenticationEntryPoint,如 this tutorial 中所示.在那个教程中,虽然我真的不明白为什么他有 response.sendError( HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized"); 作为 commence 方法的主体。在我的用例中,我会使用那里的 cookie 添加身份验证 header 吗?

  3. 我可以在所有 Controller 方法的第一行使用自定义方法执行安全检查。当您遵循 Spring Security 的理想路径时,它似乎是一个非常好的解决方案。不过,我需要做的似乎偏离了这一点,而且我的要求实际上很简单。也许我最好还是用简单的老式方法来做这件事?

  4. 一些我不知道/没想到的更好的主意!

非常感谢您的帮助和想法!

最佳答案

如果我的要求正确,使用 Spring Security 的 Pre-Authentication Framework Classes 可能是最简单的实现所需的身份验证机制。

一般来说,这些类被设计用来支持一些场景,其中身份验证机制由一些外部系统提供,确保 http 请求包含某种可以被任何 webapp 使用的身份验证信息。在您的情况下,授权信息似乎位于可用于识别用户的 cookie 中。

假设您已经有一个UserDetailsS​​ervice 实现来按姓名查找用户,您可以很容易地实现您的要求:

1) 创建一个 AbstractPreAuthenticatedProcessingFilter 的子类,实现抽象方法 getPreAuthenticatedPrincipal(HttpServletRequest) 以从 cookie 中提取主体(用户名)。如果请求中没有凭据,还有另一个抽象方法 (getPreAuthenticatedCredentials()) 可能只返回 null。已经在抽象父类(super class)中实现的逻辑然后创建一个包含提取主体的身份验证 token ,并将其提交给身份验证管理器。

2) 创建一个 PreAuthenticatedAuthenticationProvider 类型的 bean,它将从 auth 管理器接收 auth token ,以便完全填充它(加载用户的角色)。此类需要注入(inject) UserDetailsS​​ervice 的变体,该变体采用整个身份验证 token ,而不仅仅是用户名。您可以简单地使用 UserDetailsByNameServiceWrapper 使您的原始 UserDetailsS​​ervice 适应该接口(interface):

<bean id="preAuthAuthProvider" class="org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider">
<property name="preAuthenticatedUserDetailsService">
<bean id="userDetailsServiceWrapper" class="org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper">
<property name="userDetailsService" ref="yourUserDetailsService"/>
</bean>
</property>
</bean>

3) 使用类似于 the documentation 中显示的配置将事物连接在一起:

<security:http>
...
<security:custom-filter position="PRE_AUTH_FILTER" ref="preAuthFilter" />
</security:http>

<bean id="preAuthFilter" class="com.whatever.YourPreAuthFilter"/>

<security:authentication-manager>
<security:authentication-provider ref="preAuthAuthProvider" />
</security:authentication-manager>

因此,实现您的要求所需要做的只是一个具有单一方法的子类,以及一些将其与现有支持类连接起来的额外配置。

关于java - 在 Spring 中使用 Cookie 对 Restful 服务进行身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16512838/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com