我试图在调用时确保弹簧执行器服务/管理上下文路径:
http://localhost:9091/manage/metrics
在我的yalm.properties中使用此配置
management:
port: 9091
address: 127.0.0.1
context-path: /manage
security:
enabled: true
role: ADMIN
。
Git branch with security actuator service layer
但访问每项服务仍然是免费的。
Spring安全配置:
' @覆盖 protected void configure(HttpSecurity http)抛出异常{
http.authorizeRequests().antMatchers("/pizzas","/info","/addPizza").hasAnyRole("USER","ADMIN").and().authorizeRequests().antMatchers("/users","/addUser").hasRole("ADMIN").and().authorizeRequests().antMatchers("/static/**","/logout","/login").permitAll();
http.formLogin().loginPage("/login").failureUrl("/login?error").permitAll();
http.logout().logoutSuccessUrl("/?logout").deleteCookies("remember-me").permitAll();
http.sessionManagement().maximumSessions(1).
expiredUrl("/?expired").maxSessionsPreventsLogin(true).and()
.sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED);
}
/**
* Configure global security with Bccyptenoncder and custom userDetailService with Spring Security
* @param auth
* @throws Exception
*/
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsServiceImpl).passwordEncoder(passwordEncoder());
}
/**
* Bcrypt password encoding configuration, more info at http://www.baeldung.com/spring-security-registration-password-encoding-bcrypt
* @return
*/
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
'
答案 0 :(得分:1)
Spring boot团队已经解决了我这个问题。我在这里分享解决方案:
同源政策
您不能在执行器安全性中使用主Spring应用程序的登录页面。原因是cookie将与应用程序的域+端口+上下文路径相关联。这是同源政策的一部分
这意味着如果您将用户发送到localhost:9090 / pizza / login并进行身份验证,那么当您访问localhost时:9091 / manage / JSESSIONID cookie将不会提交给管理应用程序,这意味着您不会被视为已通过身份验证
为了跨域进行身份验证(在这种情况下是不同的端口),您需要一些单点登录(OpenID,CAS,SAML等)机制。
在管理应用程序中映射登录页面
要使用此配置,您需要在管理应用程序中设置登录页面。要执行此操作,您只需在请求/ login时返回HTML表单。但是,我并不确定如何在Boot管理应用程序中执行此操作。也许@philwebb或@dsyer可以详细说明如何做到这一点。
管理应用程序的独特安全配置
或者,您可以为管理应用程序创建单独的安全配置,以允许使用基本身份验证进行身份验证。为此,您将创建另一个类似于以下内容的安全配置:
@Order(0)
@Configuration
public class ManagementSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.requestMatchers()
.requestMatchers(request -> "/manage".equals(request.getContextPath()))
.and()
.authorizeRequests()
.anyRequest().hasRole("ADMIN")
.and()
.httpBasic();
}
}
这将确保如果上下文根是" / manage"使用此安全配置。一些兴趣点:
@Order(0)确保配置发生在其他安全配置之前,因为默认情况下,WebSecurityConfigurerAdapter的任何子类都将在100处排序。这很重要,因为只使用了第一个WebSecurityConfigurerAdapter(类似于authorizeRequests()匹配器) 。 请求匹配器使用lambda在contextPath上进行匹配。我原以为有一种更好的方法可以区分Spring Boot应用程序和主应用程序,但事实并非如此。也许@dsyer知道应该怎么做。 注
您可以更简洁地重写配置:
http
.authorizeRequests()
.antMatchers("/pizzas","/info","/addPizza").hasAnyRole("USER","ADMIN")
.antMatchers("/users","/addUser").hasRole("ADMIN")
.antMatchers("/static/**","/logout","/login").permitAll()
.and()
.formLogin()
.loginPage("/login")
.failureUrl("/login?error")
.permitAll()
.and()
.logout()
.logoutSuccessUrl("/?logout")
.deleteCookies("remember-me")
.permitAll();
您可以考虑阅读Spring Security Java Config Preview:Readability,了解有关如何格式化配置以便更好地阅读它的详细信息。