gpt4 book ai didi

rest - Spring Security 认证 RESTful Web 服务

转载 作者:行者123 更新时间:2023-12-01 10:03:26 25 4
gpt4 key购买 nike

我正在为我的 RESTful Web 服务(使用 Spring MVC 实现)添加基本身份验证,而 Spring Security 以前从未真正使用过它。现在,我只是在使用内存中的 UserService,目的是稍后添加一个基于存储库的服务。

<security:http>
<security:http-basic />
<security:intercept-url pattern="/**" access="ROLE_ADMIN" />
</security:http>

<security:authentication-manager>
<security:authentication-provider>
<security:user-service>
<security:user name="admin" password="admin"
authorities="ROLE_USER, ROLE_ADMIN" />
<security:user name="guest" password="guest"
authorities="ROLE_GUEST" />
</security:user-service>
</security:authentication-provider>
</security:authentication-manager>

这工作正常,即发送以下请求授予我访问所需资源的权限(编码字符串为 admin:admin):

GET /user/v1/Tyler HTTP/1.1
Authorization: Basic YWRtaW46YWRtaW4=

发送以下请求会出现错误 403(编码字符串为 guest:guest):

GET /user/v1/Tyler HTTP/1.1
Authorization: Basic Z3Vlc3Q6Z3Vlc3Q=

但是,发送一个请求,其中所提供的用户名包含在 UserService 中,不会像我预期的那样(或至少是期望的)导致错误 403,而是继续提示输入用户名和密码。例如。 (编码字符串为 user:user):

GET /user/v1/Tyler HTTP/1.1
Authorization: Basic dXNlcjp1c2Vy

当提供无法识别的用户凭据时,是否需要额外的配置来响应错误 403?我该怎么做呢?

最佳答案

首先,

403 Forbidden 应该在用户已经通过身份验证但无权执行特定操作时使用。在您的示例中,guest 已成功通过身份验证,但未被授予查看页面的权限,因为他只是客人。

您应该使用 401 Unauthorized 表示您的用户未成功通过身份验证。

有关 HTTP 错误代码的更多信息:http://en.wikipedia.org/wiki/HTTP_401#4xx_Client_Error

其次,

您可以通过扩展 BasicAuthenticationFilter 来指定您的自定义行为。有 protected void onUnsuccessfulAuthentication(HttpServletRequest request, HttpServletResponse AuthenticationException failed) 方法,您可以重写该方法并做任何适当的事情。在默认实现中,该方法为空。

关于注入(inject)自定义过滤器的 Spring Security 文档:CLICK

编辑:

每当您的身份验证输入无效时,Spring Security 会做什么:

public class BasicAuthenticationEntryPoint implements AuthenticationEntryPoint {
...
public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException)
throws IOException, ServletException {

response.addHeader("WWW-Authenticate", "Basic realm=\"" + realmName + "\"");
response.sendError(HttpServletResponse.SC_UNAUTHORIZED, authException.getMessage());

因此,默认行为是正确的。向用户发送 401,并要求其提供有效的登录名/凭据。

覆盖之前,尝试了解默认行为。源代码:CLICK

关于rest - Spring Security 认证 RESTful Web 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13435743/

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