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

使用Spring Security OAuth2和Okta处理基于url的RBAC

商佑运
2023-03-14

我在Okta上设置了应用程序和授权服务器。我添加了两个组,即adminuser。身份验证流程运行正常,但当我尝试打印角色时,我得到的输出如下

[范围地址、范围电话、范围离线访问、范围开放ID、角色用户、范围电子邮件、范围个人资料]

打印角色的Java代码如下:

@RequestMapping("/securedPage")
    public String securedPage(Model model, Principal principal) {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        Set<String> roles = authentication.getAuthorities().stream()
             .map(r -> r.getAuthority()).collect(Collectors.toSet());
                System.out.println(roles);
         return roles.toString();
    }

application.properties

okta.oauth2.client-id=<client-id>
okta.oauth2.client-secret=<client-secret>
okta.oauth2.issuer=<issuer-url>
okta.oauth2.redirect-uri=/login
okta.oauth2.roles-claim=groups
server.port=9222
logging.level.org.springframework.security=TRACE

当我访问登录页面并输入用户名密码时,角色不会显示。但是奇怪的是,我看到了ROLE_USER,但是我已经将这些用途添加用户组中。

我遵循这个指南https://developer.okta.com/blog/2017/10/13/okta-groups-spring-security。我不确定如何在Spring Security中配置授权角色。

下面是Spring的安全配置


@Configuration
public class SpringSecurityWebAppConfig extends WebSecurityConfigurerAdapter{


    @Bean  
    GrantedAuthorityDefaults grantedAuthorityDefaults() { 
        return new GrantedAuthorityDefaults(""); // Remove the ROLE_ prefix  
    } 

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.antMatcher("/**")
                .authorizeRequests()
                .antMatchers("/").permitAll()
                .anyRequest().authenticated()
                .and()
                .oauth2Login();
    }
}

波姆。xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example.demo</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.SR8</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.okta.spring</groupId>
            <artifactId>okta-spring-boot-starter</artifactId>
            <version>1.4.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-oauth2</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

uestMatcher  : Checking match of request : '/securedPage'; against '/'
2021-01-09 00:41:57.674 DEBUG 21292 --- [nio-9222-exec-4] o.s.s.w.a.i.FilterSecurityInterceptor    : Secure object: FilterInvocation: URL: /securedPage; Attributes: [authenticated]
2021-01-09 00:41:57.678 DEBUG 21292 --- [nio-9222-exec-4] o.s.s.w.a.i.FilterSecurityInterceptor    : Previously Authenticated: org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken@dffd3eb: Principal: Name: [00u3g2nr7ISCACRyk5d6], Granted Authorities: [[ROLE_USER, SCOPE_address, SCOPE_email, SCOPE_offline_access, SCOPE_openid, SCOPE_phone, SCOPE_profile]], User Attributes: [{at_hash=dHbIlPZ1tUzL-y5vmVb1cQ, sub=00u3g2nr7ISCACRyk5d6, zoneinfo=America/Los_Angeles, ver=1, email_verified=true, amr=["pwd"], iss=https://dev-9729512.okta.com/oauth2/edukart, preferred_username=kishore@gmail.com, locale=en-US, given_name=kishore, nonce=FxcHjdKHTsisyWG8jiLgEbH84H2AxyCdISv5U0JyVA8, aud=[0oa3eaj576gLDYwsh5d6], updated_at=2021-01-07T19:46:08Z, idp=00o3ct0plX9rgiTmB5d6, auth_time=2021-01-08T18:48:46Z, name=kishore kumar, exp=2021-01-08T20:11:54Z, family_name=kumar, iat=2021-01-08T19:11:54Z, email=kishore@gmail.com, jti=ID.xLH6W1loE_ELRLCWEuyGHV42-pkw3eCDqfNVlyQOfnc}]; Credentials: [PROTECTED]; Authenticated: true; Details: org.springframework.security.web.authentication.WebAuthenticationDetails@43458: RemoteIpAddress: 0:0:0:0:0:0:0:1; SessionId: D028931C57C35976D9AB6FC2C9543B4B; Granted Authorities: ROLE_USER, SCOPE_address, SCOPE_email, SCOPE_offline_access, SCOPE_openid, SCOPE_phone, SCOPE_profile

我哪里出错了,以及如何使用Okta组调试Spring安全角色。

更新:我将okta spring boot starter版本更新为1.4.0,现在我可以看到分配给用户的admins角色<代码>角色::[SCOPE_地址、所有人、SCOPE_电话、SCOPE_离线访问、SCOPE_openid、角色_用户、SCOPE_电子邮件、SCOPE_个人资料、管理员]

问题:

  1. 为什么只有在包含在令牌类型中的ID-Token配置声明时,角色才会被获取,而在Okta中将其作为ACCESS_-Token的一部分发送时,角色才会被获取
Principal :: Name: [00u40teh2owUKq5ZL5d6], Granted Authorities: [[Everyone, ROLE_USER, SCOPE_address, SCOPE_email, SCOPE_offline_access, SCOPE_openid, SCOPE_phone, SCOPE_profile, admins]], User Attributes: [{at_hash=uB-Gcqt-H6ezmv8KpIpx_g, sub=00u40teh2owUKq5ZL5d6, zoneinfo=America/Los_Angeles, ver=1, email_verified=true, amr=["pwd"], iss=https://dev-7858070.okta.com/oauth2/default, groups=["Everyone","admins"], preferred_username=ramesh@gmail.com, locale=en-US, given_name=ramesh, nonce=KXqGlhOj5ZVoChXo-ATjoHW-9ABAcEi5AnukAGXxg78, aud=[0oa3mz4mtisXjRJf85d6], updated_at=2021-01-20T03:17:42Z, idp=00o3myy20pqywuN5o5d6, auth_time=2021-01-21T03:02:46Z, name=ramesh kumar, exp=2021-01-21T04:02:49Z, family_name=kumar, iat=2021-01-21T03:02:49Z, email=ramesh@gmail.com, jti=ID.XQ4cKdIMuQKJv941EkYyDFJDCtKFAzaItPdyLPkMXPQ}] roles :: [SCOPE_address, Everyone, SCOPE_phone, SCOPE_offline_access, SCOPE_openid, ROLE_USER, SCOPE_email, SCOPE_profile, admins]

共有1个答案

仲孙鸿畴
2023-03-14

看看你提到的博客文章中的“授权服务器”部分:

https://developer.okta.com/blog/2017/10/13/okta-groups-spring-security#authorization-server

这篇文章使用了这些库的旧版本,但是要确保定义了“组”声明。您可能需要将“令牌类型中的包含”值设置为“两者”(或者遵循同样的步骤为“标识令牌”创建一个)

这篇文章可能早于Spring Security对OIDC的支持。

让我们保持联系,如果这是问题所在,我会调整帖子来提及这一点。

如果没有帮助,请使用Okta管理/开发人员控制台中“授权服务器”配置页面上的“令牌预览”选项卡。一旦一切配置正确,您应该会看到列出了一个“组”声明。

更新(回答其他问题):

>

还有其他流也会使用访问令牌,要更详细地描述两者之间的差异以及哪些流使用哪些令牌,请查看Okta开发YouTube通道

这是我的错,我错过了这一页。您可以为这两种令牌类型创建声明。

它使用组中的名称,如果您希望它使用ROLE_ADMIN,则可以使用该名称创建Okta组。

 类似资料:
  • 0.7 新版功能. Flask 0.7 版引入了 URL 处理器的概念。此概念的意义在于,对于一部分资源, 您并不是很清楚该如何设定其 URL 相同的部分。例如可能有一些 URL 包含了几个字母 来指定的多国语言语种,但是你不想在每个函数里都手动识别到底是哪个语言。 搭配 Blueprint 使用时,URL 处理器尤其有用。这里我们将会就具体的应用例子介绍如何使用 URL 处理器和 Bluepri

  • 我想分散加工大批量。这个想法是使用Spring Batch在云中激发一堆AMQP消费者,然后加载廉价的任务(如项目ID)并将它们提交给AMQP交换。结果的书写将由消费者自己完成。 null

  • 在Anylogic模型中,我的源块根据定义代理必须到达哪个节点的数据库值在不同节点上生成代理。 相同位置的订单同时到达(例如,7:30,3个代理订单到达node1,4个代理订单到达node2)。 现在我想做的是,节点1上的订单生成一批1x2和1x1,而节点2上的订单生成一批2。这些代理将扣押将这些批次运输到同一位置的运输公司,然后解除批次。 因此,我的问题是如何基于从数据库加载的Arrivaloc

  • 是否可以处理特定url模式的404状态?我想显示登录页面,如果有人去'localhost:8080/login/other'但没有请求映射'login/other'。Controller类如下所示: 我无法添加“/login/**”,因为它与我静态内容匹配,而对js或css的任何请求都与endpoint匹配。HTML示例:

  • 本文向大家介绍基于python 爬虫爬到含空格的url的处理方法,包括了基于python 爬虫爬到含空格的url的处理方法的使用技巧和注意事项,需要的朋友参考一下 道友问我的一个问题,之前确实没遇见过,在此记录一下。 问题描述 在某网站主页提取url进行迭代,爬虫请求主页时没有问题,返回正常,但是在访问在主页提取到的url时出现了400状态码(400 Bad Request)。 结论 先贴出结论来

  • 在hello-koa工程中,我们处理http请求一律返回相同的HTML,这样虽然非常简单,但是用浏览器一测,随便输入任何URL都会返回相同的网页。 正常情况下,我们应该对不同的URL调用不同的处理函数,这样才能返回不同的结果。例如像这样写: app.use(async (ctx, next) => { if (ctx.request.path === '/') { ctx.