我在Spring中实现了一些REST服务,并且在某些情况下需要拒绝成功登录用户。
我已经实现了 UserDetailsService 并编写了 loadUserByUsername(String username)方法,但是,当用户获得正确的身份验证时,我需要进行另一次验证,如果它失败了,拒绝访问。
为此,我实现了一个侦听器来检测正确的身份验证:
@Component 公共类LoginSuccessListener实现ApplicationListener { @Autowired LicenseControlService licenseControlService;
@Override
public void onApplicationEvent(InteractiveAuthenticationSuccessEvent e){
User user = (User)e.getAuthentication().getPrincipal();
//Here I want to reject the access because of whatever logic
}
我需要确保在用户获得正确授权时应用可能拒绝访问的逻辑,这就是我收到此事件时需要放置逻辑的原因。 有没有办法做到这一点?
答案 0 :(得分:0)
我发布了我采用的解决方案,以防有人需要相同的行为:
我所做的是,在实现UserDetailsService的类中,在返回User类时,在enabled属性中使用false实例化它...将401返回给请求者。
我还实现了一个CustomAuthenticationEntryPoint,它扩展了BasicAuthenticationEntryPoint,并使用了重写方法。 Spring每次返回一个身份验证错误时都会调用该方法,因此,在此方法中,我可以查询AuthenticationException的类型,并根据它来决定和修改返回的状态。