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

如何在Spring Security中为特殊情况下的身份验证失败定制http状态码?

曹渝
2023-03-14

我正在编写一个RESTful服务,没有用户界面,所以没有错误页面。当我得到一个过期的令牌时,我想设置一个特定的错误代码和消息,这样调用者就知道它需要再次登录。(我不担心给黑客额外的信息,因为我只有在令牌具有正确的数字签名时才会看到这种情况。)我尝试了三种不同的方法。

  1. 抛出CredentialsExpiredException,它扩展了AuthenticationException。我安装了一个AuthenticationEntryPoint来处理异常,但Spring Security向它发送了一个不同的异常。因此,无法区分自定义失败和标准身份验证拒绝

我将我的AuthenticationEntryPoint安装到我的Web安全配置中,如下所示:

@SuppressWarnings("HardcodedFileSeparator")
@Override
protected void configure(final HttpSecurity http) throws Exception {
  log.trace("Configuring WebSecurityConfig");

  /* The /view/** path requires no authentication. The others start with /admin, and require the ADMIN role. */
  http
      .csrf()
        .disable()
      .cors()
        .disable()
      .formLogin()
        .disable()
      .authorizeRequests()
        .antMatchers("/admin/**")
          .hasRole("ADMIN")
        .antMatchers("/view/**")
          .permitAll()
      .anyRequest()
        .authenticated()
      .and()
        .sessionManagement()
        .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
      .and()
      .exceptionHandling()
        .authenticationEntryPoint(authenticationEntryPoint)
      .and()
        .addFilterBefore(requestFilter, UsernamePasswordAuthenticationFilter.class)
  ;
}

我在上面最后一行中安装的请求过滤器,是我抛出异常的地方,我认为这个异常会被发送到身份验证入口点

我不知道为什么@ResponseStatus注释不起作用。我不知道如何在Spring Security中设置特定的错误代码。

我创建了一个最小的可复制测试用例,您可以在https://github.com/SwingGuy1024/SecurityQuestion自述。md文件解释了如何使用它,并记录了它实现的endpoint。它使用Java12,但代码将在Java8下编译。

(我知道身份验证失败通常不会返回太多信息,以避免给黑客提供任何有用的信息,但我只想告诉用户,他们的JWT令牌已过期,他们需要重新登录。上面的测试用例不使用JWT,因为不必重现问题。)

共有1个答案

霍浩皛
2023-03-14

我从未找到更改HttpStatus代码的方法,但我确实找到了通知调用方令牌已过期的方法。当我检测到过期令牌时,我会在响应中添加一个指定过期令牌的头。这不完全是我想要的,但它做到了。

有一次,我能够使用这个头来更改AuthenticationEntryPoint类中的响应代码。但我又试了一次,结果没用。我不知道我改变了什么来打破这个,但这无关紧要。

 类似资料:
  • 问题内容: 这是我的情况: 一个Web应用程序对许多应用程序执行某种SSO 登录的用户,而不是单击链接,该应用就会向正确的应用发布包含用户信息(名称,pwd [无用],角色)的帖子 我正在其中一个应用程序上实现SpringSecurity以从其功能中受益(会话中的权限,其类提供的方法等) 因此,我需要开发一个 自定义过滤器 -我猜想-能够从请求中检索用户信息,通过自定义 DetailsUserSe

  • 问题内容: 当前,当我发出此SQL时,它将获得不同的用户名。 我有一些不同的用户名,它们代表组,例如。 我想将所有其他用户名(恰好是数字)分组为一个组,例如 我可以实现以下目标吗? 编辑:从答案修改的查询 问题答案: @bfavaretto很好(对他+1),但是如果您不了解前缀或前缀不同,则可以使用类似以下内容的方法:

  • Tweepy API请求twitter return me Twitter错误响应:状态代码=401。 这是我的实际代码: 我曾试图用tweepy软件包删除推文,并获得了所有必需的密钥。镊子包装不起作用吗?有人能帮我解决这个问题吗。

  • 遵循这个指南:https://www.youtube.com/watch?v=bqkt6eSsRZs 添加了从laravel docs的auth路由 创建登录/注册视图 创建 /home路线 自定义AuthController: 尝试访问身份验证/登录时,我遇到以下错误: 请求中出现错误异常。php第775行:。。未根据请求设置会话存储。 已将身份验证路由移动到中间件组。 成功注册,在数据库和会话

  • 我做了spring saml教程中描述的所有事情,除了添加 在pom.xml中克服一个W3.DOM类找不到的问题。当我运行示例项目时,我在浏览器中得到,同时。 第2天:运行,并将替换为新生成的samlkeystore.jks。: 那么我有: 然后使用在使用时输入的密码更改密码: 则控制台显示: 因此,我将更改为: 控制台显示: 我不明白为什么SP从IdP元数据中获得公钥,却仍然需要IdP的ca.c

  • “laravel/框架”:“5.7.*” “tymon/jwt认证”:“开发人员开发” 我正在尝试创建一个添加了自定义声明的JWT令牌,而不使用auth(这意味着我不希望从凭据创建令牌)。这是为了创建不需要登录的令牌,例如忘记/重置密码等。 使用Tymon/JWTAuth(https://github.com/tymondesigns/jwt-auth)由于最新的Laravel存在问题,因此建议加