spring-security 如何为Sping Boot 项目配置Spring安全性

igsr9ssn  于 2022-11-11  发布在  Spring
关注(0)|答案(3)|浏览(175)

我正在尝试制作一个Web应用程序,该应用程序使用:SpringBoot、Mysql、JDBC、MVC、DAO、百里香叶、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”的类。我已经做了什么。然后配置“configure”,我不能正确地做:(

@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");
    }
}

对不起,如果我的问题似乎奇怪,但英语不是我的第一语言

brtdzjyr

brtdzjyr1#

从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()中。顺便说一句,我个人建议将公共页面加入白名单,并为其他所有内容添加身份验证(例如公共文件夹)。这样,如果你忘记为链接添加安全性,默认情况下它是不公开的。

wgmfuz8q

wgmfuz8q2#

您需要告诉Spring安全性哪些URL是公共的,例如-

@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,您可以创建需要公开的所有URL的列表。您还可以使用NegatedRequestMatcher获取所有专用URL

RequestMatcher privateUrlMatcher =  new 
   NegatedRequestMatcher(publicUrlMatcher);

我还建议您将所有公共URL保存在/src/main/resources/static/publicui下,将所有私有URL保存在/src/main/resources/static/privateui下,并对/publicui/* 拥有公共权限

u0sqgete

u0sqgete3#

请在SecSecurityConfig类中尝试以下操作

@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()

相关问题