为了账号安全,请及时绑定邮箱和手机立即绑定

Spring Security:多个HTTP配置无法正常工作

Spring Security:多个HTTP配置无法正常工作

Cats萌萌 2019-07-25 10:15:05
Spring Security:多个HTTP配置无法正常工作我正在尝试使用Spring Security,我有一个用例,我想要保护不同的登录页面和不同的URL集。这是我的配置:@Configuration@Order(1)public static class ProviderSecurity extends WebSecurityConfigurerAdapter{     @Override     protected void configure(HttpSecurity http) throws Exception {         http            .authorizeRequests()                 .antMatchers("/", "/home").permitAll()                 .antMatchers("/admin/login").permitAll()                 .antMatchers("/admin/**").access("hasRole('BASE_USER')")                 .and()             .formLogin()                 .loginPage("/admin/login").permitAll()                 .defaultSuccessUrl("/admin/home")                 .failureUrl("/admin/login?error=true").permitAll()                 .usernameParameter("username")                 .passwordParameter("password")                 .and()             .csrf()                                     .and()             .exceptionHandling().accessDeniedPage("/Access_Denied");                 }}@Configuration@Order(2)public static class ConsumerSecurity extends WebSecurityConfigurerAdapter {     @Override     protected void configure(HttpSecurity http) throws Exception {         http            .authorizeRequests()                 .antMatchers("/consumer/login").permitAll()                 .antMatchers("/consumer/**").access("hasRole('BASE_USER')")                 .anyRequest().authenticated()                 .and()             .formLogin()                 .loginPage("/consumer/login").permitAll()                 .defaultSuccessUrl("/consumer/home")                 .failureUrl("/consumer/login?error=true").permitAll()                 .usernameParameter("username")                 .passwordParameter("password")                 .and().csrf()                                 .and()             .exceptionHandling().accessDeniedPage("/Access_Denied");     }}这些类是MultipleHttpSecurityConfig具有注释的另一个类的内部类@EnableWebSecurity。安全性admin/**工作正常,但没有一个consumer/**页面是安全的,登录页面没有重定向。我搜索了其他答案,但都没有效果。
查看完整描述

2 回答

?
繁星coding

TA贡献1797条经验 获得超4个赞

看看Spring Security Reference

@EnableWebSecuritypublic class MultiHttpSecurityConfig {
  @Autowired
  public void configureGlobal(AuthenticationManagerBuilder auth) { 1
      auth          .inMemoryAuthentication()
              .withUser("user").password("password").roles("USER").and()
              .withUser("admin").password("password").roles("USER", "ADMIN");
  }

  @Configuration
  @Order(1)                                                        2
  public static class ApiWebSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter {
      protected void configure(HttpSecurity http) throws Exception {
          http              .antMatcher("/api/**")                               3
              .authorizeRequests()
                  .anyRequest().hasRole("ADMIN")
                  .and()
              .httpBasic();
      }
  }    

  @Configuration                                                   4
  public static class FormLoginWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {

      @Override
      protected void configure(HttpSecurity http) throws Exception {
          http              .authorizeRequests()
                  .anyRequest().authenticated()
                  .and()
              .formLogin();
      }
  }}

1正常配置身份验证

2创建WebSecurityConfigurerAdapter包含的实例@Order以指定WebSecurityConfigurerAdapter应首先考虑的实例。

http.antMatcher表明HttpSecurity这只适用于以。开头的网址/api/

4创建另一个实例WebSecurityConfigurerAdapter。如果URL未/api/以此配置启动,则将使用此配置。之后考虑此配置,ApiWebSecurityConfigurationAdapter因为它具有之后的@Order1(无@Order默认为最后)。

您的第二个配置未使用,因为您的第一个配置匹配/**(未antMatcher配置)。并且您的第一个配置仅限制/admin/**,默认情况下允许所有其他URL。


查看完整回答
反对 回复 2019-07-25
?
倚天杖

TA贡献1828条经验 获得超3个赞

你的第一个WebSecurityConfigurerAdapter

http            .authorizeRequests()

匹配所有网址,将其限制为仅/admin使用antMatcher以下网址开头的网址:

@Configuration@Order(1)public static class ProviderSecurity extends WebSecurityConfigurerAdapter{
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http            .antMatcher("/admin/**")
                .authorizeRequests()
                .antMatchers("/admin/login").permitAll()
                .antMatchers("/admin/**").access("hasRole('BASE_USER')")
                .and()

                ...


查看完整回答
反对 回复 2019-07-25
  • 2 回答
  • 0 关注
  • 1121 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信