【问题标题】:Correct way to check the existance of a user in a database after OAuth2 authenticationOAuth2身份验证后检查数据库中用户是否存在的正确方法
【发布时间】:2023-04-07 01:27:01
【问题描述】:

我正在开发一个使用 SpringBoot 和 OAuth2 的 Web 应用程序,该应用程序只需要通过 google 进行身份验证。它可以只允许我大学的成员访问,但不允许任何成员访问,他们必须在数据库中注册,特别是他们的电子邮件。所以我创建了一个实体类用户:

User(id, email, role)

在此表中,具有 ADMIN 角色的用户可以添加、删除和更新其角色,因此它必须具有与普通用户不同的仪表板。我开始创建我的自定义 OAuthUser,在这里我只存储来自经过身份验证的用户的名称和电子邮件。由于 Google 的限制,它只允许我的组织的成员,所以在这里我必须实现检查该经过身份验证的用户的电子邮件是否在数据库中的功能,然后检查他的角色并允许访问不同的功能。这就是我被卡住的部分,我不知道如何检查数据库中该电子邮件的存在。

这是我的 CustomOAuthUser:

    private OAuth2User oAuth2User;

    public CustomOAuth2User(OAuth2User oAuth2User) {
        this.oAuth2User = oAuth2User;
    }

    @Override
    public Map<String, Object> getAttributes() {
        return oAuth2User.getAttributes();
    }

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return oAuth2User.getAuthorities();
    }

    @Override
    public String getName() {
        return oAuth2User.getAttribute("name");
    }

    public String getFullname(){
        return oAuth2User.getAttribute("name");
    }

    public String getEmail(){
        return oAuth2User.<String>getAttribute("email");
    }
}

这是我的网络安全配置:

public class WebSecurity extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception{
        http.authorizeRequests()
                .antMatchers("/user/**").hasAnyRole("ADMIN", "USER")
                .antMatchers("/admin/**").hasRole("ADMIN")
                .antMatchers("/index", "/login", "/oauth/**").permitAll()
                .and()
                .oauth2Login()
                .loginPage("/login")
                .userInfoEndpoint()
                .userService(customOAuthUserService);
    }

    @Autowired
    private CustomOAuthUserService customOAuthUserService;
}

使用此功能获取谷歌信息后,我没有找到任何方法来检查数据库中电子邮件的存在。我会很感激任何帮助,也许有更好的方法来做我想做的事情。 这将是我的用户实体:

public class User {

    @Id
    @Column(nullable = false, updatable = false)
    private Long id;

    @Column(nullable = false, updatable = false)
    private String email;

    @Column(nullable = false)
    private String role;
}

在我的用户存储库中,我实现了下一个查询:

    @Query("SELECT s FROM User s WHERE s.email=?1")
    Optional<User> findUserByEmail(String email);

提前致谢。

【问题讨论】:

  • 考虑使用sub 声明而不是email 声明作为识别用户的关键。 Google 用户帐户的电子邮件地址可以更改,但 sub 值将保持不变。
  • 同意在他们第一次登录时使用 sub 声明将他们链接到您自己的系统中。 sub 声明应该是您正在连接的系统上的用户 ID。该术语是帐户链接。通过各自的 ID 链接不同系统上的两个帐户

标签: java spring-boot web oauth-2.0 google-oauth


【解决方案1】:

不确定您是否仍在寻找解决方案,但这是我检查数据库中是否存在电子邮件的方式。

编辑您的CustomOAuth2UserService.java 如下:

    @Override
    public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException
    {
        String clientName = userRequest.getClientRegistration().getClientName();
        OAuth2User user = super.loadUser(userRequest);

        CustomOAuth2User customOAuth2User = new CustomOAuth2User(user, clientName);
        String email = customOAuth2User.getEmail();

        Optional<User> optionalUser = userRepository.findUserByEmail(email);
        boolean userExists = optionalUser.isPresent();

        if (userExists) 
        {
            //Your code here
        }

        return customOAuth2User;
    }

【讨论】:

    猜你喜欢
    • 2018-07-08
    • 2018-05-25
    • 2017-10-15
    • 1970-01-01
    • 1970-01-01
    • 2013-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多