Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java spring安全性:用于不同类型禁用的自定义消息_Java_Spring_Spring Boot_Spring Security - Fatal编程技术网

Java spring安全性:用于不同类型禁用的自定义消息

Java spring安全性:用于不同类型禁用的自定义消息,java,spring,spring-boot,spring-security,Java,Spring,Spring Boot,Spring Security,假设用户可以被禁用,因为他没有点击电子邮件验证链接,他没有为服务付费,他没有设置2FA等。我需要一种方法,为不同的原因向用户发送不同的消息 当我使用org.springframework.security.core.userdetails.User的子类时,我只能设置enabled=false,spring将提供一些默认消息 我尝试的另一个选项是实现UserDetailsService.loadUserByUsername,然后在任何消息中抛出任何异常,但我必须微调错误记录机制,以防止记录这些异

假设用户可以被禁用,因为他没有点击电子邮件验证链接,他没有为服务付费,他没有设置2FA等。我需要一种方法,为不同的原因向用户发送不同的消息

当我使用
org.springframework.security.core.userdetails.User
的子类时,我只能设置
enabled=false
,spring将提供一些默认消息

我尝试的另一个选项是实现
UserDetailsService.loadUserByUsername
,然后在任何消息中抛出任何异常,但我必须微调错误记录机制,以防止记录这些异常,所以我认为这不是spring的做法


spring处理这种情况的方法是什么?

据我所知,最好的方法是通过添加额外的身份验证检查、抛出适当的异常,然后为这些异常编写处理程序来增强身份验证提供程序

我们可以扩展和使用它的方法

我们可以抛出任何自定义异常或由适当的令牌授予者捕获的异常。下面是一个示例:

@Override
protected void additionalAuthenticationChecks(final UserDetails userDetails, final UsernamePasswordAuthenticationToken authentication) {
    final User user = userDao.findByUsername(userDetails.getUsername())
                             .orElseThrow(() -> new BadCredentialsException("Incorrect username or password."));

    if (DISABLED == user.getStatus() || SUSPENDED == user.getStatus()) {
        throw new BadCredentialsException(String.format("User account with ID [%s] is %s.", user.getUserUuid(), user.getStatus()));
    }

    if (2FA_NOT_SET == user.getStatus()) {
        throw new BadCredentialsException("Account is disabled because two-factor authentication is not set.");
    }
在本例中,将捕获BadCredentialsException并抛出InvalidGrantException(OAuth2Exception的子项)

然后,我们可以通过扩展来编写自定义异常处理程序。在这里,我们可以记录异常并准备自定义错误响应。以下是供参考的示例代码:

@ExceptionHandler({OAuth2Exception.class})
public ResponseEntity<Object> handleOAuth2Exception(final OAuth2Exception exception, final WebRequest request) {

    return handleExceptionInternal(exception,
                                   ErrorOutputDto.create(exception.getOAuth2ErrorCode(), exception.getMessage()),
                                   new HttpHeaders(),
                                   HttpStatus.valueOf(exception.getHttpErrorCode()),
                                   request);
}
@ExceptionHandler({OAuth2Exception.class})
公共响应handleOAuth2Exception(最终OAuth2Exception异常,最终WebRequest请求){
返回句柄异常内部(异常,
ErrorOutputDto.create(exception.getOAuth2ErrorCode(),exception.getMessage()),
新的HttpHeaders(),
HttpStatus.valueOf(exception.getHttpErrorCode()),
请求);
}

据我所知,最好的方法是通过添加额外的身份验证检查、抛出适当的异常,然后为这些异常编写处理程序来增强身份验证提供程序

我们可以扩展和使用它的方法

我们可以抛出任何自定义异常或由适当的令牌授予者捕获的异常。下面是一个示例:

@Override
protected void additionalAuthenticationChecks(final UserDetails userDetails, final UsernamePasswordAuthenticationToken authentication) {
    final User user = userDao.findByUsername(userDetails.getUsername())
                             .orElseThrow(() -> new BadCredentialsException("Incorrect username or password."));

    if (DISABLED == user.getStatus() || SUSPENDED == user.getStatus()) {
        throw new BadCredentialsException(String.format("User account with ID [%s] is %s.", user.getUserUuid(), user.getStatus()));
    }

    if (2FA_NOT_SET == user.getStatus()) {
        throw new BadCredentialsException("Account is disabled because two-factor authentication is not set.");
    }
在本例中,将捕获BadCredentialsException并抛出InvalidGrantException(OAuth2Exception的子项)

然后,我们可以通过扩展来编写自定义异常处理程序。在这里,我们可以记录异常并准备自定义错误响应。以下是供参考的示例代码:

@ExceptionHandler({OAuth2Exception.class})
public ResponseEntity<Object> handleOAuth2Exception(final OAuth2Exception exception, final WebRequest request) {

    return handleExceptionInternal(exception,
                                   ErrorOutputDto.create(exception.getOAuth2ErrorCode(), exception.getMessage()),
                                   new HttpHeaders(),
                                   HttpStatus.valueOf(exception.getHttpErrorCode()),
                                   request);
}
@ExceptionHandler({OAuth2Exception.class})
公共响应handleOAuth2Exception(最终OAuth2Exception异常,最终WebRequest请求){
返回句柄异常内部(异常,
ErrorOutputDto.create(exception.getOAuth2ErrorCode(),exception.getMessage()),
新的HttpHeaders(),
HttpStatus.valueOf(exception.getHttpErrorCode()),
请求);
}

首先注册故障处理程序,然后根据异常类型将相关响应写入HttpServletResponse输出流。我猜您也可以为每个具体的异常类型注册一个处理程序。请参见:处的示例:作为起点,注册故障处理程序,然后根据异常类型将相关响应写入HttpServletResponse输出流。我猜您也可以为每个具体的异常类型注册一个处理程序。见以下示例: