Spring Security(无SpringBoot):请求未被认证/授权[重复]

1sbrub3j  于 12个月前  发布在  Spring
关注(0)|答案(1)|浏览(104)

此问题在此处已有答案

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这本书(因为那里的许多教程没有按预期工作,大多数时候缺乏细节或者过时)。

rdlzhqv9

rdlzhqv91#

我能让它工作。
问题是我没有声明一个扩展AbstractSecurityWebApplicationInitializer的类,这是为应用程序中的每个URL注册springSecurityFilterChain所必需的。
参考:Spring Doc For Java配置
由于我使用的是Spring MVCConfigs已经通过WebApplicationInitializergetServletConfigClasses()注册,即使这样,类AbstractSecurityWebApplicationInitializer也必须扩展才能使安全过滤器链工作。

public class SecurityWebApplicationInitializer
    extends AbstractSecurityWebApplicationInitializer {
//leave it empty

}

字符串
AbstractSecurityWebApplicationInitializerSource Code解释了很多!

相关问题