【问题标题】:Spring Security custom validation without using user password involved不涉及用户密码的 Spring Security 自定义验证
【发布时间】:2017-12-25 02:02:44
【问题描述】:

我想知道在 Spring Security 中是否可以锁定 rest api 的所有端点,并通过执行自定义验证而不使用用户名和密码来登录。

这就像创建一个接收令牌而不是用户/通行证的自定义验证方法。然后该方法将使用已经验证调用者的第三方验证令牌。

这对 OAuth2 来说听起来很熟悉,只是后端 API 需要在 spring 之前是安全的,同时它不是 OAuth2 客户端:

  1. 我们正在构建登录功能。
  2. 我们有一个客户端(移动应用)、后端(类似于 Spring MVC 的 REST 端点)和一个用于 OAuth2/OpenIdConnect 流的 AuthProvider。
  3. OAuth/OpenIDConnect 流仅发生在移动设备和 OpenIDProvider 之间。 (从移动设备到后端进行初始调用,以提供 oauth 流的一些详细信息)
  4. 一旦授权成功,移动应用程序会收到一个auth_code,然后才会从应用程序调用后端“登录”,这意味着验证auth_code,交换access_token,并创建用户会话。 (我们需要开会)。
  5. 正如您所见,后端类型的“登录”只需要接收 auth_code,并在创建会话之前使用 AuthProvider 对其进行验证。

非常感谢!

非常感谢任何 cmets 或参考资料。

【问题讨论】:

    标签: spring rest spring-security oauth-2.0 spring-security-oauth2


    【解决方案1】:

    Spring Security 通过查看SecurityContextHolder 中的SecurityContext 来确定用户是否经过身份验证。这意味着您可以使用以下方式对用户进行身份验证:

    boolean userIsAuthenticated = ...
    if(userIsAuthenticated) {
        Authentication request = new UsernamePasswordAuthenticationToken(name, password);
        Authentication result = ...
        SecurityContext context = SecurityContextHolder.createEmptyContext();
        context.setAuthentication(result);
        SecurityContextHolder.setContext(context);
    }
    

    【讨论】:

    • 非常感谢 Rob Winch!按照您的建议,我能够使用自定义过滤器和提供程序来处理自定义验证。
    【解决方案2】:

    Spring Security 是一个非常灵活的框架,它发布了多种接口,允许用户根据需要自定义行为。

    我推荐以下资源来了解如何去做:

    【讨论】:

    • 非常感谢您的回复!链接非常有用,视频也很棒!
    猜你喜欢
    • 2011-12-01
    • 2016-08-23
    • 2021-12-05
    • 2011-07-26
    • 2014-04-20
    • 2014-12-13
    • 2018-12-08
    • 2016-04-30
    • 1970-01-01
    相关资源
    最近更新 更多