有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Spring安全性在同一API中使用OKTA保护某些rest端点,使用Active Directory保护其他端点

我有RESTAPI,我需要用OKTA身份验证保护一些(面向UI)端点,用Azure Active Directory保护其他(面向后端)端点。我设法分开做(我可以用OKTA或AAD保护端点),但他们不想一起工作。一旦我将okta-spring引导启动器添加到POM(或okta-spring-security-oauth2)中,AAD安全性就会停止工作,并且端点要么是打开的,要么是仅使用okta进行保护的。我正在尝试使用okta和aad的WebSecurity配置适配器实现:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig {


    @Configuration
    @Order(1)
    public static class OktaAdapter extends WebSecurityConfigurerAdapter {

        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.authorizeRequests()
                    .antMatchers("/v1/endpoint1").authenticated()
                    .antMatchers("/v1/endpoint2/**").authenticated();

        }
    }

    @Configuration
    @Order(2)
    public static class ActiveDirectoryAdapter extends WebSecurityConfigurerAdapter {
        @Autowired
        private AADAppRoleStatelessAuthenticationFilter filter;

        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.csrf().disable()
                    .authorizeRequests()
                    .antMatchers("/v1/endpoint3/**").authenticated()
                    .antMatchers("/v1/endpoint4/**").authenticated()
                    .and()
                    .addFilterBefore(filter, UsernamePasswordAuthenticationFilter.class);
        }
    }
}

但是,此配置仅适用于endpoint1和endpoint2(由okta保护),其他rest点是开放的(好像忽略了WebSecurityConfigureAdapter的第二个实现)。如果我从pom中删除okta包,AAD配置将开始工作。如果我切换上述配置的顺序,则没有任何安全性。我怀疑okta软件包进行了一些自动配置,但找不到任何关于它的信息。我错过了什么


共 (1) 个答案

  1. # 1 楼答案

    Okta Spring引导启动器主要是一个轻量级的包装器,用于帮助配置现有的Spring安全OAuth自动配置,只需几个Okta特定的位

    我的第一个建议(如果可能的话)是尝试为两个IDP使用SpringSecurityOAuth,因为它看起来不像AADStarterWorksSpringSecurity的内置OAuth支持(我可能错了,我只是快速看了一下)。假设AAD只是OAuth/OIDC,它只需进行一点配置即可工作

    您仍然需要一个解决方案来保护您的给定路线1&;2->;Okta 3&;4 AAD。有几种方法可以做到这一点。您可以使用作用域(假设它们不同)或其他类型的“权限”:

    http.authorizeRequests()
            .antMatchers("/your/route").hasAuthority("SCOPE_custom");
    

    Okta Spring启动程序应该与其他配置了Spring Security OAuth属性的IDP一起工作:https://docs.spring.io/spring-security/site/docs/current/reference/html5/#oauth2login-boot-property-mappings

    我不能百分之百地赞同AddStarter添加的内容,但我猜它与Okta类似。即:

    • 一组通用属性(与其他供应商产品内联)
    • 特定于供应商的JWT验证(Spring Security只进行基本的JWT验证,假设您使用的是JWT访问令牌,则每个供应商都有自己的建议)
    • 一点糖(例如,Okta启动程序添加了Okta组到Spring权限的映射)

    就JWT验证而言,Okta建议对JWT进行如下验证: https://scotch.io/tutorials/jwt-vs-opaque-access-tokens-use-both-with-spring-boot#toc-better-jwt-validation

    如果需要,也可以使用类似的技术

    随时通知我们