小编Ale*_*dar的帖子

将经过身份验证的用户保存到来自 Azure AD 的数据库

我正在开发一个简单的 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

java azure oauth-2.0 jwt angular

6
推荐指数
1
解决办法
400
查看次数

自动在资源服务器中注册用户

我正在尝试使用 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

5
推荐指数
1
解决办法
823
查看次数