spring 为什么我从数据库中提取某些数据的函数从未被调用

olhwl3o2  于 2024-01-05  发布在  Spring
关注(0)|答案(1)|浏览(139)

我开始我的旅程与Spring,我已经尝试做简单的日志应用程序,但我绊倒across问题,我不能解决.我的代码符合,但当我试图登录,即使我插入正确的数据存在于数据库中,它从来没有让我槽.我相信有问题的函数loadUserByNode,因为它从来没有被调用,因为它既不抛出错误或记录任何东西. BLOG是我的程序代码
user.java

  1. @Data
  2. @Entity
  3. @Table(name = "userinfo")
  4. public class User {
  5. @Id
  6. @GeneratedValue(strategy = GenerationType.IDENTITY)
  7. @Column(name = "userkey")
  8. private int userKey;
  9. @Column(name = "emailaddress")
  10. private String emailAddress;
  11. @Column(name = "password")
  12. private String password;
  13. @Column(name = "role")
  14. private String role;
  15. }

字符串
UserRepository.java

  1. public interface UserRepository extends JpaRepository<User,Long> {
  2. Optional<User> findByEmailAddress(String email);
  3. }


SecurityConfig.java

  1. @Configuration
  2. public class SecurityConfig {
  3. private final UserDetail userDetail;
  4. @Autowired
  5. public SecurityConfig(UserDetail userDetail) {
  6. this.userDetail = userDetail;
  7. }
  8. @Bean
  9. public static PasswordEncoder passwordEncoder() {
  10. return new BCryptPasswordEncoder();
  11. }
  12. @Bean
  13. public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
  14. http.csrf(AbstractHttpConfigurer::disable)
  15. .authorizeHttpRequests(authorize ->
  16. authorize.anyRequest().authenticated())
  17. .formLogin(form -> form
  18. .loginPage("/login")
  19. .loginProcessingUrl("/login")
  20. .defaultSuccessUrl("/")
  21. .permitAll())
  22. .logout(logout -> logout
  23. .logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
  24. .permitAll());
  25. http.userDetailsService(userDetail);
  26. return http.build();
  27. }
  28. }


UserDetail.java

  1. @Service
  2. @Slf4j
  3. public class UserDetail implements UserDetailsService {
  4. private final UserRepository userRepository;
  5. @Autowired
  6. public UserDetail(UserRepository userRepository) {
  7. this.userRepository = userRepository;
  8. }
  9. @Override
  10. public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
  11. Optional<User> user = userRepository.findByEmailAddress(username);
  12. if(user.isEmpty()){
  13. throw new UsernameNotFoundException("This email address does not exists");
  14. }
  15. User existingUser = user.get();
  16. log.info("Email Address: {}, Password: {}", existingUser.getEmailAddress(), existingUser.getPassword());
  17. return new org.springframework.security.core.userdetails.User(
  18. username,
  19. existingUser.getPassword(),
  20. Collections.singletonList(new SimpleGrantedAuthority(existingUser.getRole())));
  21. }
  22. }


MainController.java

  1. @Controller
  2. @Slf4j
  3. public class MainController {
  4. @GetMapping("/login")
  5. public String login(){
  6. return "login";
  7. }
  8. @GetMapping("/logout")
  9. public String logout(){
  10. return "redirect:/login";
  11. }
  12. }


login.html的核心片段

  1. <div class="col-md-6 offset-md-3">
  2. <div th:if="${param.error}">
  3. <div class="alert alert-danger">Invalid Email or Password</div>
  4. </div>
  5. <div th:if="${param.logout}">
  6. <div class="alert alert-success">You have been logged out.</div>
  7. </div>
  8. <div class="card">
  9. <div class="card-header">
  10. <h2 class="text-center">Login</h2>
  11. </div>
  12. <div class="card-body">
  13. <form method="POST" role="form" th:action="@{/login}"
  14. class="form-horizontal">
  15. <div class="form-group mb-3">
  16. <label class="control-label"> Email address</label> <label for="emailAddress"></label>
  17. <input type="text" id="emailAddress" name="emailAddress" class="form-control" placeholder="Enter email address" />
  18. </div>
  19. <div class="form-group mb-3">
  20. <label class="control-label"> Password</label> <label for="password"></label>
  21. <input type="password" id="password" name="password" class="form-control" placeholder="Enter password" />
  22. </div>
  23. <div class="form-group mb-3">
  24. <button type="submit" class="btn btn-primary">Login</button>
  25. </div>
  26. </form>
  27. </div>
  28. </div>
  29. </div>


我试图在代码的多个部分设置日志记录,即使在控制器中,它也总是返回email:null和password:null,因此我认为这个函数没有被调用。

cuxqih21

cuxqih211#

我建议加入一个自定义的AuthenticationProvider,特别是DaoAuthenticationProvider,因为它从数据库中检索细节。下面是一个示例代码片段:

  1. @Bean
  2. public SecurityFilterChain orderFilterChain(HttpSecurity httpSecurity, AuthenticationProvider orderAuthenticationProvider) throws Exception {
  3. httpSecurity
  4. .csrf(AbstractHttpConfigurer::disable)
  5. .securityMatcher("/order/**")
  6. .authorizeHttpRequests(auth -> auth
  7. .anyRequest().authenticated()
  8. )
  9. .authenticationProvider(orderAuthenticationProvider)
  10. .httpBasic(Customizer.withDefaults());
  11. return httpSecurity.build();
  12. }
  13. @Bean
  14. public AuthenticationProvider orderAuthenticationProvider(UserDetailsService orderUserDetailsService) {
  15. DaoAuthenticationProvider orderDaoAuthenticationProvider = new DaoAuthenticationProvider();
  16. orderDaoAuthenticationProvider.setUserDetailsService(orderUserDetailsService);
  17. return orderDaoAuthenticationProvider;
  18. }

字符串
这是一个自定义的DaoAuthenticationProvider,用于在Spring Security配置中处理身份验证。orderAuthenticationProvider方法使用指定的UserDetailsService创建和配置DaoAuthenticationProvider

展开查看全部

相关问题