Реализация входа в систему с использованием UserDetails в Spring Security не работает - PullRequest
0 голосов
/ 28 октября 2018

У меня есть простое приложение Spring Boot 2.xx с Spring Data JPA MySQL, я должен защитить это веб-приложение с помощью Spring Security (особенно конфигурации Java), поэтому я нашел много ресурсов в Интернете, чтобы выполнить работу, но напрасно , некоторые примеры были слишком сложны для понимания, а другие никогда не помогали мне.Я придумал эту secure-spring-demo , которая тоже не работает.некоторые фрагменты кода

класс WebSecurityConfig равен

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserDetailsServiceImpl userDetailsService;

    @Bean(name = BeanIds.AUTHENTICATION_MANAGER)
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }

    @Bean
    public DaoAuthenticationProvider authProvider() {
        DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
        authProvider.setUserDetailsService(userDetailsService);
        authProvider.setPasswordEncoder(passwordEncoder());
        return authProvider;
    }


    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(authProvider());
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable();
        http
                .authorizeRequests()
                .antMatchers("/login*", "/register", "/").anonymous()
                .antMatchers("/secure/*").hasAnyAuthority("ADMIN").anyRequest().authenticated()
                .anyRequest().authenticated()
                .and()
                .formLogin()
                .loginPage("/login")
                .and()
                .logout().logoutSuccessUrl("/login");
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

, а класс UserDetailsServiceImpl равен

@Service
public class UserDetailsServiceImpl implements UserDetailsService {

    private final UserService userService;

    @Autowired
    public UserDetailsServiceImpl(UserService userService) {
        this.userService = userService;
    }

    @Override
    public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
        User user = userService.findByUserEmail(s);
        if (user == null){
            throw new UsernameNotFoundException("User with " + s + " not found!");
        }

        return new org.springframework.security.core.userdetails.User(
                user.getUserEmail(), user.getUserPassword(), user.getRoles());
    }
}

, контроллер -

@Controller
public class UserController {

    @Autowired
    private UserService userService;

    @Autowired
    private RoleService roleService;

    @Autowired
    private SecurityService securityService;

    //Omitting other mappings

    @GetMapping(value = "/login")
    public String getLogin(Model model,
                           @RequestParam(value = "error", required = false) String error){
        if (null != error && error.equalsIgnoreCase("true")){
            model.addAttribute("loginError", "Unable to Login");
        }
        return "login";
    }

    @PostMapping(value = "/login")
    public String postLogin(@RequestParam(value = "userEmail") String userEmail,
                              @RequestParam(value = "userPassword") String userPassword){
        logger.debug(userEmail + " and " + userPassword );
        boolean loginResult = securityService.login(userEmail, userPassword);
        return (loginResult ? "redirect:/secure/home" : "redirect:/login?error=true");
    }

}

со всем этимпользователь не может войти с правильными учетными данными.

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Основная причина, потому что вы хотите, чтобы пользовательский метод обрабатывал вход в систему безопасности Spring, но вы снова задали имя пользовательского метода, имя которого совпадает с именем по умолчанию для метода входа в безопасности весны.Поэтому Web будет вызывать метод входа в Spring, но не будет вызывать ваш метод custom.

В этом случае вам необходимо преобразовать имя в другое, используя имя метода spring login default.Это ваше предложение, которому я могу следовать.

Я редактирую "login" для loginCustom в файле login.html

login.xml

И в UserController.java, я редактирую в "/ loginCustom" enter image description here

0 голосов
/ 28 октября 2018

Основная проблема, с которой я столкнулся в вашем коде, не передавала свойства "username" и "password" из шаблона thymeleaf, так как он должен соответствовать точным свойствам учетных данных для порядка аутентификации объекта ... поэтому ваша форма входа будет такой:

 <form th:method="post" th:action="@{/login}" enctype="utf8">
  <input th:type="email" name="username" placeholder="Email" required="">
  <input th:type="password" name="password" placeholder="Password" required="">
  <button th:type="submit" name="submit"> Login </button>
  <span>You Have No Account? <a th:href="@{/register}"> Create An Account</a></span>
 </form>

при изменении параметров, поэтому вам также необходимо изменить свойства контроллера:

@PostMapping(value = "/login")
public String postLogin(@RequestParam(value = "username") String userEmail,
                          @RequestParam(value = "password") String userPassword){
    logger.debug(userEmail + " and " + userPassword );
    boolean loginResult = securityService.login(userEmail, userPassword);
    return (loginResult ? "redirect:/secure/home" : "redirect:/login?error=true");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...