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

从Spring-Security筛选器引发用户定义的异常

卫博
2023-03-14

我创建了一个自定义异常类

public class DataException extends Exception {

private final String errorCode;

private final String errorMessage;

private final HttpStatus httpStatus;

/**
 */
public DataException( String errorCode, String errorMessage, 
HttpStatus httpStatus )
{
    this.errorCode = errorCode;
    this.errorMessage = errorMessage;
    this.httpStatus = httpStatus;
}

并且在抛出异常时将此异常类发送到客户端。我还使用spring-security和jwt进行身份验证和授权进程。

如何捕获安全过滤器抛出异常并创建用户定义的异常并将其发送到客户端?

我的过滤方法,

 @Override
public Authentication attemptAuthentication( HttpServletRequest request, HttpServletResponse response )
{
    try
    {
        UserModel credentials = new ObjectMapper().readValue(request.getInputStream(), UserModel.class);

        return authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(credentials.getEmailId(),
                credentials.getPassword(), new ArrayList<>()));
    }
    catch( IOException | AuthenticationException e )
    {
        LOGGER.error("Exception", "Invalid EmailId/Password");
        throw new BadCredentialsException("Invalid EmailId/password");
    }
}

共有1个答案

陈飞语
2023-03-14

我从来没有发现从身份验证/授权筛选器中抛出异常非常有用。我只是记录错误,设置适当的响应状态和消息,并返回null,因为没有任何进一步的意义。

abstractauthenticationprocessingfilter适当地处理null

我发现这种方法比抛出异常更干净&然后处理这些异常,因为通常只有一两个过滤器。

还可以使用拒绝访问处理程序方法。您只需设置适当的Http状态,而不是重定向到页面。

 类似资料:
  • 我创建了一个自定义筛选器,用于获取令牌,然后用与令牌相关的角色填充身份验证对象 然后,我将该过滤器添加到springsecuritycontext中,如下所示: 应用程序已经存在,我只是尝试添加Spring Security层。Spring Security版本为4.2.3。在尝试实现此功能的几天后,不会加载,因此不会筛选任何请求。请帮帮忙。

  • 我已经检查了OAuth2AuthenticationProcessingFilter和从request中提取的令牌,它返回了一个相同的承载令牌,并以此构建用户详细信息并将其注入到SecurityContextHolder中。 有没有什么方法可以将这种过滤器与oauth2方法一起使用?

  • 我正在使用Spring启动和Spring安全创建带有JWT令牌基础安全性的rest API。当令牌无效时,我想抛出自定义异常。因此,我创建了自定义异常类,每当我抛出该异常时,我每次都会在邮递员中收到空白响应。 我要扔这个 因为我发送的令牌没有承载关键字。它在控制台中打印,但不包括邮递员。 邮递员每次都有空白回复 JwtAuthenticationEntryPoint类 WebSecurityCon

  • 我有一个Spring Boot应用程序,在其中我试图创建一个自定义安全过滤器,如下所示:

  • 我希望每个请求都能收到一些信息,因此我认为与其为每个请求提供一个函数并分别从请求中获取这些信息,不如使用一个过滤器<所以每一个请求都会通过这个过滤器,我就能得到我想要的 问题是:如何编写自定义筛选器 假设它不像任何预定义的Spring Security过滤器,它是全新的。