Java 用户状态的自定义实现
我正在尝试实现一个自定义的安全实现,它使用一个额外的字段(枚举,该字段说明用户的当前状态,例如,预注册、活动、禁用、密码更改等) 我想检查这个用户的状态,抛出一个自定义异常并发送一个不同的HttpStatus(不是403)。我已将控件添加到Java 用户状态的自定义实现,java,spring,spring-security,Java,Spring,Spring Security,我正在尝试实现一个自定义的安全实现,它使用一个额外的字段(枚举,该字段说明用户的当前状态,例如,预注册、活动、禁用、密码更改等) 我想检查这个用户的状态,抛出一个自定义异常并发送一个不同的HttpStatus(不是403)。我已将控件添加到UserDetailsService,并添加了以下行: @Service public class UserDetailsServiceImpl implements UserDetailsService { private UserReposito
UserDetailsService
,并添加了以下行:
@Service
public class UserDetailsServiceImpl implements UserDetailsService {
private UserRepository userRepository;
public UserDetailsServiceImpl(UserRepository userRepository){
this.userRepository = userRepository;
}
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException{
ApplicationUser user = userRepository.findByUsername(username);
if(user == null) throw new UsernameNotFoundException(username);
if(user.getUserStatus()==UserStatus.PRE_REGISTRATION) throw new UserRegistrationNotCompleted(username);
return new org.springframework.security.core.userdetails.User(user.getUsername(),user.getPassword(),Collections.emptyList());
}
}
但是,我不能在这里抛出我自己的异常,因为我已经实现了UserDetailsService
,即使我在自定义异常中扩展了AuthenticationException
我不想使用
UsernameNotFoundException
向客户端发送自定义消息。我想在这里发送一个单独的HttpStatus
异常。你说你不能抛出自己的异常是什么意思?你对此有什么问题?你可以抛出任何你想要的RuntimeException
,实际上我想要的是发送一个新的HttpStatus作为对请求的响应。我只是尝试添加一个新的AuthenticationException类型并尝试捕获它,但它不允许我这样做,因为我正在实现一个接口。抛出一个运行时只是一种解决方法,必须有一种方法在spring框架中实现这一点。想知道怎么做。
@Service
public class UserDetailsServiceImpl implements UserDetailsService {
private UserRepository userRepository;
public UserDetailsServiceImpl(UserRepository userRepository){
this.userRepository = userRepository;
}
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException{
ApplicationUser user = userRepository.findByUsername(username);
if(user == null) throw new UsernameNotFoundException(username);
if(user.getUserStatus()==UserStatus.PRE_REGISTRATION) throw new UserRegistrationNotCompleted(username);
return new org.springframework.security.core.userdetails.User(user.getUsername(),user.getPassword(),Collections.emptyList());
}
}