【问题标题】:Assign roles manually after Azure AD authentication Spring boot app在 Azure AD 身份验证 Spring 启动应用程序之后手动分配角色
【发布时间】: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;
    }
}

还有其他使用 UserDetailsS​​ervice 实现的示例。我也试过了,但似乎没有任何效果。

用户通过Azure AD认证后拦截spring security的方式是什么,给认证用户注入一些自定义角色。 我了解,这样做的方式是使用 Graph API 授权用户,但目前,由于 Azure AD 的公司限制,没有设置角色。

【问题讨论】:

    标签: java spring-boot oauth-2.0 azure-active-directory authorization


    【解决方案1】:

    你可以这样使用:

    .oauth2Login()
        .userInfoEndpoint()
            .userAuthoritiesMapper(this.userAuthoritiesMapper())
             ...
    
    private GrantedAuthoritiesMapper userAuthoritiesMapper() {
            return (authorities) -> {
                Set<GrantedAuthority> mappedAuthorities = new HashSet<>();
                //fill in your authorities
                return mappedAuthorities;
            };
    }
    

    【讨论】:

      【解决方案2】:

      在您的安全配置中:

      @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 {
      
      

      【讨论】:

        猜你喜欢
        • 2017-12-02
        • 2016-12-19
        • 2016-04-14
        • 2022-10-07
        • 2016-09-08
        • 2019-05-28
        • 2022-10-25
        • 2019-03-24
        • 2016-04-23
        相关资源
        最近更新 更多