spring - 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);
}
}
解决方案
我发现了错误:
片段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_
到字符串中。
推荐阅读
- python - 删除 matplotlib seaborn 点图中的垂直线
- javascript - 将 typescript 项目与托管在本地 Apache 服务器上的现有 PHP 应用程序集成和调试
- ansible - 为剧本设置 Ansible 环境
- arrays - 出现错误“无法将'listItem'类型的值转换为预期的参数类型'String?'”
- python - ModuleNotFoundError:没有名为“pyarrow._dataset”的模块
- sorting - 根据Google Sheets中选择主题的组合查询数据
- python - 如何让 svgwrite.drawing() 对象在每次迭代时重新初始化?
- r - R命令multcompBoxplot并排有两个图
- java - Gradle JVM 版本与使用的 JDK 版本不匹配
- if-statement - MYSQL检查所有行并满足条件