我正在开发一个简单的 Web 应用程序,用于学习目的,使用 Angular 作为前端,使用 Java Spring 作为后端。我没有需要你们帮助我解决的特定问题,相反,我有一个关于 OAuth2 身份验证的问题。
我已在 Azure AD 中注册了我的 Angular SPA(授权代码流 + PKCE),我设置了角色,一切正常。我的问题是,当经过身份验证的用户 ping 我的后端时,我该怎么办?我的后端没有有关用户的信息。
我想到了一个解决方案,制作一个网络过滤器,每次经过身份验证的用户 ping 任何需要用户进行身份验证的端点时,检查数据库是否该用户存在(通过用户名),如果不存在则保存他。我很确定这会起作用,但我不认为这是最好的解决方案,考虑到我的 Web 过滤器必须从数据库中读取每个传入的 HTTP 请求,并偶尔写入数据库(如果用户首次登录)。
我不应该担心性能问题,因为我只是为了学习目的而构建它,但尽管如此,我还是想以正确的方式做到这一点。我尝试以多种方式进行谷歌搜索,但我想我没有使用正确的关键字来找到我要找的东西。任何意见或建议将不胜感激!谢谢!
编辑:我按照这篇文章实现了 OAuth2 + OIDC 身份验证和授权,我在后端的安全配置是相同的: https: //ordina-jworks.github.io/security/2020/08/18/Securing-Applications- Azure-AD.html
我正在尝试使用 oauth2 配置 spring security,但是我对这个主题很陌生并且遇到了问题。
我有一个弹簧后端和一个有角度的前端。我使用 Azure AD(带有 PKCE 的授权代码流)进行用户身份验证 (OIDC) 和授权。在我的应用程序中,我的数据库中有一个用户表,我想保存数据库中不存在的任何用户。
基本上,这意味着我希望所有使用我的 API 的用户(如果尚未注册)自动注册(保存在数据库中),有点像自动注册功能。
到目前为止,我尝试的是基于 AuthenticationSuccessEvent 配置 ApplicationListener,但是我遇到了问题(我假设是由于竞争条件)。当我加载 Angular 应用程序并登录到 Azure AD 时,我会被重定向到一个页面,该页面会自动向后端发送几个 http 请求。当第一个请求通过过滤器链并命中 ApplicationListener 时,它会注册发现数据库中不存在具有指定用户名的用户并注册他,但当发生这种情况时,其他请求已经通过了if 语句并最终再次注册用户。所以基本上同一个用户注册了 6 次,这显然不是我们想要的行为。下面是 ApplicationListener 和 SecurityConfig。如果您需要任何其他信息,请发表评论,我将更新问题。
另外,如果你们知道更好的“自动注册用户”方法,也请随时分享!
@Component
public class MyAuthenticationSuccessListener implements ApplicationListener<AuthenticationSuccessEvent> {
private final UserRepository userRepository;
public MyAuthenticationSuccessListener(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Override
public void onApplicationEvent(AuthenticationSuccessEvent event) {
Authentication authentication = event.getAuthentication();
if (!userRepository.findByUsername(((Jwt) authentication.getPrincipal()).getClaimAsString("preferred_username")).isPresent()) {
User newUser = new User();
newUser.setUsername(((Jwt) authentication.getPrincipal()).getClaimAsString("preferred_username"));
newUser.setName(((Jwt) authentication.getPrincipal()).getClaimAsString("given_name"));
newUser.setSurname(((Jwt) …Run Code Online (Sandbox Code Playgroud) java spring-security oauth-2.0 azure-active-directory spring-boot