spring-security Sping Boot 安全性,始终打开登录页面

ilmyapht  于 2022-11-11  发布在  Spring
关注(0)|答案(3)|浏览(171)

我正在为Uni制作一个小应用程序。我正在使用Sping Boot 安全进行我的用户管理。我遇到的问题是,无论我在浏览器中放入什么路径,它都会重定向到登录。
我在这里寻找答案:Spring boot security, always redirects to login page, if navigate through address bar但它没有帮助。我在配置我的代码时使用了这个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
smdncfj3

smdncfj31#

Spring要求您登录,因为您已经告诉它除了.antMatchers("/registration**", "/js/**", "/css/**", "/img/**").permitAll()中被排除的请求之外的所有请求都应该由.anyRequest().authenticated()进行身份验证。
注册页面无法打开的原因可能是您在permitAll中定义了registration,但在实际控制器中使用了register。(我也不确定/registration**是否有效,可能必须是/registration + /registration/**

gwbalxhn

gwbalxhn2#

删除dur提到的.anyRequest().authenticated()解决了这个问题,但Ralan也是正确的。

wvmv3b1j

wvmv3b1j3#

你做错了。你需要
1.检查会话是否存在。
1.您可以从会话而不是数据库中获取当前用户。请传递参数Authentication。
例如:

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

相关问题