我正在为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
3条答案
按热度按时间smdncfj31#
Spring要求您登录,因为您已经告诉它除了
.antMatchers("/registration**", "/js/**", "/css/**", "/img/**").permitAll()
中被排除的请求之外的所有请求都应该由.anyRequest().authenticated()
进行身份验证。注册页面无法打开的原因可能是您在permitAll中定义了
registration
,但在实际控制器中使用了register
。(我也不确定/registration**
是否有效,可能必须是/registration
+/registration/**
)gwbalxhn2#
删除dur提到的.anyRequest().authenticated()解决了这个问题,但Ralan也是正确的。
wvmv3b1j3#
你做错了。你需要
1.检查会话是否存在。
1.您可以从会话而不是数据库中获取当前用户。请传递参数Authentication。
例如: