更新
在第一个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();
}
我的网站分为两个部分,一个用于用户,另一个用于管理员,因此我在我的网络应用中为每个部分配置了两个WebSecurityConfigurerAdapters。
像这样:@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,它将通过安全过滤器直接在控制器中执行操作。
为什么会这样?
答案 0 :(得分:1)
原因是WebSecurityConfigurerAdapter的第一个
http
.authorizeRequests()
这将匹配所有网址,使第二个UserLoginWebSecurityConfigurerAdapter无用,添加antMatcher可以帮助限制它可以匹配的网址,这就是为什么添加
.antMatcher("/admin/**")
可以发挥作用。