如何将用户数据保存到数据库(Spring 6、Spring Boot 3、Spring Security)

问题描述 投票:0回答:1

我正在使用 Spring boot 与 Google 和 Github 一起测试 OAuth。我能够获取登录详细信息,但我不知道如何将数据保存到数据库。我创建了以下结构的用户实体

@Entity
@ToString
@Table(name = "users")
@NoArgsConstructor
@AllArgsConstructor
public class User {

    @Id
    private String id;

    private String name;
    private String email;

    public User(String name, String email) {
        this.name = name;
        this.email = email;
    }
}

我的Spring security的安全配置如下。我尝试将主要值保存到用户实例,但它显示错误说

class org.springframework.security.oauth2.core.oidc.user.DefaultOidcUser cannot be cast to class com.axis.springauthtest.entity.User

安全配置如下

@Configuration
@EnableWebSecurity
public class SecurityConfig  {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        return  http
                .authorizeHttpRequests(auth -> auth.anyRequest().authenticated())
                .oauth2Login(httpSecurityOAuth2LoginConfigurer -> {
                    httpSecurityOAuth2LoginConfigurer.successHandler(new AuthenticationSuccessHandler() {
                        @Override
                        public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
                            System.out.println("Login Successful");
                            System.out.println(authentication.getPrincipal());


                        }
                    });
                })

                .build();
    }


}
java spring spring-boot oauth-2.0
1个回答
0
投票

你的鳕鱼很好,但不完整,你需要添加注释。 在用户类中

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private String id

并进行简单的联系(保存)制作

存储库接口

像这样

public interface UserRepository extends JpaRepository<User, String> {
User findByUsername(String username);

Optional<User> findByUsername(String username);}

User 是类名,String 是 ID 数据类型 并且您需要创建一个 Implement UserDetailsService 类

@Service
public class UserService implements UserDetailsService {
@Autowired
private UserRepository userRepository;
@Override
public UserDetails loadUserByUsername(String username) throws     UsernameNotFoundException {
    User user = userRepository.findByUsername(username);
    if (user == null) {
        throw new UsernameNotFoundException("User not found with username: " + username);
    }
    return new org.springframework.security.core.userdetails.User(
            user.getUsername(),
            user.getPassword(),
            // Add authorities/roles if needed
            Collections.emptyList()    );  }
public void saveUser(User user) {
    userRepository.save(user); }}

并且你需要类控制器,如果你查看Spring网站文档,你会编写并看到类控制,但我认为这对你的代码有好处。

@RestController
@RequestMapping("/api/register")
public class RegistrationController {
@Autowired
private UserService userService;
@PostMapping
public ResponseEntity<String> registerUser(@RequestBody User user) {
    userService.saveUser(user);
    return ResponseEntity.ok("User registered successfully");

并且您已正确配置 Spring Security 以进行用户身份验证和授权。 这样你所有的代码 请尝试这个并显示结果

© www.soinside.com 2019 - 2024. All rights reserved.