spring-security - @EnableResourceServer : Mapping roles

标签 spring-security jwt spring-security-oauth2

如何在资源服务器中映射角色?

我在 Spring Boot 中创建了我认为最简单的资源服务器实现:

Application.java

@SpringBootApplication
@RestController
@EnableResourceServer
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @RequestMapping(value = "/user")
    public Principal user(Principal principal) {
        return principal;
    }
}

application.properties

security.oauth2.resource.user-info-uri=myUserInfoUri
security.oauth2.client.client-id=myId
security.oauth2.client.client-secret=mySecret

pom.xml

...
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.security.oauth</groupId>
        <artifactId>spring-security-oauth2</artifactId>
    </dependency>
</dependencies>

该应用程序运行良好。我调用我的身份验证服务器(在本例中为 KeyCloak)并检索 token 。然后,我使用作为授权 header 传入的 token 对 http://localhost:8080/user/ 进行 http get。

HTTP 响应包含来自 token 的信息,但 authorities 属性设置为 ROLE_USER。这与 token 中的角色不匹配。

HTTP 响应

...
"userAuthentication": {
  "authorities": [
    {
      "authority": "ROLE_USER"
    }
  ],
  "details": {
    "sub": "93f566bd-df68-4c68-b3c6-0173c476bc02",
    "name": "Andrew Neeson",
    "preferred_username": "andy",
    "given_name": "Andrew",
    "family_name": "Neeson",
  ...

token (已解析)

...
"realm_access": {
  "roles": [
    "role_1",
    "role_2"
  ]
},
"resource_access": {
  "account": {
    "roles": [
      "manage-account",
      "view-profile"
    ]
  }
},
"name": "Andrew Neeson",
"preferred_username": "andy",
"given_name": "Andrew",
"family_name": "Neeson",
...

如何从 token 中提取所需的信息?

最佳答案

我已经通过在 keycloak 客户端中创建 token 映射器来解决。 就我而言,映射器具有以下参数:

  • 名称:当局
  • 映射器类型:用户领域角色
  • token 声明名称:当局
  • 添加到访问 token :开启
  • 添加到用户信息:开启

希望这能有所帮助!

詹皮耶罗。

关于spring-security - @EnableResourceServer : Mapping roles,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47509387/

相关文章:

spring - 如何在没有XML文件的情况下配置Spring ACL

c# - 我可以使用 JWT 进行身份验证,但我的名称声明在 ASP.NET Core 应用程序中无法识别

java - 在 spring security 中解码 AWS Cognito 生成的 JWT 时出错

java - Spring OAuth2 配置流程。我是否需要自己的登录 Controller 来登录用户以提供资源服务访问?

java - Spring 安全 Java 配置。规则不适用

grails - 如果我使用 LDAP 身份验证,为什么必须在我的用户域中存储密码列?

java - 使用 Spring Boot 和 Waffle 配置 Spring Security 时发生循环依赖错误

java - 使用 Spring Boot 在微服务中进行 JWT 授权

jquery - JWT token 与 jQuery Ajax

spring-boot - Spring Boot Webflux Security - 编写测试时读取服务类中的 Principal