我试图在基于spring-boot spring MVC的应用程序中设置单个路径(/基本),以进行基本身份验证保护。我将使用自己的自定义配置参数进行配置,因此用户名和密码仅为“ admin”和“ admin”。
目前,该功能适用于/ basic路径(系统提示我并可以正确登录)。问题是注销不起作用(我不确定为什么),还要求其他路径(如/ other所示)获取基本身份验证凭据(在始终被拒绝之前)。
static class MyApplicationSecurity extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests().antMatchers("/open").permitAll(); http.authorizeRequests().antMatchers("/other").denyAll(); // Block it for now http.authorizeRequests().antMatchers("/basic").authenticated().and().httpBasic().and().logout().logoutUrl("/basic/logout").invalidateHttpSession(true).logoutSuccessUrl("/"); } }
我希望/ other总是被拒绝,但是我不明白为什么要进行基本身份验证。/ open可以正常工作。我也不明白为什么/ basic / logout不注销我(它也不会产生错误消息)。我确实有一些简单的代码作为注销端点的占位符,但是如果我没有,那么我会得到404。“ home”视图是我的Web应用程序根目录,因此我只想在注销后将用户发送到那里。
@RequestMapping("/logout") public ModelAndView logout() { // should be handled by spring security return new ModelAndView("home"); }
更新:这似乎最终可以解决该问题(除了注销部分,仍然不起作用):
@Configuration @Order(1) // HIGHEST public static class OAuthSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.antMatcher("/oauth").authorizeRequests().anyRequest().denyAll(); } } @Configuration public static class BasicAuthConfigurationAdapter extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.antMatcher("/basic").authorizeRequests().anyRequest().authenticated().and().httpBasic(); http.logout().permitAll().logoutUrl("/logout").logoutSuccessUrl("/").invalidateHttpSession(true); //.and().logout().logoutUrl("/basic/logout").invalidateHttpSession(true).logoutSuccessUrl("/"); } }
我不确定登出,但是我们有一些类似的问题,即我们的某些网站处于基本状态,而有些则没有。我们的解决方案是仅对需要http basic的路径使用第二个嵌套配置类。我们给这个配置一个@Order(1)..但是我不确定这是否必要。
用代码更新
@Configuration @EnableWebMvcSecurity @EnableGlobalMethodSecurity(prePostEnabled = true) public class SecurityConfig { private static final Logger LOG = LoggerFactory.getLogger(SecurityConfig.class); @Autowired public void registerAuthentication(AuthenticationManagerBuilder auth, Config appConfig) throws Exception { auth.inMemoryAuthentication() .withUser(appConfig.getString(APIConfig.CONFIG_KEY_MANAGEMENT_USER_NAME)) .password(appConfig.getString(APIConfig.CONFIG_KEY_MANAGEMENT_USER_PASS)) .roles(HyperAPIRoles.DEFAULT, HyperAPIRoles.ADMIN); } /** * Following Multiple HttpSecurity approach: * http://docs.spring.io/spring-security/site/docs/3.2.x/reference/htmlsingle/#multiple-httpsecurity */ @Configuration @Order(1) public static class ManagerEndpointsSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .antMatcher("/management/**").authorizeRequests().anyRequest().hasRole(HyperAPIRoles.ADMIN).and() .httpBasic(); } } /** * Following Multiple HttpSecurity approach: * http://docs.spring.io/spring-security/site/docs/3.2.x/reference/htmlsingle/#multiple-httpsecurity */ @Configuration public static class ResourceEndpointsSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http //fyi: This adds it to the spring security proxy filter chain .addFilterBefore(createBBAuthenticationFilter(), BasicAuthenticationFilter.class) ; } } }
这似乎可以通过基本身份验证将执行器端点保护在/ management上,而其他端点则使用自定义身份验证令牌头。我们不要求提供凭据(没有发出挑战),尽管有任何其他要求。我们必须注册一些其他内容才能实现(如果需要的话)。
希望这可以帮助