我在 Okta 中有一个 OIDC 应用程序,我用它来验证和授权我正在使用的 Web 应用程序:
此评论让我相信,在 Okta 中向我的授权服务器添加组声明会导致使用 okta-spring-boot-starter 时组自动转变为角色。 这不是我所经历的。
我的印象是,向校长请求权限会导致出现一个以 ROLE_ 开头的组列表
我的用户属于 Okta 中一个名为 App-User 的组。 如果我要求:
<div sec:authentication="principal.authorities">Roles</div>
我得到的回报是:
[App-User, Everyone, OIDC_USER, SCOPE_email, SCOPE_openid, SCOPE_profile]
这不起作用:
<div sec:authorize="hasRole('App-User')">You have the role</div>
但这确实:
<div sec:authorize="hasAuthority('App-User')">You have the authority</div>
我也觉得这很奇怪:
<div sec:authentication="principal.email"></div>
但这样做:
<div sec:authentication="principal.name"></div>
返回 Okta 中看似应用程序的客户端 ID,而不是用户名
00umarbvfdDvDofPu5d7
尝试获取principal.firstName会抛出错误,声称它不存在。
我发现这将为我提供主体上所有可用属性的列表:
<div sec:authentication="principal.attributes">Attributes</div>
从此,我发现我可以做到所有这些:
<div th:text="${#authentication.getPrincipal().getAttribute('name')}"></div>
<div th:text="${#authentication.getPrincipal().getAttribute('given_name')}"></div>
<div th:text="${#authentication.getPrincipal().getAttribute('family_name')}"></div>
<div th:text="${#authentication.getPrincipal().getAttribute('email')}"></div>
<div th:text="${#authentication.getPrincipal().getAttribute('groups')}"></div>
这符合我的目的,我可以接受使用 hasAuthority() 而不是 hasRole() 来显示目的