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.