我正在尝试使用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/**
个页面都没有安全保护,登录页面也没有重定向。我已经搜索了其他答案,但都没有。
答案 0 :(得分:16)
@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
的{{1}}实例,以指定应首先考虑@Order
。3
WebSecurityConfigurerAdapter
表示此http.antMatcher
仅适用于以HttpSecurity
开头的网址4创建
/api/
的另一个实例。如果URL不以WebSecurityConfigurerAdapter
开头,则将使用此配置。此配置在/api/
之后考虑,因为它在ApiWebSecurityConfigurationAdapter
之后具有@Order
值(默认值为1
)。
未使用您的第二个配置,因为您的第一个配置与@Order
匹配(未配置/**
)。并且您的第一个配置仅限制antMatcher
,默认情况下允许所有其他网址。
答案 1 :(得分:14)
您的第一个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()
...