• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Spring Security - .defaultSuccesUrl

Object Storage Arubacloud
0 głosów
119 wizyt
pytanie zadane 30 sierpnia 2020 w Java przez Szyszka Gaduła (3,490 p.)

Witam. Mam taki ot kod:

/*
 Author: Szyszka
 */

package pl.szyszka.login;

import javax.persistence.EntityManager;
import javax.persistence.Query;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.context.HttpSessionSecurityContextRepository;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import lombok.RequiredArgsConstructor;
import pl.szyszka.users.User;
import pl.szyszka.users.UserRepository;

@Controller
@RequestMapping("/login")
@RequiredArgsConstructor
public class LoginController {

       @Autowired
       DataSource dataSource;

       @Autowired
       AuthenticationManager authManager;

       PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();

       @Autowired
       private final UserRepository userRepository;

       @Autowired
       private final EntityManager entityManager;

       @GetMapping
       public String loginForm(Model model) {
              model.addAttribute("user", new User());
              return "login";
       }

       @PostMapping
       public void login(User user, Model model, HttpServletRequest req, String redirect) throws Exception {
              Query query = entityManager.createNativeQuery("SELECT PASSWORD FROM USERS WHERE USERNAME = :username");
              Query isEnabled = entityManager.createNativeQuery("SELECT ENABLED FROM USERS WHERE USERNAME = :username")
                            .setParameter("username", user.getUsername());
              query.setParameter("username", user.getUsername());
              if (!user.getUsername().equals("")) {
                     if (userRepository.takeAllNames().toString().indexOf(user.getUsername()) == -1) {
                            model.addAttribute("loginResponse", "Błędna nazwa użytkownika");
                     } else if (!passwordEncoder.matches(user.getPassword(), query.getSingleResult().toString())) {
                            model.addAttribute("loginResponse", "Błędne hasło");
                     } else if (userRepository.takeAllNames().toString().indexOf(user.getUsername()) != -1
                                   && passwordEncoder.matches(user.getPassword(), query.getSingleResult().toString())) {
                            if (isEnabled.getSingleResult().equals(true)) {
                                   UsernamePasswordAuthenticationToken authReq = new UsernamePasswordAuthenticationToken(
                                                 user.getUsername(), user.getPassword());
                                   Authentication auth = authManager.authenticate(authReq);

                                   SecurityContext sc = SecurityContextHolder.getContext();
                                   sc.setAuthentication(auth);
                                   HttpSession session = req.getSession();
                                   session.setAttribute(
                                                 HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY, sc);
                            } else {
                                   model.addAttribute("loginResponse",
                                                 "Konto jest zarejestrowane, lecz nie zostało aktywowane. Odwiedź swoją skrzynke pocztową i aktywuj konto");
                            }
                     }
              } else {
                     model.addAttribute("loginResponse", "Podaj nazwe użytkownika");
              }
       }
}

I rzeczywiście - sesja działa. Gdy zmienie typ na String i dodam do zwrocenia redirect:/home, to przekieruje mnie na strone /home, sesja jest, wszystko pięknie działa. Jednak czasem, zależnie od humorku Springa przekierowywuje mnie na: localhost:8080/home;jessionid=wartosc

I wtedy wywala błąd. Dlatego pomyślałem, że zrobie w SecurityConfig coś takiego:

       @Override
       protected void configure(HttpSecurity httpSecurity) throws Exception {
              httpSecurity.csrf().ignoringAntMatchers("/register");
              httpSecurity.authorizeRequests().antMatchers("/home").hasRole("USER").and().formLogin()
                            .loginPage("/login").defaultSuccessUrl("/home");
       }

Jednak to sprawia, że po wpisaniu poprawnych danych nic się nie dzieje. Więc jest może jakiś sposób, żeby nie dodawało mi tego ;jsessionid=wartosc ? Z góry dzięki.

1 odpowiedź

0 głosów
odpowiedź 31 sierpnia 2020 przez Szyszka Gaduła (3,490 p.)
Zamieniłem String redirect na HttpServletResponse. Po udanej probie zalogowania robie response.sendRedirect("/home"). Śmiga!
komentarz 31 sierpnia 2020 przez Wiciorny Ekspert (269,810 p.)
a w końcu stosujesz Springa, czy java Servlet? :D bo ... mieszasz biblioteki w projekcie jak kapusty w bigosie

Podobne pytania

0 głosów
1 odpowiedź 127 wizyt
pytanie zadane 27 sierpnia 2020 w Java przez Szyszka Gaduła (3,490 p.)
0 głosów
1 odpowiedź 110 wizyt
pytanie zadane 26 sierpnia 2020 w Java przez Szyszka Gaduła (3,490 p.)
0 głosów
1 odpowiedź 489 wizyt
pytanie zadane 21 sierpnia 2020 w Java przez Szyszka Gaduła (3,490 p.)

92,568 zapytań

141,424 odpowiedzi

319,634 komentarzy

61,956 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...