【问题标题】:How to reject access in Spring after successful authentication成功认证后如何在Spring中拒绝访问
【发布时间】:2018-08-07 03:03:42
【问题描述】:

我正在 Spring 中实现一些 REST 服务,并且在某些情况下需要拒绝用户成功登录。

我已经实现了我的 UserDetailsS​​ervice 并编写了 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。我想自定义响应,所以客户知道为什么他被拒绝了……这可能吗?我所做的是,在实现 UserDetailsS​​ervice 的类中,当返回 User 类时,在 enabled 属性中使用 false 对其进行实例化。 .. 向请求者返回 401。

标签: spring authentication spring-boot authorization


【解决方案1】:

如果有人需要相同的行为,我会发布我采用的解决方案:

我所做的是,在实现 UserDetailsS​​ervice 的类中,当返回 User 类时,在 enabled 属性处使用 false 实例化它......这会向请求者返回 401。

我还实现了一个CustomAuthenticationEntryPoint,它扩展了BasicAuthenticationEntryPoint,并使用了一个覆盖的comence方法。每当Spring返回认证错误时都会调用该方法,因此,在该方法中,我可以查询AuthenticationException的类型,并根据它决定和修改返回的状态。

【讨论】:

    猜你喜欢
    • 2010-11-19
    • 2017-10-01
    • 1970-01-01
    • 2012-02-14
    • 1970-01-01
    • 2017-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多