Почему мой логин не работает? Весенняя охрана - PullRequest
0 голосов
/ 21 марта 2020

Я изучаю Spring MVC и пытаюсь реализовать безопасность Spring в своем приложении. Я создал пользовательский логин и пытаюсь войти в систему, используя пользовательскую форму авторизации. Когда я запускаю приложение, страница входа в систему отображается правильно, но после ввода имени пользователя и пароля она не работает. Отправка формы входа вызывает ту же страницу входа, но с ошибкой в ​​URL. Мой UserDetailsService:

@Service
public class CustomUserDetailsService implements UserDetailsService {
    @Autowired
    private UserService userService;

    @Transactional
    @Override
    public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
        User user = userService.getUserByEmail(email);
        if (user != null) {
            List<GrantedAuthority> authorities = getUserAuthority(user.getRoles());
            return buildUserForAuthentication(user, authorities);
        } else {
            throw new UsernameNotFoundException("user with email " + email + " does not exist.");
        }
    }

    private List<GrantedAuthority> getUserAuthority(Set<Role> userRoles) {
        Set<GrantedAuthority> roles = new HashSet<>();
        userRoles.forEach((role) -> {
            roles.add(new SimpleGrantedAuthority(role.getName()));
        });
        return new ArrayList<GrantedAuthority>(roles);
    }

    private UserDetails buildUserForAuthentication(User user, List<GrantedAuthority> authorities) {
        return new org.springframework.security.core.userdetails.User(user.getEmail(), user.getPassword(), authorities);
    }
}

WebSecurityConfig

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Qualifier("customUserDetailsService")
    @Autowired
    private UserDetailsService userDetailsService;

    @Bean
    public BCryptPasswordEncoder bCryptPasswordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth
                .userDetailsService(userDetailsService)
                .passwordEncoder(bCryptPasswordEncoder());
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/profile").authenticated()
                .anyRequest().permitAll()
                .and()
                .formLogin()
                .loginPage("/login")
                .defaultSuccessUrl("/", true)
                .permitAll()
                .and()
                .httpBasic()
                .and()
                .csrf().disable()
                .logout()
                .logoutSuccessUrl("/");
    }
}

Класс пользователя:

@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String email;
    private String password;
    private String firstName;
    private String lastName;
    private String joinedDate;
    @Embedded
    @AttributeOverrides({
            @AttributeOverride( name = "country", column = @Column(name = "country")),
            @AttributeOverride( name = "city", column = @Column(name = "city")),
            @AttributeOverride( name = "zipCode", column = @Column(name = "zip_code")),
            @AttributeOverride( name = "street", column = @Column(name = "street")),
            @AttributeOverride( name = "homeNumber", column = @Column(name = "home_number"))
    })
    private Address address;
    private String phoneNumber;
    @ManyToMany
    private Set<Role> roles = new HashSet<Role>();

GETTERS AND SETTERS

Сервис пользователя:

@Service
@Transactional
public class UserServiceImpl implements UserService {
    @Autowired
    private UserRepository userRepository;
    @Autowired
    private PasswordEncoder bCryptPasswordEncoder;
    @Autowired
    private RoleRepository roleRepository;

    @Override
    public User getUserByEmail(String email) {
        return userRepository.findByEmail(email);
    }

    @Override
    public User addUser(UserRegistrationDto user) throws EmailExistsException {
        if (checkEmailExists(user.getEmail())) {
            throw new EmailExistsException("There is an account with that email adress: " + user.getEmail());
        } else {
            User userObject = new User();
            userObject.setEmail(user.getEmail());
            userObject.setPassword(bCryptPasswordEncoder.encode(user.getPassword()));
            userObject.setFirstName(user.getFirstName());
            userObject.setLastName(user.getLastName());
            userObject.setPhoneNumber(user.getPhoneNumber());
            userObject.setAddress(user.getAddress());
            userObject.setJoinedDate(DateUtils.todayStr());
            userObject.setRoles(new HashSet<>(roleRepository.findAll()));
            userRepository.save(userObject);
            return userObject;
        }
    }

    @Override
    public void updateUser(String email, User userUpdate) {
        User toUpdate = userRepository.findByEmail(email);
        if(toUpdate.getEmail().equals(userUpdate.getEmail())){
            userRepository.save(userUpdate);
        }
    }

    private boolean checkEmailExists(String email) {
        User user = null;
        user = userRepository.findByEmail(email);

        if (user != null) {
            return true;
        } else {
            return false;
        }
    }
}

После ввода данных в форму появляется запрос к базе данных. UserDetailsService также не выдает ошибку, что пользователь не был найден. Так в чем же может быть ошибка?

1 Ответ

0 голосов
/ 22 марта 2020

На первый взгляд, не следует ли вам ввести UserServiceDAO вместо UserService в классе 'CustomUserDetailsService'?

...