Spring 安全,为什么第二个 WebSecurityConfigurerAdapter 不工作?
Spring Security, Why second WebSecurityConfigurerAdapter is not working?
更新:
在第一个 WebSecurityConfigurerAdapter 中添加 .antMatcher("/admin/**")
现在可以使用了,这是为什么?
现在第一个 WebSecurityConfigurerAdapter 的配置方法是:
protected void configure(HttpSecurity http) throws Exception {
http
.antMatcher("/admin/**") // <<<<<<<<<<<<<<--- newly added
.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADM")
.and()
.formLogin()
.loginPage("/admin/login")
.permitAll()
.logout()
.permitAll();
}
我的站点分为两部分,一部分供用户使用,另一部分供管理员使用,因此我在我的网络应用程序中为每个部分配置了两个 WebSecurityConfigurerAdapter。
像这样:
@Configuration
@EnableWebSecurity
public class WebSecurityConfig {
@Configuration
@Order(1)
public static class ManagerSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter {
@Autowired
private ManagerDetailsService managerDetailsService;
//allow access to static resouces
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/pc/css/**", "/pc/js/**", "/pc/img/**");
web.ignoring().antMatchers("/mobile/css/**", "/mobile/js/**", "/mobile/img/**");
}
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADM")
.and()
.formLogin()
.loginPage("/admin/login")
.permitAll()
.logout()
.permitAll();
}
@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth
.userDetailsService(managerDetailsService);
}
}
@Configuration
@Order(2)
public static class UserLoginWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {
@Autowired
private WeUserDetailsService weUserDetailsService;
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/user/**").hasRole("USER")
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/user/login")
.permitAll()
.logout()
.permitAll();
http.addFilterBefore(new WeAuthenticationFilter(authenticationManager()), BasicAuthenticationFilter.class);
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(weUserDetailsService);
}
}
}
问题是第二个 WebSecurityConfigurerAdapter 不工作,如果我在浏览器中输入:/admin,它会按预期将我带到 /admin/login,
而如果我输入 /user,它会直接进入控制器中的操作,通过安全过滤器。
这是为什么?
原因首先是WebSecurityConfigurerAdapter的
http
.authorizeRequests()
这将匹配所有的 url,使第二个 UserLoginWebSecurityConfigurerAdapter 无用,添加 antMatcher 可以帮助限制它可以匹配的 url,这就是添加的原因
.antMatcher("/admin/**")
可以工作。
更新:
在第一个 WebSecurityConfigurerAdapter 中添加 .antMatcher("/admin/**")
现在可以使用了,这是为什么?
现在第一个 WebSecurityConfigurerAdapter 的配置方法是:
protected void configure(HttpSecurity http) throws Exception {
http
.antMatcher("/admin/**") // <<<<<<<<<<<<<<--- newly added
.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADM")
.and()
.formLogin()
.loginPage("/admin/login")
.permitAll()
.logout()
.permitAll();
}
我的站点分为两部分,一部分供用户使用,另一部分供管理员使用,因此我在我的网络应用程序中为每个部分配置了两个 WebSecurityConfigurerAdapter。
像这样:
@Configuration
@EnableWebSecurity
public class WebSecurityConfig {
@Configuration
@Order(1)
public static class ManagerSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter {
@Autowired
private ManagerDetailsService managerDetailsService;
//allow access to static resouces
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/pc/css/**", "/pc/js/**", "/pc/img/**");
web.ignoring().antMatchers("/mobile/css/**", "/mobile/js/**", "/mobile/img/**");
}
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADM")
.and()
.formLogin()
.loginPage("/admin/login")
.permitAll()
.logout()
.permitAll();
}
@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth
.userDetailsService(managerDetailsService);
}
}
@Configuration
@Order(2)
public static class UserLoginWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {
@Autowired
private WeUserDetailsService weUserDetailsService;
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/user/**").hasRole("USER")
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/user/login")
.permitAll()
.logout()
.permitAll();
http.addFilterBefore(new WeAuthenticationFilter(authenticationManager()), BasicAuthenticationFilter.class);
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(weUserDetailsService);
}
}
}
问题是第二个 WebSecurityConfigurerAdapter 不工作,如果我在浏览器中输入:/admin,它会按预期将我带到 /admin/login,
而如果我输入 /user,它会直接进入控制器中的操作,通过安全过滤器。
这是为什么?
原因首先是WebSecurityConfigurerAdapter的
http
.authorizeRequests()
这将匹配所有的 url,使第二个 UserLoginWebSecurityConfigurerAdapter 无用,添加 antMatcher 可以帮助限制它可以匹配的 url,这就是添加的原因
.antMatcher("/admin/**")
可以工作。