【发布时间】:2018-08-07 03:03:42
【问题描述】:
我正在 Spring 中实现一些 REST 服务,并且在某些情况下需要拒绝用户成功登录。
我已经实现了我的 UserDetailsService 并编写了 loadUserByUsername(String username) 方法,但是,当用户获得正确的身份验证时,我需要进行另一次验证,如果失败,拒绝访问。
为此,我实现了一个侦听器来检测正确的身份验证:
@组件 公共类 LoginSuccessListener 实现 ApplicationListener{ @自动连线 许可证控制服务许可证控制服务;
@Override
public void onApplicationEvent(InteractiveAuthenticationSuccessEvent e){
User user = (User)e.getAuthentication().getPrincipal();
//Here I want to reject the access because of whatever logic
}
我需要确保在用户获得正确授权时应用可能拒绝访问的逻辑,这就是为什么我需要在收到此事件时放置逻辑。 有什么办法吗?
【问题讨论】:
-
UserDetailsService仅用于身份验证目的。您所说的似乎是授权(例如,检查某人是否有权访问网页)。请说明您要拒绝某人的标准。这样更容易回答问题。 -
问题是......我需要验证登录的用户不超过一定数量的用户。所以我想到了我解释的这个解决方案,因为在我触发事件(onApplicationEvent)之前我不知道有新用户登录。我的想法是在那里进行验证,但是如果他/她超出了登录用户的限制,我必须能够拒绝该用户
-
如果您能够跟踪当前登录的用户,我可能会在
UserDetailsService中将用户设置为禁用。检查UserDetails.isEnabled()。 -
我已经尝试过你所说的,它拒绝访问用户(这就是我想要的),但是 spring 返回一个 401。我想自定义响应,所以客户知道为什么他被拒绝了……这可能吗?我所做的是,在实现 UserDetailsService 的类中,当返回 User 类时,在 enabled 属性中使用 false 对其进行实例化。 .. 向请求者返回 401。
标签: spring authentication spring-boot authorization