如何为 spring 引导项目配置 spring 安全性

how to configure spring security for spring boot project

我正在尝试制作一个使用以下内容的网络应用程序: Spring启动, Mysql, JDBC , MVC, 道 百里香叶, IntelliJ

我正试图弄清楚 Spring 安全性是如何工作的(我在这方面遇到了很多困难)。 我的观点整理如下:

resources(folder): - ________static(folder)
                         |____templates(folder):__________images(folder)
                                                      |___userOnly(folder):_____header.html
                                                      |                       |__help.html
                                                      |                       |__menu.html
                                                      |                       |__newDocForm.html
                                                      |                       |__profil.html
                                                      |
                                                      |__firstPage.html
                                                      |__header.html
                                                      |__home.html
                                                      |__index.html
                                                      |__inscriptionForm.html
                                                      |__loginPage.html

我希望身份不明的用户可以访问除“userOnly”中包含的视图之外的所有视图,并且我的“loginPage”页面用作登录页面。

如果我理解正确,我必须创建一个继承自“WebSecurityConfigurerAdapter”的class。 我做了什么。 然后配置“配置”,我不能正确地做:(

@Configuration
@EnableWebSecurity
public class SecSecurityConfig extends WebSecurityConfigurerAdapter {


    @Override
    protected void configure(final HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .antMatchers("/userOnly/**").hasRole("USER")
                .anyRequest().authenticated()
                .and()
                .formLogin()
                .loginPage("/loginPage.html");
    }
}

抱歉,如果我的问题看起来很奇怪,但英语不是我的第一语言

你需要告诉 Spring 安全 URL 是什么 public 像这样 -

@Configuration
@EnableWebSecurity
public class SecSecurityConfig extends WebSecurityConfigurerAdapter {

private static final String[] PUBLIC_URLS = {"/public/*"};

@Override
protected void configure(final HttpSecurity http) throws Exception {
           http.authorizeRequests()
            .antMatchers("/userOnly/**").hasRole("USER")
            .anyRequest().authenticated()
            .and()
            .formLogin()
            .loginPage("/loginPage.html");
  }
  
  @Override
  public void configure(WebSecurity web) {
    List<RequestMatcher> matchers =
    Arrays.asList(urls).stream().map(url -> new 
    AntPathRequestMatcher(url)).collect(Collectors.toList());
    web.ignoring().requestMatchers(new OrRequestMatcher(matchers));
  }
}

使用 OrRequestMatcher ,您可以创建您需要 public 的所有 URL 的列表。 您还可以使用 NegatedRequestMatcher 来获取所有私有 URL

   RequestMatcher privateUrlMatcher =  new 
   NegatedRequestMatcher(publicUrlMatcher);

我还建议您将所有 public url 保留在 /src/main/resources/static/publicui 下,将所有 /src/main/resources/static/privateui 下的私有化并获得 public 对 /[=24 的许可=]ui/*

在您的 SecSecurityConfig 中尝试以下操作 class

@Configuration
@EnableAutoConfiguration
@EnableWebSecurity
public class SecSecurityConfig extends WebSecurityConfigurerAdapter {

@Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
        
            .antMatchers("/users").authenticated()
            .anyRequest().permitAll()
            .and()
            .formLogin()
            
                .usernameParameter("email")
                .defaultSuccessUrl("/lib/allBooks")
                .permitAll()
            .and()
            .logout().logoutSuccessUrl("/lib").permitAll();
        
        http       
        .csrf().disable();
    }
}

只需修改为您的应用程序设置的参数。如果您没有登录表单,您可以跳过

                .usernameParameter("email")
                .defaultSuccessUrl("/lib/allBooks")
                .permitAll()

从 Spring-Boot 2.7 开始,不推荐使用 WebSecurityConfigurerAdapter。如果您使用的是 spring-boot 2.6 或更早版本,其他答案可能更适合。

据我所知,在 Spring-Boot 2.7 中定义安全配置的推荐方法如下:

@Configuration
public class WebSecurityConfig
{
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception
    {
        // @formatter:off
        http.authorizeRequests()
            .mvcMatchers("/userOnly/**").permitAll()
            .anyRequest().permitAll();
        http.formLogin()
            .permitAll()
            .loginPage("/loginPage.html");
        http.logout()
            .permitAll();
        // @formatter:on
        
        return http.build();
    }
}

我认为不推荐在 voucher_wolves 的答案中使用 web.ignoring(),而是应该将这些情况添加到 http.mvcMatcher().permitAll()。 在旁注中,如果您忘记为 link 添加安全性,我个人会推荐将 public 页面列入白名单并向其他所有内容添加身份验证(例如 public 文件夹)默认情况下不是 public。