Spring Security a submit formularza

0

Witajcie
Mam problem. Tworzę sobie aplikację, w której mam formularz dodający dane do bazy wraz z plikami, pliki zapisywane na serwerze. Wszystko działa sprawnie, submit formularza bez zarzutu, do momentu kiedy próbuję zabezpieczyć aplikację korzystając ze Spring Security. Po dodaniu jakiejś tam podstawowej konfiguracji, zmianie sposobu logowania, strony logowania i ustawień dostępności okazuje się że submit przestał działać. To co ukazuje się moim oczom po naciśnięciu przycisku pokazuję w załączniku. Czy ktoś może potrafi mi pomóc?

0

Czy ktoś może potrafi mi pomóc?

Chyba nie sądzisz, że po tych informacjach, ktoś będzie Ci w stanie pomóc. Wyrzuca Ci jakieś błędy w konsoli ? Jak skonfigurowałeś nadpisane metody configure()

0

Wiem że to szczątkowe informacje, przepraszam, pisane na szybko. W konsoli nie pojawia się kompletnie nic. Żadnych błędów przy uruchamianiu i przy późniejszej pracy. Nic. A metody configure to:

        @Override
	protected void configure(HttpSecurity http) throws Exception
	{
		http.authorizeRequests().antMatchers("/admin/**").hasAuthority("ROLE_ADMIN")
								.antMatchers(HttpMethod.POST, "/admin/addContest").authenticated()
								.anyRequest().permitAll()
								.and().formLogin().loginPage("/login")
								.and().logout().logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
									  .logoutSuccessUrl("/index").invalidateHttpSession(true);
	}

        @Override
	protected void configure(AuthenticationManagerBuilder auth) throws Exception
	{
		auth.jdbcAuthentication().dataSource(dataSource).passwordEncoder(passwordEncoder())
				.usersByUsernameQuery("select login, password, enabled " + "from SA WHERE login=? ")
				.authoritiesByUsernameQuery("select login, authority from authorities where login=?")
				.authoritiesByUsernameQuery("select login, role from SA where login=?");
		
		
	}
 
0
authoritiesByUsernameQuery("select login, authority from authorities where login=?")
                .authoritiesByUsernameQuery("select login, role from SA where login=?");

Czemu dwa razy konfigurujesz to samo chyba chodzilo groupAuthorities....
Pierwszy config wygląda na dobry

0

Hmm... Nie wiem. Wydaje mi się ze chodziło mi o to że z dwóch miejsc można dostać autoryzację, w sensie uprawnienia miałem w dwóch tabelach początkowo, gdyż uczyłem się różnych podejść. Ma to wpływ na mój problem?

0

Powiedz jeszcze co robi twój submit

0

<input type="submit" value="Dodaj" name="Submit" class="btn btn-primary" />

Wygląda tak, ma być obsłużony przez kontroler

@RequestMapping(value = "admin/addContest", method = RequestMethod.POST)
	public String addContestPOST(Model model, @ModelAttribute("cd") CD cD) throws IOException
	{
		//rzeczy

		return "redirect:../index";
	}	
0

No dobra z tego co zrozumiałem bo nie podałeś formularza pełnego ale pewnie przed submitem jest coś o wysłaniu post na admin/addContest.

Próbujesz wysłać tam POST strona przenosi cię na /login, nie masz włączonego httpBasić także nie obsługujesz wysyłania tokenu csrf między stronami, więc wywala ci błąd. Spróbuje zaraz poprawić

0
@Override
	protected void configure(HttpSecurity http) throws Exception
	{
		http.authorizeRequests().antMatchers("/admin/**").hasAuthority("ROLE_ADMIN")
								.antMatchers(HttpMethod.POST, "/admin/addContest").authenticated()
								.anyRequest().permitAll()
								.and().formLogin().loginPage("/login")
								.and().logout().logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
									  .logoutSuccessUrl("/index").invalidateHttpSession(true)
									  .and().httpBasic();
	}
 

po zrobieniu takiego czegoś nadal problem

0

Spróbuj to:

 
        http
                .authorizeRequests().antMatchers("/admin/**").hasAuthority("ROLE_ADMIN")
                .antMatchers(HttpMethod.POST, "/admin/addContest").authenticated()
                .anyRequest().permitAll()
                .and()
                .formLogin()
                .and()
                .csrf().disable()
                .httpBasic();
0

A zapomniałem o możliwości logout

 
      http
                .authorizeRequests().antMatchers("/admin/**").hasAuthority("ROLE_ADMIN")
                .antMatchers(HttpMethod.POST, "/admin/addContest").authenticated()
                .anyRequest().permitAll()
                .and()
                .formLogin()
                .and()
                .logout()
                .and()
                .csrf().disable()
                .httpBasic();
0

I następnym razem jak jeszcze dodaj loginPage to sobie ją najpierw stwórz bo wtedy spring ci jej nie wygeneruje, dopiero się skapłem, że to tak działa.

0

Ok. Wygląda na to, ze działa, bo zamiast tego problemu mam problem z połączeniem z bazą, która nie jest uruchomiona więc logiczne.
Dziękuję Ci zatem serdecznie za pomoc. Możesz mi tylko powiedzieć czy problemem był po prostu ten csrf? I brak httpBasic() ? Czy wyłączając csrf mogę usunąć httpBasic() czy mimo wszystko jest to konieczne? Wiem że jest to podstawowa ochrona aplikacji, ale jakimś cudem udało mi się to pominąć.

0

Cholera, nie mogę edytować. W moim przypadku loginPage prowadziło przez kontroler do strony stworzonej przeze mnie. Jeśli o to Ci chodziło

0

Problemów mogło być kilka:

  • loginPage("/login") - spring nie generuje za ciebie wtedy strony login tylko musisz ją zrobić sam
  • csrf nie wiem czy miałeś obsługiwane ponieważ nie wiem jakiej technologii używasz do generacji widoków, i czy ją zrobiłeś ale założyłem z góry, że nie pewnie żadnego pola na token nie dodałeś
  • brak bazowania logowania na http, ale o tym sam zapominam zawsze
0

Sprawdziłem jeszcze tą drugą część pytania bazowanie na http basic raczej nie trzeba włączać widocznie spring wybierze ci coś defaultowo mój błąd ale jest to niezależne od csrf

0

Dobra jestem deb*lem przecież httpBasic() i formLogin() są zależne od siebie. Idę spać.

1 użytkowników online, w tym zalogowanych: 0, gości: 1