我正在使用 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();
}
}
你的鳕鱼很好,但不完整,你需要添加注释。 在用户类中
@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 以进行用户身份验证和授权。 这样你所有的代码 请尝试这个并显示结果