【发布时间】:2020-12-29 18:32:33
【问题描述】:
我在 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 的公司限制,没有设置角色。
【问题讨论】:
标签: java spring-boot oauth-2.0 azure-active-directory authorization