我正在尝试使用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。
MultipleHttpSecurityConfig
@EnableWebSecurity
的安全性admin/**工作正常,但所有consumer/**页面均未得到保护,登录页面未发生任何重定向。我搜索了其他答案,但没有一个有效。
admin/**
consumer/**
看一下Spring Security Reference:
@EnableWebSecurity public 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应首先考虑的对象。
WebSecurityConfigurerAdapter
@Order
3 http.antMatcher指出这HttpSecurity仅适用于以开头的URL/api/
http.antMatcher
HttpSecurity
URL/api/
4创建的另一个实例WebSecurityConfigurerAdapter。如果URL不以/api/该配置开头,则将使用此配置。此配置被认为是之后的,ApiWebSecurityConfigurationAdapter因为它的@Order值是after 1(没有@Order默认值是last)。
URL
/api/
ApiWebSecurityConfigurationAdapter
after 1(
您的第二个配置未使用,因为您的第一个配置匹配/**(未antMatcher配置)。而且您的第一个配置仅限制/admin/**,默认情况下允许所有其他URL。
/**
/admin/**