gpt4 book ai didi

java - spring boot oauth2管理httpbasic认证

转载 作者:搜寻专家 更新时间:2023-10-31 20:32:54 24 4
gpt4 key购买 nike

我有一个使用 oauth2 进行身份验证的 spring boot 应用程序。oauth2 机制正在运行,客户端可以进行身份​​验证并接收其访问 token 。

我想使用 httpbasic 身份验证来保护执行器端点,即不要求用户首先使用 oauth2 进行身份验证,然后再访问执行器端点。到目前为止我所做的是在属性文件中设置以下内容:

management.context-path=/admin/actuators
management.security.enabled=true
management.security.role=ADMIN

security.user.name=admin
security.user.password=password

我尝试了各种方法来使用 ResourceServerConfigurerAdapter 和 WebSecurityConfigurerAdapter 设置配置。

我的尝试都没有奏效,它一直告诉我

<oauth>
<error_description>
Full authentication is required to access this resource
</error_description>
<error>unauthorized</error>
</oauth>

让 OAUTH2 和管理端点正常工作的正确方法是什么?

最佳答案

问题是 @EnableResourceServer 导入了 ResourceServerConfiguration,其顺序为 3,远优于 ManagementServerProperties.ACCESS_OVERRIDE_ORDER
请参阅有关执行器安全性和排序配置类的 Spring Boot 文档:http://docs.spring.io/spring-boot/docs/1.4.3.RELEASE/reference/htmlsingle/#boot-features-security-actuator

默认执行器安全配置比仅允许访问/health 端点并阻止其余端点聪明得多,它实际上根据management.portmanagement.contextPath,要找到正确的管理端点 URL 而不会在您的安全中留下漏洞或弄乱您自己的资源会变得非常困难。

如果您想保留自动配置管理安全性的好处,有两个选择:

编辑:a) 使用 BeanPostProcessor 降低 ResourceServerConfiguration 顺序

此改进已由@dsyer 在 github 线程上提出:

@Component
@Slf4j
public class ResourceServerConfigurationPostProcessor implements BeanPostProcessor {

@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof ResourceServerConfiguration) {
LOGGER.debug("Lowering order of ResourceServerConfiguration bean : {}", beanName);
ResourceServerConfiguration config = (ResourceServerConfiguration) bean;
config.setOrder(SecurityProperties.ACCESS_OVERRIDE_ORDER);
}
return bean;
}

@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
return bean;
}

}

我只是用这个类替换了下面的代码,它运行得很好。


编辑:b)手动覆盖 ResourceServerConfiguration 顺序

如果您出于某种原因不喜欢后处理器,您可以将 @EnableResourceServer 替换为另一个配置类,其顺序将在默认管理安全之后:

/** 
* Extend the default resource server config class, and downgrade its order
*/
public class ResourceServerLowPrecedenceConfiguration extends ResourceServerConfiguration {

/**
* This is enough to override Spring Boot's default resource security,
* but it does not takes over the management.
*/
@Override
public int getOrder() {
return SecurityProperties.ACCESS_OVERRIDE_ORDER;
}
}

还有你自己的配置类:

/** @EnableResourceServer is replaced by @Import using the low precedence config */
@Configuration
@Import(ResourceServerLowPrecedenceConfiguration.class)
public class YourOwnOAuth2Config extends ResourceServerConfigurerAdapter {
@Override
public void configure(final HttpSecurity http) throws Exception {
// Secure your resources using OAuth 2.0 here
}
}

编辑:您还可以重写自己的 @EnableResourceServer 注释以简化 @Import :

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(ResourceServerLowPrecedenceConfiguration.class)
public @interface EnableResourceServer {
}

恕我直言,当 spring-security-oauth 在类路径上时,这应该是默认行为。
请参阅关于 GitHub 问题的讨论: https://github.com/spring-projects/spring-boot/issues/5072

关于java - spring boot oauth2管理httpbasic认证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35994813/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com