DennisKingsman
@DennisKingsman
Студент

В чем проблема с аутентификацией через Spring?

Здравствуйте , не могу понять в чем проблема, создал приложение которое регистрирует пользователя, в этой части все правильно, пользователь действительно заносится в бд и в таблице ролей появляется его роль, когда же дело доходит до аутентификации , то ничего не происходит причем даже в консоле приложения ничего не пишет( как в случае с регистрацией я хотябы вижу что приложение сделало запрос к бд и положило туда пользователя) , в случае с аутентификацией ничего , ни ошибки ни результата, помогите пожалуйста , вот ссылочка на гит : https://github.com/DennisKingsman/NetCracker
если удобно могу весь код перенести сюда, заранее спасибо
желаемое поведение : после того как на странице регистрации я пользователя в бд добавил , на странице логина я должен залогиниться чтобы потом при попытке перейти на страницу personalAccount меня больше не перебрасывало на логин
код :
вот тут веб защиты контроллер , который вроде как находит юзера по его имени и потом находит его роль и аутентифицирует его , вероятно эта штука не работает потому как в консоле приложения я никакого запроса не увидел, в то время как когда я кладу пользователя в бд я этот запрос вижу
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private DataSource dataSource;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .antMatchers("/", "/home","/register").permitAll()
                .anyRequest().authenticated()
                .and()
                .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
                .logout()
                .permitAll();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.jdbcAuthentication()
                .dataSource(dataSource)
                .passwordEncoder(NoOpPasswordEncoder.getInstance())
                .usersByUsernameQuery("select username, password, active from usr where username = ? ")
                .authoritiesByUsernameQuery("select u.username, ur.roles from usr u inner join user_role ur on u.id  = ur.user_id where u.username = ? "); //take name and role of user

    }
}


вот это контроллер MVC который просто мапит страницу с запросом тут вроде все норм
@Configuration
public class MvcConfig implements WebMvcConfigurer {

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/login").setViewName("login");
    }
}

а вот тут метод из главного контроллера, который после авторизации вот этот секьюр контекст (принципал) вот он его имя выводит и мы понимаем что мы вот залогинились и инфа о нас она как бы есть
@RequestMapping(value = "/personalAccount", method = RequestMethod.GET)
    public String personalAccount(Model model, Principal principal){

        String userInfo = principal.getName();
        model.addAttribute("userInfo", userInfo);

        return "personalAccount";
    }
  • Вопрос задан
  • 475 просмотров
Решения вопроса 1
azerphoenix
@azerphoenix Куратор тега Java
Java Software Engineer
С учетом того, что есть готовое видео, которое один в один совпадает с вашим кодом и методом аутентификации через jdbcAuthentication() , то рекомендую посмотреть:
https://www.youtube.com/watch?v=WDlifgLS8iQ
и даже можете один в один воспроизвести у себя.

Что касается вашего кода, то:
1) добавьте в application.properties
logging.level.org.springframework.security=DEBUG

logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
logging.level.org.hibernate.type=TRACE


и увидите нужный вам стек ошибок, в частости:
2019-05-25 20:20:12.446 DEBUG 21154 --- [nio-8080-exec-2] o.s.s.p.JdbcUserDetailsManager           : Query returned no results for user ''
2019-05-25 20:20:12.450 DEBUG 21154 --- [nio-8080-exec-2] o.s.s.a.dao.DaoAuthenticationProvider    : User '' not found
org.springframework.security.authentication.BadCredentialsException: Bad credentials


Причина кроится здесь: WebsecurityConfig
.formLogin()
                .loginPage("/login")
                .usernameParameter("name")
                .passwordParameter("password")

Вы просто забыли указать usernameParameter & passwordParameter и соответственно, Spring Security ищет в БД пользователя с именем ' '

5ce96d384bcd4860471431.png
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы