簡體   English   中英

Spring 啟動安全,總是打開登錄頁面

[英]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

你做錯了。 你需要

  1. 檢查 session 是否存在。
  2. 您可以從 session 而非數據庫中獲取當前用戶。 傳遞參數身份驗證。

前任:

@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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM