[英]Spring boot & Spring security always redirect to Login
[英]Spring Boot security, always opens login page
我正在為 uni 制作一個小應用程序。 我正在使用 Spring 引導安全性進行用戶管理。 我遇到的問題是,無論我在瀏覽器中輸入什么路徑,它都會重定向到登錄。
我在這里查找答案: Spring 啟動安全,如果通過地址欄導航,總是重定向到登錄頁面,但它沒有幫助。 我在配置我的代碼時使用了這個Spring Security - How to Fix WebSecurityConfigurerAdapter Deprecated以供參考。
如果有人可以提供幫助,將不勝感激。 此外,如果您可能需要任何其他代碼,請告訴我,我將編輯這篇文章。
@Data
@Configuration
@EnableWebSecurity
public class SecurityConfiguration {
private UserServiceImpl userService;
@Bean
public AuthenticationManager auth(AuthenticationConfiguration builder) throws Exception {
return builder.getAuthenticationManager();
}
@Bean
public BCryptPasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers(
"/registration**",
"/js/**",
"/css/**",
"/img/**").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout()
.invalidateHttpSession(true)
.clearAuthentication(true)
.logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
.logoutSuccessUrl("/login?logout")
.permitAll();
return http.build();
}
}
@Controller
@RequestMapping
public class MainController {
@Autowired
private UserServiceImpl userService;
@GetMapping("/login")
public String login() {
return "login";
}
@GetMapping("/")
public String home(Model model) {
User currentUser = userService.getUser();
model.addAttribute("user", currentUser);
if (currentUser.getRoles().equals("ADMIN_ROLE"))
return "admin-home";
return "user-home";
}
}
@Controller
@AllArgsConstructor
@RequestMapping("/register")
public class RegisterController {
@Autowired
private UserServiceImpl userService;
@ModelAttribute("user")
public RegisterUserAccountDTO registerUserAccountDTO(){return new RegisterUserAccountDTO();}
@GetMapping
public String RegistrationForm() {
return "register";
}
@PostMapping
public String registerNewUserAccount(@ModelAttribute("user") RegisterUserAccountDTO registerUserAccountDTO, BindingResult result) {
if (result.hasErrors()) {
return "redirect:/register?error";
}
List<User> allUsers = userService.getUserRepository().findAll();
if (allUsers.isEmpty() == false) {
for (int i = 0; i < allUsers.size(); i++) {
if (allUsers.get(i).getEmail().equals(registerUserAccountDTO.getEmail()))
return "redirect:/registration?usernameError";
if (allUsers.get(i).getEmail().equals(registerUserAccountDTO.getEmail()))
return "redirect:/registration?emailError";
}
}
userService.register(registerUserAccountDTO);
return "redirect:/register?success";
}
}
在我的應用程序屬性中,我有這行代碼:
security.basic.enabled=false
你做錯了。 你需要
前任:
@GetMapping(value = "/")
public String defaultHome(final Model model, Authentication auth) {
if (auth != null && auth.getName() != null) {
//Session created by springsecurity
model.addAttribute("user", auth.getName());
}else{
// no session found
}
...
Spring 要求您登錄,因為您已經告訴它除了.antMatchers("/registration**", "/js/**", "/css/**", "/img/**").permitAll()
中的排除請求之外的所有請求.antMatchers("/registration**", "/js/**", "/css/**", "/img/**").permitAll()
應通過.anyRequest().authenticated()
進行身份驗證。
您的注冊頁面未打開的原因是您在 permitAll 中定義了registration
,但在實際 controller 中使用了register
。 (我也不確定/registration**
是否有效,可能必須是/registration
+ /registration/**
)
提到的 Remove.anyRequest().authenticated() 解決了它,但 Ralan 也是正確的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.