Я использую Spring Security 5 и Spring MVC Project, поддержанный Custom Dao Authentication . Организации - это человек , студент и несколько других, которые здесь не имеют отношения. Эти объекты инициализируются с использованием сценариев SQL и входа в систему с помощью Spring Security с использованием этих инициализированных сущностей сценария работают нормально.
Однако я добавил функциональность, чтобы сохранить новый студент и сохранить его в базе данных H2. Когда я сохраняю их в базе данных, а затем возвращаюсь и пытаюсь войти в систему, используя этот недавно созданный студент (и person по наследству) Spring Security отказывается от аутентификации. Используя отладчик, я обнаружил, что внутренне бросает javax.persistence.noresultfoundexception с сообщением No Entity, найденной для запроса . Но я подтвердил в нескольких точках, что новая сущность действительно существует в базе данных. Ниже приведен мой класс конфигурации Spring Security и некоторые скриншоты меня воспроизводят проблему и некоторые результаты при запуске отладчика. < /P>
Код: Выделить всё
SecurityConfig.java
Код: Выделить всё
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
private PersonService personService;
private CustomAuthentication customAuthentication;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(authenticationProvider());
}
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/resources/**",
"/static/**");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/*").hasAnyRole("STUDENT", "FACULTY_MEMBER", "STAFF_MEMBER")
.and()
.formLogin()
.loginPage("/login")
.loginProcessingUrl("/userAuth")
.successHandler(customAuthentication)
.permitAll()
.and()
.logout()
.logoutUrl("/logout")
.permitAll();
}
@Bean
public CsrfTokenRepository repo() {
HttpSessionCsrfTokenRepository repo = new HttpSessionCsrfTokenRepository();
repo.setParameterName("_csrf");
repo.setHeaderName("X-CSRF-TOKEN");
return repo;
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean
public DaoAuthenticationProvider authenticationProvider() {
DaoAuthenticationProvider auth = new DaoAuthenticationProvider();
auth.setUserDetailsService(personService);
auth.setPasswordEncoder(passwordEncoder());
return auth;
}
@Autowired
public void setPersonService(PersonService personService) {
this.personService = personService;
}
@Autowired
public void setCustomAuthentication(CustomAuthentication customAuthentication) {
this.customAuthentication = customAuthentication;
}
Код: Выделить всё
PersonRepo
Код: Выделить всё
@Service
public class PersonServiceImpl implements PersonService {
private PasswordEncoder passwordEncoder;
private PersonRepo personRepo;
@Override
public Person findByUsername(String username) {
return personRepo.findByUsername(username);
}
@Override
public void save(Person person) {
personRepo.save(person);
}
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
Logger logger = Logger.getLogger(getClass().toString());
logger.info("Inside the loadUserByUsername method");
Person person = this.findByUsername(username);
if (person == null) {
logger.info("Person with username: " + username + " was not found!");
throw new UsernameNotFoundException("Could not find Person with username " + username);
}
logger.info("User was successfully retrieved from database");
Collection grantedAuthorityRoles = person.getRoles().stream().map(
role -> new SimpleGrantedAuthority(role.getRole().name())).collect(Collectors.toList());
return new User(person.getUsername(), person.getPassword(), grantedAuthorityRoles);
}
@Autowired
public void setPasswordEncoder(PasswordEncoder passwordEncoder) {
this.passwordEncoder = passwordEncoder;
}
@Autowired
public void setPersonRepo(PersonRepo personRepo) {
this.personRepo = personRepo;
}
}
Код: Выделить всё
@PostMapping("/save_student")
public String saveStudent(@ModelAttribute("student") Student student) {
student.setUsername(student.getFirstName().charAt(0) + student.getLastName().toLowerCase());
student.setPassword(passwordEncoder.encode(student.getPassword()));
student.setRoles(List.of(roleRepo.getRoleByName(RoleEnum.ROLE_STUDENT.name())));
student.setVersion(1);
studentRepo.save(student);
if (personService.loadUserByUsername(student.getUsername()) == null) {
throw new EntityNotFoundException();
} else {
logger.info("Person with username " + student.getUsername() + " was indeed found.");
}
return "redirect:list_students";
}
@GetMapping("/list_students")
public String listStudents(Model model) {
model.addAttribute("students", studentRepo.findAll());
model.addAttribute("people", personRepo.findAll());
return "all_students";
}
< /code>
Эти скриншоты пытаются продемонстрировать ошибку. После того, как я нажимаю кнопку «Регистрация», она запускает @postmapping ("/save_student")
результат после перенаправления через @getmaping (/list_students). Обратите внимание, что «Стив Миллер» перечислен. Точка разрыва - это место в методе LograSerByuserName () из userDetailSservice реализации.
ed extrace extrace Весь журналы сервера. />https://github.com/dcechano/universitym ... ktrace.txt
Подробнее здесь: https://stackoverflow.com/questions/639 ... oresultexc