我理解@EnableWebSecurity
禁用所有Spring安全默认值,因此我在WebSecurityConfigurerAdapter
中覆盖了所需的方法。但是,无论我做什么css和所有其他静态资产得到403或405。
将spring boot 2.0.0.M7与从https://start.spring.io/
创建的spring security一起使用文件夹结构是正常的
- resources
- static
- css
styles.css
web.ignoring()
由于某种原因没有做任何事情,但是当我启用调试时,它确实提到已绕过以下路径,但我仍然得到405.
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/css/**", "/webjars/**");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.
authorizeRequests()
.antMatchers("/register").permitAll()
.anyRequest().authenticated();
}
}
为了进一步调试,我甚至尝试通过以下方式允许所有内容,但是每个网址仍然被拒绝,这非常令人困惑,让我觉得有一些我不理解的关键概念。
http.authorizeRequests().antMatchers("/**").permitAll()
最后,我还尝试使用不同位置的各种组合来实施WebMvcConfigurer
。
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/css/**").addResourceLocations("/css/");
registry.addResourceHandler("/webjars/**")
.addResourceLocations("/webjars/");
}
任何人都可以帮助我吗?
答案 0 :(得分:0)
以上所有安全配置实际上都是正确的。您不必实施WebMvcConfigurer
,只需展开WebSecurityConfigurerAdapter
。
原来是一个非常难以的错误来追踪。我有一个控制器提供了这样的注册表。
@Controller
public class RegistrationController {
@GetMapping("/register")
public String getRegisterView(Model model) {
model.addAttribute("registerDto", new RegisterDto());
return "register";
}
@PostMapping
public String register(@Valid @ModelAttribute("registerDto") RegisterDto registerDto, BindingResult result) {
// business logic...
return "register";
}
}
该错误发生在@PostMapping
我忘记包含路径!!这会在映射路径时导致spring出现各种问题。如果没有提供路径,这些注释会抛出异常会很好。
要解决此问题,我将其更新为@PostMapping("/register")
,现在更新为
web.ignoring().antMatchers("/css/**", "/js/**", "/webjars/**");
。
因此,请确保所有控制器路径注释都包含路径!