此问题在此处已有答案:
Why is Spring Security not working?(2个答案)
9天前关闭
我决定在进入Sping Boot 之前先探索一下Spring,以了解它是如何在基础上粘合在一起的。我有一个非常基本的Security Config
设置来验证所有的路由,但它不授权或验证任何路径/路由。
我甚至在doFilter()
中添加了一个带有log语句的custom filter (TenantFilter)
,以验证请求是否通过filter chain
。
当服务器启动时,bean
声明中的SECURING IT
日志将被打印,这意味着安全链Bean正在注册。
配置:spring-context (6.1.2)
、spring-webmvc (6.1.2)
、spring-security-config (6.1.2)
、jakarta.servlet-api (6.1.0-M1)
、spring-security-config (6.1.2)
、spring-security-web (6.1.2)
容器:Tomcat 11
@Configuration
@EnableWebMvc
@EnableWebSecurity(debug = true)
//@EnableWebMvcSecurity
@ComponentScan(basePackages = "org.example")
public class WebConfig implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/tryJsp").setViewName("index");
}
@Bean
public UserDetailsService userDetailsService() {
UserDetails userDetails = User.builder().username("user")
.password(passwordEncoder().encode("password"))
.roles("USER")
.build();
return new InMemoryUserDetailsManager(userDetails);
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
System.out.println("SECURING IT");
http.authorizeHttpRequests((authz) -> authz
.requestMatchers(antMatcher("/app/*")).authenticated()
.requestMatchers(antMatcher("/app/test")).authenticated()
.requestMatchers(antMatcher("/*")).authenticated()
.requestMatchers(antMatcher("*/*")).authenticated()
)
//.addFilterBefore(new TenantFilter(), AuthorizationFilter.class)
.httpBasic(Customizer.withDefaults())
.formLogin(Customizer.withDefaults());
return http.build();
}
}
字符串
控制器Map:
@GetMapping("/test")
@ResponseBody
public ResponseEntity<String> getRoute(HttpServletRequest request) {
String requestURL = request.getRequestURL().toString();
System.out.println("Request URL: " + requestURL); //prints http://localhost:8080/app/test
String requestURI = request.getRequestURI();
System.out.println("Request URI: " + requestURI); //prints /app/test
return ResponseEntity.ok("Yet another plain string response");
}
型
预期:Spring Security会拦截请求,并显示默认登录表单。
结果:当我点击上面的路由时,我得到的响应是Yet another plain string response
,它没有要求我登录。
请帮助我理解我是否遗漏了什么。我一直在遵循Spring Start Here
+ Spring Security设置的官方Spring Doc这本书(因为那里的许多教程没有按预期工作,大多数时候缺乏细节或者过时)。
1条答案
按热度按时间rdlzhqv91#
我能让它工作。
问题是我没有声明一个扩展
AbstractSecurityWebApplicationInitializer
的类,这是为应用程序中的每个URL注册springSecurityFilterChain
所必需的。参考:Spring Doc For Java配置
由于我使用的是
Spring MVC
,Configs
已经通过WebApplicationInitializer
的getServletConfigClasses()
注册,即使这样,类AbstractSecurityWebApplicationInitializer
也必须扩展才能使安全过滤器链工作。字符串
AbstractSecurityWebApplicationInitializer
的Source Code解释了很多!