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

Spring Security - .defaultSuccesUrl

0 głosów
209 wizyt
pytanie zadane 30 sierpnia 2020 w Java przez Szyszka Gaduła (3,510 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,510 p.)
Zamieniłem String redirect na HttpServletResponse. Po udanej probie zalogowania robie response.sendRedirect("/home"). Śmiga!
komentarz 31 sierpnia 2020 przez Wiciorny Ekspert (281,250 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ź 181 wizyt
pytanie zadane 27 sierpnia 2020 w Java przez Szyszka Gaduła (3,510 p.)
0 głosów
1 odpowiedź 234 wizyt
pytanie zadane 26 sierpnia 2020 w Java przez Szyszka Gaduła (3,510 p.)
0 głosów
1 odpowiedź 740 wizyt
pytanie zadane 21 sierpnia 2020 w Java przez Szyszka Gaduła (3,510 p.)

93,427 zapytań

142,421 odpowiedzi

322,649 komentarzy

62,787 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

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...