[英]Assign roles manually after Azure AD authentication Spring boot app
我在 Azure AD 上注册了一个应用程序,oauth2AllowImplicitFlow 设置为 True。
由于 Azure AD 的限制,我无法向已注册的应用程序添加用户角色和组。 这些将在未来从其他来源同步。 同时,我需要一种在用户通过身份验证后从数据库或属性文件授权用户的方法。
这是我的基本设置,通过身份验证但由于访问被拒绝而吐出服务器错误。
身份验证使用依赖项 azure-active-directory-spring-boot-starter 和 spring-boot-starter-oauth2-client。
spring.security.oauth2.client.registration.azure.client-id=xxxx
spring.security.oauth2.client.registration.azure.client-secret=yyyy
azure.activedirectory.tenant-id=zzzz
azure.activedirectory.user-group.allowed-groups=group1, group2, group3
spring.security.oauth2.client.registration.azure.provider=azure
group1、group2、group3 存在但为空且没有附加角色。
@EnableWebSecurity
@EnableGlobalMethodSecurity(
prePostEnabled = true,
securedEnabled = true,
jsr250Enabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private OAuth2UserService<OidcUserRequest, OidcUser> oidcUserService;
@Autowired
private UserDetailsServiceImpl userDetailsServiceImpl;
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.antMatcher("/**")
.authorizeRequests()
.anyRequest().authenticated()
.and()
.oauth2Login()
.userInfoEndpoint()
.oidcUserService(oidcUserService);
}
@Autowired
public void configAuthentication(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsServiceImpl);
}
}
我需要一种方法来拦截认证后的安全配置,并手动添加角色。 我尝试扩展 OidcUserService 并将其插入 AuthenticationManagerBuilder
@Component
public class UserDetailsServiceImpl extends OidcUserService {
@Override
public OidcUser loadUser(OidcUserRequest userRequest) throws OAuth2AuthenticationException {
OidcUser oidcUser;
Set<GrantedAuthority> grantedAuthorities = null; //TODO: GRANT ROLES
oidcUser = new DefaultOidcUser(grantedAuthorities, userRequest.getIdToken());
return oidcUser;
}
}
还有其他使用 UserDetailsService 实现的示例。 我也试过,但似乎没有一个工作。
用户通过Azure AD认证后,有什么办法拦截spring security,给认证的用户注入一些自定义角色。 我明白,这样做的方式是授权用户使用 Graph API,但目前,由于 Azure AD 的公司限制,设置角色没有发生。
你可以使用这样的东西:
.oauth2Login()
.userInfoEndpoint()
.userAuthoritiesMapper(this.userAuthoritiesMapper())
...
private GrantedAuthoritiesMapper userAuthoritiesMapper() {
return (authorities) -> {
Set<GrantedAuthority> mappedAuthorities = new HashSet<>();
//fill in your authorities
return mappedAuthorities;
};
}
在您的 SecurityConfig 中:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.antMatcher("/**")
.authorizeRequests()
.anyRequest().authenticated()
.and()
.oauth2Login()
.userInfoEndpoint()
.oidcUserService(oidcUserService)
.and()
.addFilterAfter(customAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);
}
然后您可以通过以下方式创建 CustomAuthenticationFilter:
public class CustomAuthenticationFilter extends AbstractAuthenticationProcessingFilter {
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.