Spring Boot 安全配置不起作用

Posted

技术标签:

【中文标题】Spring Boot 安全配置不起作用【英文标题】:Spring Boot Security Configuration is not working 【发布时间】:2019-08-25 22:06:23 【问题描述】:

我有两种类型的网址,一种是安全的,一种是不安全的,例如注册和登录

我希望“注册”和“登录”绕过安全和过滤器,而所有其他 url 必须通过过滤器和安全。

以下是我的安全配置代码,但它不起作用。

@EnableGlobalMethodSecurity(prePostEnabled = true)
@EnableWebSecurity
@Configuration
public class AppSecurity extends WebSecurityConfigurerAdapter 

    @Autowired
    private CustomUserDetailsService userDetailsService;

    @Autowired
    TempTokenGenerator tempTokenGenerator;

    @Bean
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception 
        return super.authenticationManagerBean();
    

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception 

        auth.userDetailsService(userDetailsService)
            .passwordEncoder(getPasswordEncoder());
    

    public void configure(WebSecurity web) throws Exception 

        web.ignoring().antMatchers("notsecured/signin");
    

    @Override
    protected void configure(HttpSecurity http) throws Exception 
        http.cors().and().csrf().disable().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
        http.authorizeRequests()

            .antMatchers("/", "**secured/**").authenticated()

            .and().logout().permitAll()
            .and()
            .apply(new TempConfigurer(tempTokenGenerator));
    

    @Bean
    CorsConfigurationSource corsConfigurationSource() 
        final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", new CorsConfiguration().applyPermitDefaultValues());
        return source;
    

我错过了什么?我应该怎么做才能在身份验证和过滤器中包含“安全”网址,同时从身份验证和过滤器中排除“不安全”。

 web.ignoring().antMatchers("notsecured/signin"); 

如果我放的话似乎不起作用

.anyRequest().authenticated() 

 http.authorizeRequests() to make secured urls work.

如果我放了

.antMatchers("/","**/secured/**").authenticated()
          

.anyRequest().permitAll()

它也不起作用。

【问题讨论】:

http.authorizeRequests().antMatchers("/unsecured").permitAll() 你期待这个吗? @Sankar 是的,我想要这个用于 /unsecured 但同时我想要 http.authorizeRequests().antMatchers("/secured").authenticated.and() .apply(new TempConfigurer(tempTokenGenerator ));为/安全 http.authorizeRequests().antMatchers("/unsecured").permitAll() .antMatchers("/secured/**").hasRole("USER_ROLE") 可以这样使用。 【参考方案1】:

使用configure(HttpSecurity http) 方法保护您的请求端点

  http.csrf().disable()
        .cors().and()
        .authorizeRequests()
            .antMatchers("/notsecured/**").permitAll()
            .antMatchers("/secured/**").fullyAuthenticated()
        .and().sessionManagement...
        .and().formLogin()
         ...

使用configure(WebSecurity web) 方法忽略静态资源,如图片、css、...

【讨论】:

我已经在使用 configure(HttpSecurity http) 并且我希望以下过滤器仅应用于安全 url .and() .apply(new TempConfigurer(tempTokenGenerator)); 另外,提供的解决方案也不起作用,所有网址都可以正常工作,无需身份验证。 重点是你应该添加多个匹配器,允许公共访问和安全访问.antMatchers("matching public access").permitAll() .antMatchers("matching secured access").fullyAuthenticated(),是的,你可以使用.and() .apply(new TempConfigurer(tempTokenGenerator)); 感谢您的回复,但我已经申请了匹配器,您可能会看到我的 OP。以下是我如何实现匹配器 .antMatchers("/secure/path/**").permitAll() .antMatchers("/unsecured/path/**").fullyAuthenticated() .and().logout()。 permitAll() 但它不起作用。

以上是关于Spring Boot 安全配置不起作用的主要内容,如果未能解决你的问题,请参考以下文章

spring boot starter 安全发布方法不起作用

使用 mongodb PostAuthorize 和 PreAuthorize 的 Spring Boot 安全性不起作用

Spring Boot ReactiveCircuitBreaker 配置不起作用

Spring boot h2自动配置不起作用

Spring Boot 自动重新配置在 spring-boot-data-starter-jdbc 上不起作用

事务注释在 Spring Boot 2.1.3 中不起作用