Java spring安全性:用于不同类型禁用的自定义消息
假设用户可以被禁用,因为他没有点击电子邮件验证链接,他没有为服务付费,他没有设置2FA等。我需要一种方法,为不同的原因向用户发送不同的消息 当我使用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,然后在任何消息中抛出任何异常,但我必须微调错误记录机制,以防止记录这些异
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输出流。我猜您也可以为每个具体的异常类型注册一个处理程序。见以下示例: