首页 > 解决方案 > Spring security , Configuration hasAuthority check on endpoints not working

问题描述

我的 Web 应用程序有弹簧执行器和管理端点。

在我的弹簧安全配置中,我有以下代码:

 .and()
 .authorizeRequests()
 .antMatchers("/actuator/**", "/administration/**")
 .hasAuthority(Authority.ADMIN.name())

这似乎不起作用,期望的结果是只有具有 admin 权限的用户才能访问这些端点,现在,任何经过身份验证的用户都可以这样做。我使用具有 USER 权限而不是管理员权限的用户完成了它,它可以工作。

这对我来说太危险了,当当局可以管理时,我不想设置密码保护。

那么如何确保只有具有 ADMIN 权限的用户才能访问以下端点?

我只发布了一小段代码,请告诉我是否需要其他任何内容以便您能够提供帮助:)。

是的,我已经对此进行了调试,并且我的流程中的权限设置正确,admin 具有 auth admin 并且它适用于基本 auth 和 oauth2。有谁知道会发生什么?

目前只有完全未登录的人无法访问这些端点,这是我的完整安全配置:

        // @formatter:off
    httpSecurity
            .authorizeRequests()
            .antMatchers(
                    Utils.MAPPING_INDEX,
                    Utils.MAPPING_ARTICLE,
                    Utils.MAPPING_IMAGE,
                    Utils.MAPPING_ERROR,
                    Utils.MAPPING_VERIFY_MAIL,
                    Utils.MAPPING_REGISTER,
                    Utils.MAPPING_LOGIN,
                    Utils.MAPPING_LOGIN_ERROR,
                    Utils.MAPPING_LOGIN_VERIFIED,
                    Utils.MAPPING_LOGIN_VERIFICATION_ERROR,
                    Utils.MAPPING_RESET_PASSWORD,
                    Utils.MAPPING_LOGIN_PASSWORD_RESET_SUCCESS,
                    Utils.MAPPING_LOGIN_PASSWORD_RESET_LOCKED,
                    Utils.MAPPING_RESET_PASSWORD_RESET_MAIL_SEND,
                    Utils.MAPPING_LOGIN_PASSWORD_RESET_FAILURE,
                    Utils.MAPPING_INDEX_LOGOUT_SUCCESS,
                    Utils.MAPPING_REGISTER_SUCCESS,
                    Utils.MAPPING_REGISTER,
                    Utils.MAPPING_RESET_PASSWORD,
                    Utils.MAPPING_RESET_PASSWORD_NEW_PASSWORD,
                    Utils.MAPPING_AUTHOR,
                    Utils.MAPPING_CONTACT,
                    Utils.MAPPING_CONTACT_SUCCESS,
                    Utils.MAPPING_CONTACT_FAILURE,
                    Utils.MAPPING_REPORT_WORKAROUND,
                    "/test",
                    "/test1",
                    "/frag1",
                    "/frag2",
                    "/css/**",
                    "/js/**",
                    "/img/**",
                    "/fonts/**",
                    "/external/**",
                    "/favicon.ico",
                    "/favicon_32.ico",
                    "/favicon.svg"
            ).permitAll()
            .anyRequest().authenticated()

            .and()
            .authorizeRequests()
            .antMatchers("/actuator/**", "/administration/**")
            .hasAuthority(Authority.ADMIN.name())


            .and()

            .formLogin()
            .loginPage(Utils.MAPPING_LOGIN)
            .loginProcessingUrl(Utils.MAPPING_LOGIN)
            .usernameParameter("email")
            .passwordParameter("password")
            .successHandler(basicAuthenticationSuccessHandlerImpl)
            .failureUrl(Utils.MAPPING_LOGIN_ERROR)

            .and()

            .logout()
            .logoutUrl(Utils.MAPPING_INDEX)
            .logoutSuccessUrl(Utils.MAPPING_INDEX_LOGOUT_SUCCESS)
            .invalidateHttpSession(true)

            .and()

            .oauth2Login()
            .loginPage(Utils.MAPPING_LOGIN)
            .successHandler(oauth2AuthenticationSuccessHandler);

    // @formatter:on
}

标签: javaspringsecurityendpointactuator

解决方案


这个问题在评论中得到了回答,不幸的是评论者没有发布答案,所以我这样做了。所有功劳归功于 M. Deinum。

正确的解决方法是移动

.anyRequest().authenticated()

进入 httpsecurity 配置的最后一个位置。在这种情况下订购很重要。


推荐阅读