首页 > 解决方案 > Spring Boot 两种身份验证方式:结合 LDAP 和基于令牌的身份验证

问题描述

对于我的 RESTfull 应用程序,我们需要有两种身份验证。一种是针对所有内部员工的 LDAP。这是最近实施的并且工作正常。对于所有外部员工,我们需要一些基于令牌的身份验证。

我的意思是什么?这些员工将通过电子邮件发送一个生成的令牌,该令牌与我们的数据库中的到期日期一起存储。员工应该能够使用该令牌“登录”。那么实现这样的事情的最佳方法是什么?

我的第一个想法是构建一个额外的ExternalAuthenticationProvider并将其添加到安全配置中。这行得通,用户可以使用令牌作为他们的 登录username,他们得到 JWT。但是当他们喜欢访问任何资源时,响应是HTTP 403-error。对我来说,这个实现看起来像一个肮脏的黑客,我不喜欢这种方法,也许有更好的方法。

感谢您的任何建议。

@Component
public class ExternalAuthenticationProvider implements AuthenticationProvider {
    @Autowired
    private ExternalEffortLinkManagementRepository externalEffortLinkManagementRepository;

    @Override
    public Authentication authenticate(Authentication auth) throws AuthenticationException {
        Collection<GrantedAuthority> gas = new HashSet<GrantedAuthority>();
        String userToken = auth.getName();

        ExternalEffortLinkManagement token = externalEffortLinkManagementRepository.getByLink(userToken);

        if (token != null && token.isActive()) {
            gas.add(new SimpleGrantedAuthority(SecurityConstants.ROLE_EXTERNAL));
            return new UsernamePasswordAuthenticationToken(userToken, null, gas);
        } else {
            throw new
                    BadCredentialsException("External system authentication failed");
        }
    }

    @Override
    public boolean supports(Class<?> auth) {
        return auth.equals(UsernamePasswordAuthenticationToken.class);
    }
}

标签: springspring-bootauthentication

解决方案


我发现了错误:

片段1:

gas.add(new SimpleGrantedAuthority(SecurityConstants.ROLE_EXTERNAL)); // ROLE_EXTERNAL = "EXTERNAL"

被替换为

片段 2:

gas.add(new SimpleGrantedAuthority("ROLE_" + SecurityConstants.ROLE_EXTERNAL));

我为 LDAP 身份验证使用了相同的代码(片段 1),所以我只是将字符串传递"EXTERNAL"SimpleGrantedAuthority构造函数。但是我在我的 . 中这样做了CustomLdapAuthoritiesPopulator,好像 springROLE_在隐藏代码中以某种方式添加了 -prefix。但这不适用于 my ExternalAuthenticationProvider,有必要添加ROLE_到字符串中。


推荐阅读