没有弹簧安全性的 ldap 和 JWT 身份验证

Posted

技术标签:

【中文标题】没有弹簧安全性的 ldap 和 JWT 身份验证【英文标题】:ldap & JWT authentication without spring security 【发布时间】:2017-09-22 23:22:53 【问题描述】:

我正在尝试创建一个安全模块,该模块将根据 LDAP 检查用户凭据(登录时),并在成功登录时生成 JWT 以进一步请求服务器。

目前我的模块是这样工作的: 我有 3 个其他 API 端点来提供不受保护的身份验证(登录、验证 JWT、注销),因为任何人都必须能够访问这些端点, 以及 1 个通过 JWTAuthenticationProvider 受弹簧安全保护的 userUpdate 端点

所有与 JWT 相关的东西都准备好了,现在我只需要创建一个方法来检查 LDAP 是否用户和密码正确。但我在理解我应该怎么做时遇到了一些麻烦

我已经拥有主用户并传递给 ldap,但是我发现的关于 ldap 身份验证的大多数示例都使用 spring 安全性,我认为在这种情况下不是这样做的方法,因为我需要验证匹配us/pass 仅在登录时(而不是安全地保护我的端点)。

谁能告诉我我应该如何进行验证?有什么我不清楚的吗?请提问、评论和回答。

谢谢


哦,一个编辑:

@Override
public AuthenticationResponse login(AuthenticationRequest authenticationRequest) 
    checkNotNull(authenticationRequest, "The authenticationRequest is a required argument!");

    AuthenticationResponse authenticationResponse = AuthenticationResponse.builder().build();

    //currently a pseudo authentication, here is where i should authenticate against LDAP
    Optional<Usuario> optionalUsuario = service.findByNombreUsuario(authenticationRequest);

    if (optionalUsuario.isPresent()) 
        Usuario usuario = optionalUsuario.get();

        String token = JwtTokenUtil.generateToken(authenticationRequest);
        authenticationResponse.setAuthenticationToken(token);

        repository.saveToken(UserToken.builder()
                .nombreUsuario(usuario.getNombreUsuario())
                .roles(usuario.getRoles())
                .build(), token);

如您所见,我打算仅在登录时对 ldap 进行身份验证,并且仅检查用户和密码是否正确,我将使用其他数据库管理角色和权限


另一个编辑:我有一些基本的 ldap 结构,用于使用 spring 安全性的 ldap 身份验证,但我总是得到错误的凭据


再次编辑:我设法使它与 spring security 一起工作,但是(如预期的那样)我的团队告诉我们,我们需要在没有 spring security 的情况下实现该身份验证,以与我们的自定义角色加载器和令牌创建集成

【问题讨论】:

嗨,费尔南多,您找到解决问题的方法了吗?如果是这样,请与我们分享。最好的。 【参考方案1】:

使用http://docs.spring.io/spring-security/site/docs/current/apidocs/org/springframework/security/ldap/authentication/LdapAuthenticationProvider.html 进行身份验证并从LDAP 获取角色,应该使用spring security 来完成,我可能错过了smth 但你能解释一下为什么你不想使用它,因为它是安全标准

【讨论】:

因为我已经有一个身份验证提供程序(一个 JWT)来保护我的 api 的用户端点 首先你可以配置多个身份验证提供程序,其次你可以使用 RememberMeAuthenticationFilter 进行 jwt 令牌处理,希望它有意义 mmm 没有想过拥有多个身份验证提供程序。在那张纸条上,我将如何配置安全性?我的意思是`@Override protected void configure(AuthenticationManagerBuilder auth) throws Exception auth.authenticationProvider(provider); ` 根据提供者进行配置。我还可以拥有多个这些配置吗? ***.com/questions/35363924/… 希望最后的答案对您有所帮助 - 在我之前从未这样做过

以上是关于没有弹簧安全性的 ldap 和 JWT 身份验证的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 ldap 获得具有弹簧安全性的权限

如何绕过特定域的经过身份验证的端点上的弹簧安全性?

Spring Webflux + LDAP/Kerberos 安全性

Spring 5 LDAP 身份验证和 JWT 令牌作为响应

使用 JWT Auth 对 LDAP 服务进行身份验证

弹簧安全过滤器没有启动