当前位置: 首页 > 知识库问答 >
问题:

Spring Boot Management安全性与端口集的工作方式不同

刘安志
2023-03-14

我正在尝试配置具有Actuator支持的Spring Boot应用程序(1.2.3,但这在1.2.4. BUILD-SNAPSHOT版本中也失败了)。我想使用Actuator安全配置来控制对管理endpoint的访问,以及我们自己的应用程序其余部分的身份验证。

这是我的安全配置:

@Configuration
@EnableWebSecurity
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter
{

    @Autowired
    private CustomAuthenticationProvider customAuthProvider;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception
    {
        auth.authenticationProvider(customAuthProvider);
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception
    {
        http
            .authorizeRequests()
            .regexMatchers(API_DOC_REGEX).permitAll()
            .regexMatchers(String.format(PATH_REGEX, PUBLIC_ACCESS)).permitAll()
            .regexMatchers(String.format(PATH_REGEX, INTERNAL_ACCESS)).access("isAuthenticated() && authentication.hasOrigin('INTERNAL')")
            .regexMatchers(String.format(PATH_REGEX, EXTERNAL_AUTHENTICATED_ACCESS)).authenticated()
            .antMatchers("/**").denyAll()
            .and()
            .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.NEVER)
            .and()
            .addFilterAfter(customAuthProcessingFilter(), BasicAuthenticationFilter.class)
            .csrf().disable();
    }

}

当我没有设置管理端口时,这可以正常工作,但当我设置管理端口时,管理URL返回401响应。如果我把这行注释掉。antMatchers(“/**”)。denyAll(),则所有操作都无需任何身份验证。因此,当我设置自定义端口时,它似乎正在使用我的应用程序的安全配置作为执行器endpoint,但我不知道为什么。

如何让它在自定义端口上运行时使用自身的安全性?

共有1个答案

王昊
2023-03-14

扩展@M. Deina的评论,为Management的东西添加另一个适配器(尽管它已经有一个)似乎已经修复了它。这是我最终得到的类:

@Order(0)
@Configuration
public class ManagementSecurityConfig extends WebSecurityConfigurerAdapter
{

    @Autowired
    ManagementServerProperties managementProperties;

    @Override
    protected void configure(HttpSecurity http) throws Exception
    {
        http
                .requestMatchers()
                .requestMatchers(new RequestMatcher()
                {

                    @Override
                    public boolean matches(HttpServletRequest request)
                    {
                        return managementProperties.getContextPath().equals(request.getContextPath());
                    }
                })
                .and()
                .authorizeRequests()
                .anyRequest().hasRole("ADMIN")
                .and()
                .httpBasic();
    }
}
 类似资料:
  • 我在使用Spring Security的前/后授权注释和与Keycloak集成的Servlet API时遇到了问题。我调查了很多文章、教程和以下问题,但没有进一步的运气: 使用KeyClope在servlet应用程序中获取用户角色 Spring Boot Key斗篷-如何获得分配给用户的角色列表 将Spring Security注释与KeyClope一起使用 Spring Boot Spring

  • 我无法在注释中使用方法。还有给出。我错过了什么?尽管工作正常。 我正在从数据库中为用户分配权限。

  • 当我从edge节点运行sqoop作业时,它工作良好,能够从oracle中提取数据,但当我在crontab中调度相同的作业时,它会引发kerberos安全错误。 我在hortonworks网站上发现了同样的问题(见链接),但没有任何有效的答案。 https://community.hortonworks.com/questions/61856/kerberos-ticket-error-in-a-c

  • 这是我的安全配置代码: 但在编译spring时,仍在为我生成密码。 我通过print语句检查了配置是否正在加载,发现安全配置正在加载。我是否应该对给定的用户ID和密码进行任何更改。 提前感谢。

  • 我正在为我的应用程序编写单元测试,我在服务内部执行的步骤之一是从SpringSecurityContext获取当前经过身份验证的用户。 我知道,如果我想模拟Spring Security Authentication,我可以使用@SusMockUser,但它对我不起作用,因为当测试方法到达getAuthentication()方法调用时,它总是返回null... 我已经搜索了很多问题和博客帖子,但

  • Docker内置了PKI,使保障发布容器化的业务流程系统的安全性变得很简单。Swarm节点之间采用TLS来鉴权、授权和加密通信。 当我们运行docker swarm init命令时,Docker指定当前节点为一个manager节点。默认情况下,manager节点会生成一个新的根CA证书以及一对密钥。CA证书和密钥将会被用在节点之间的通信上。也可以通过参数--external-ca来指定其他CA证书