Spring 安全 5:为 OAuth2 认证用户提供角色
Spring security 5: providing roles for OAuth2 authenticated users
我现有 Spring 启动应用程序 Spring Security 5 和 OAuth2 客户端,我已经成功配置了外部 OAuth2 提供商(GitLab,在我的例子中)的身份验证。
现在我在配置授权时遇到问题。我希望有一些方法可以让我编写代码来解析给定用户的角色(通过调用数据库或只检查硬编码的用户名)。
我发现可以通过使用 PrincipalExtractor
和 AuthoritiesExtractor
来实现,在 article 中有很好的描述。但是,那些 类 在最近的 Spring 安全性中不再存在。 实现该目标的替代方法是什么,与 Spring Security 5 兼容?
您要找的是GrantedAuthoritiesMapper
在官方spring安全文档
中记录了here
这是一个代码示例:
@EnableWebSecurity
public class OAuth2LoginSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.oauth2Login(oauth2 -> oauth2
.userInfoEndpoint(userInfo -> userInfo
.userAuthoritiesMapper(this.userAuthoritiesMapper())
...
)
);
}
private GrantedAuthoritiesMapper userAuthoritiesMapper() {
return (authorities) -> {
Set<GrantedAuthority> mappedAuthorities = new HashSet<>();
authorities.forEach(authority -> {
if (OidcUserAuthority.class.isInstance(authority)) {
OidcUserAuthority oidcUserAuthority = (OidcUserAuthority)authority;
OidcIdToken idToken = oidcUserAuthority.getIdToken();
OidcUserInfo userInfo = oidcUserAuthority.getUserInfo();
// Map the claims found in idToken and/or userInfo
// to one or more GrantedAuthority's and add it to mappedAuthorities
} else if (OAuth2UserAuthority.class.isInstance(authority)) {
OAuth2UserAuthority oauth2UserAuthority = (OAuth2UserAuthority)authority;
Map<String, Object> userAttributes = oauth2UserAuthority.getAttributes();
// Map the attributes found in userAttributes
// to one or more GrantedAuthority's and add it to mappedAuthorities
}
});
return mappedAuthorities;
};
}
}
spring 安全文档中还有更多示例和解释。
我现有 Spring 启动应用程序 Spring Security 5 和 OAuth2 客户端,我已经成功配置了外部 OAuth2 提供商(GitLab,在我的例子中)的身份验证。
现在我在配置授权时遇到问题。我希望有一些方法可以让我编写代码来解析给定用户的角色(通过调用数据库或只检查硬编码的用户名)。
我发现可以通过使用 PrincipalExtractor
和 AuthoritiesExtractor
来实现,在 article 中有很好的描述。但是,那些 类 在最近的 Spring 安全性中不再存在。 实现该目标的替代方法是什么,与 Spring Security 5 兼容?
您要找的是GrantedAuthoritiesMapper
在官方spring安全文档
中记录了here这是一个代码示例:
@EnableWebSecurity
public class OAuth2LoginSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.oauth2Login(oauth2 -> oauth2
.userInfoEndpoint(userInfo -> userInfo
.userAuthoritiesMapper(this.userAuthoritiesMapper())
...
)
);
}
private GrantedAuthoritiesMapper userAuthoritiesMapper() {
return (authorities) -> {
Set<GrantedAuthority> mappedAuthorities = new HashSet<>();
authorities.forEach(authority -> {
if (OidcUserAuthority.class.isInstance(authority)) {
OidcUserAuthority oidcUserAuthority = (OidcUserAuthority)authority;
OidcIdToken idToken = oidcUserAuthority.getIdToken();
OidcUserInfo userInfo = oidcUserAuthority.getUserInfo();
// Map the claims found in idToken and/or userInfo
// to one or more GrantedAuthority's and add it to mappedAuthorities
} else if (OAuth2UserAuthority.class.isInstance(authority)) {
OAuth2UserAuthority oauth2UserAuthority = (OAuth2UserAuthority)authority;
Map<String, Object> userAttributes = oauth2UserAuthority.getAttributes();
// Map the attributes found in userAttributes
// to one or more GrantedAuthority's and add it to mappedAuthorities
}
});
return mappedAuthorities;
};
}
}
spring 安全文档中还有更多示例和解释。