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

使用Hawtio进行基本身份验证的Spring Security 4.x JavaConfig

袁恩
2023-03-14

我正在尝试将Hawtio(1.4.64)连接到运行在Tomcat7的Spring应用程序中的Jolokia代理(1.3.3)。

在最近升级到Spring Security(4.0.3)之后,hawtio停止了正确的身份验证(使用基本auth),我们被踢回登录页面,类似于问题#1975。与这个问题不同的是,我们只使用Jolokia代理,而不是在应用程序中包含hawtio(我们没有使用Spring Boot)。

在检查了Spring调试日志之后,AnonymousAuthenticationFilter似乎在应用BasicAuthenticationFilter之前将用户设置为“Anonymous”。所以我调整了安全配置,禁用了所有的默认值,留下以下内容:

@Configuration
@Order(2)
public static class JolokiaSecurityConfig extends WebSecurityConfigurerAdapter {

    public JolokiaSecurityConfig() {
        super(true); // disable defaults
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .requestMatchers().antMatchers("/jolokia/**")
            .and().authorizeRequests().antMatchers("/jolokia/**").hasAuthority(BaseRoles.DEVELOPER).and().httpBasic();
    }
}

现在,当我登录到Hawtio时,我在Hawtio控制台中得到一个错误,其中包括Tomcat7服务器的一些输出:HTTP Status500--SecurityContext中没有找到身份验证对象

StackTrace:

Jul 06, 2016 12:43:14 AM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [jolokia-agent] in context with path [/foobar] threw exception
org.springframework.security.authentication.AuthenticationCredentialsNotFoundException: An Authentication object was not found in the SecurityContext
at org.springframework.security.access.intercept.AbstractSecurityInterceptor.credentialsNotFound(AbstractSecurityInterceptor.java:378)
at org.springframework.security.access.intercept.AbstractSecurityInterceptor.beforeInvocation(AbstractSecurityInterceptor.java:222)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:123)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
at org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilterInternal(BasicAuthenticationFilter.java:158)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)

...

你知道为什么基本身份验证不再起作用吗?谢谢你的帮助!

共有1个答案

李俭
2023-03-14

我们通过重写异常处理来再次调用BasicAuthenticationEntryPoint来解决这个问题:

@Configuration
@Order(2)
public static class JolokiaSecurityConfig extends WebSecurityConfigurerAdapter {

    private static final String REALM = "our admin services";
    private static final String JOLOKIA_URL_PATTERN = "/jolokia/**";

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        BasicAuthenticationEntryPoint authenticationEntryPoint = new BasicAuthenticationEntryPoint();
        authenticationEntryPoint.setRealmName(REALM);
        http
            .csrf().disable()
            .requestMatchers().antMatchers(JOLOKIA_URL_PATTERN)
            .and().authorizeRequests().antMatchers(JOLOKIA_URL_PATTERN).hasAuthority(BaseRoles.DEVELOPER)
            .and().httpBasic().realmName(REALM)
            .and().exceptionHandling().authenticationEntryPoint(authenticationEntryPoint);
    }
}
 类似资料:
  • 我一直试图用restTemplate传递基本身份验证,但它甚至没有将身份验证头传递给服务器。下面是我使用的bean定义` `

  • 问题内容: 我目前正在尝试使用HTTP和HTTPS访问URL。我尝试访问的URL需要基本身份验证。使用HTTP可以正常工作,但是使用HTTPS则不能。我不确定是否需要使用HTTPS添加其他内容。该URL应该返回给我的文本是键值格式,可以加载到对象中。 这是到目前为止我尝试过的代码。 这是证书类别 当我删除所有证书代码(以及证书代码)时的错误消息: 问题答案: 问题似乎是由于在更改连接的和实例之前打

  • 我是全新的RestTemboard和基本上在REST API也。我想通过Jira REST API检索我的应用程序中的一些数据,但取回401未经授权。在jira rest api留档上找到并发表文章,但不知道如何将其重写为java,因为示例使用curl的命令行方式。我将感谢任何建议或建议如何重写: 进入java使用SpringRest模板。其中ZnJlZDpmcmVk是用户名:密码的Bas64编码

  • 我正在使用Java的spring mvc(基于注释)。我需要在我的应用程序中做rest API。我对API和REST都很陌生。在我的REST应用程序中,所有的基本配置都需要做些什么?我计划使用“RestTemplate”如何用RestTemplate做基本的身份验证(在URL头中传递用户名和密码)?请任何人帮帮我。 提前道谢。

  • 问题内容: 使用基本身份验证进行身份验证时遇到问题。我正在使用符合协议的标准枚举来构造我的请求。问题是,当我在枚举中手动设置授权标头时,如下所示: 我总是收到401未经授权的回复。 但是, 如果我像这样使用回调设置密码: 它正确认证。我希望能够在符合的枚举中手动进行设置,而不是在中传递凭据。 我知道它正在使用身份验证挑战的后台,但我希望能够手动设置它。 这是我的实现: 问题答案: 最终弄清楚了问题

  • 问题内容: 我试图模仿Java中此curl命令的功能: 我使用Commons HttpClient 3.0编写了以下内容,但最终还是从服务器上获取了一个。有人可以告诉我我做错了什么吗? 我后来尝试了Commons HttpClient 4.0.1,但仍然遇到相同的错误: 问题答案: 好的,这样可以工作。万一有人想要它,这是对我有用的版本:)