当前位置: 首页 > 知识库问答 >
问题:

Spring Boot Azure AD自定义角色

冯玮
2023-03-14

我有这个香草Spring启动/azure/starter应用程序,连接到我们的内部azure服务。https://docs.microsoft.com/de-de/azure/developer/java/spring-framework/configure-spring-boot-starter-java-app-with-azure-active-directory

一般按设计工作。

如果要为授权添加自定义角色,我有哪些选项?

我想要这种流动:

  1. 使用user/pw登录到azure(按预期工作)
  2. 从本地数据库(postgres)加载用户角色
  3. 将此角色注入/添加到Spring的Grant
  4. 列表中

对于spring security,我们通常使用自定义的AuthenticationProvider

目前我有以下工作代码:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfiguration extends AadWebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        super.configure(http);
        http
                .authorizeHttpRequests()
                .anyRequest()
                .authenticated()
                .and()
                .oauth2Login();

    }
}

我想要这样的东西:

@Component
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
@Slf4j
public class ThdAuthenticationProvider implements AuthenticationProvider {

    private final
    @NonNull
    IApplicationUserService userService;

    /**
     * Performs authentication with the same contract as .
     *
     * @param authentication the authentication request object.
     * @return a fully authenticated object including credentials. May return <code>null</code> if the
     * <code>AuthenticationProvider</code> is unable to support authentication of the passed
     * <code>Authentication</code> object. In such a case, the next <code>AuthenticationProvider</code> that
     * supports the presented <code>Authentication</code> class will be tried.
     * @throws AuthenticationException if authentication fails.
     */
    @Override
    public org.springframework.security.core.Authentication authenticate(org.springframework.security.core.Authentication
                                                                                 authentication)
            throws AuthenticationException {
        final String name = authentication.getName().toLowerCase();
        final String password = authentication.getCredentials().toString();

        // go to azure, login with name/password
        // come back if sucessfull

        List<String> roles = userService.fetchRoles(name);
        
        List<GrantedAuthority> grantedAuth = new ArrayList<>();
        grantedAuth.addAll(roles);
        return new UsernamePasswordAuthenticationToken(name, password, grantedAuth);
}

编辑

我的结局是这样的:根据这个留档:https://docs.spring.io/spring-security/site/docs/5.2.12.RELEASE/reference/html/oauth2.html#oauth2login-advanced-map-authorities-oauth2userservice

我的自定义用户服务-角色将从数据库或其他位置获取:

@Service
public class UserService {
    List<String> fetchUserRoles(String user){
        return List.of("Administrator", "Product Owner", "Developer");
    }
}

我的自定义安全链应用这些角色:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfiguration extends AadWebSecurityConfigurerAdapter {

    private final UserService userService;

    @Autowired
    public SecurityConfiguration(UserService userService) {
        this.userService = userService;
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        super.configure(http);
        http
                .authorizeHttpRequests()
                .anyRequest()
                .authenticated()
                .and()
                .oauth2Login()
                .userInfoEndpoint(userInfoEndpointConfig -> {
                    userInfoEndpointConfig.oidcUserService(this.oidcUserService());
                });

    }

    private OAuth2UserService<OidcUserRequest, OidcUser> oidcUserService() {
        final OidcUserService delegate = new OidcUserService();
        return (userRequest) -> {
            // Delegate to the default implementation for loading a user
            OidcUser oidcUser = delegate.loadUser(userRequest);

            OAuth2AccessToken accessToken = userRequest.getAccessToken();
            Set<GrantedAuthority> mappedAuthorities = new HashSet<>();

            // TODO
            // 1) Fetch the authority information from the protected resource using accessToken
            // 2) Map the authority information to one or more GrantedAuthority's and add it to mappedAuthorities

            // 3) Create a copy of oidcUser but use the mappedAuthorities instead

            List<String> dummy = userService.fetchUserRoles("dummy");
            dummy.forEach(user -> mappedAuthorities.add((GrantedAuthority) () -> user));
            oidcUser = new DefaultOidcUser(mappedAuthorities, oidcUser.getIdToken(), oidcUser.getUserInfo());

            return oidcUser;
        };
    }
}

共有1个答案

百里修真
2023-03-14

Spring Boot Azure AD自定义角色

请点击下面的链接,它有关于以下内容的详细说明:

>

  • 注册web API应用程序并配置API范围

    为用户分配这些角色

    在Azure AD中注册客户端应用程序并配置API权限

    参考:

    将Azure AD premium自定义角色与spring security一起用于基于角色的访问

  •  类似资料:
    • 自定义角色:只有团队负责人、团队管理员和地图管理员三个角色可以创建自定义角色,可以自定义角色的名称和权限。 自定义角色分为: 自定义地图角色:对地图级别进行权限设置 自定义图层角色:对图层级别进行权限设置 自定义子图层角色:对子图层级别进行权限设置 自定义业务流角色:对业务流层级进行权限设置 1.创建自定义角色: 以地图角色创建为例,点击“创建新角色”,出现创建创建新角色的弹框。点击“地图角色”。

    • 我已经基于命名的路由为Laravel(4.2)创建了自定义角色管理器,例如: 基本上,任何注册为

    • 本文向大家介绍Android自定义圆角ImageView,包括了Android自定义圆角ImageView的使用技巧和注意事项,需要的朋友参考一下 废话不多说了,直接给大家贴代码了。 java类如下: 定义一个attr.xml的文件,放在values目录下面,内容如下: 使用示例如下: 先要声明属性的名字空间: 然后再写跟一般定义View一样: 效果如图: 以上代码简单介绍了Android自定义圆

    • 我第一次尝试在request angular js中添加customer头,但遇到以下错误 Angular.js:10671错误:在“XMLHttpRequest”上执行“set requestheader”失败:“x-api-key:”不是有效的HTTP标头字段名。 下面是我的代码,在最高的“应用程序”级别: 我做错了什么/错过了什么/不明白什么?我如何将这个头添加到所有(甚至一个)请求中?

    • 我使用asp.net身份与索赔主体和索赔身份。标识由自定义用户管理器创建,并作为承载令牌发送给客户端。 一切正常,但是我想指示asp.net使用角色的自定义声明类型,而不是标准的System。安全。索赔。声明类型。作用(http://schemas.microsoft.com/ws/2008/06/identity/claims/role)。 有可能吗? 编辑:我想对角色构造函数使用标准的Auth

    • 灵活配置每个管理员的功能权限和管理范围,各司其职更灵活。 【优化】为企业预置角色的同时,支持企业自定义角色 【新增】角色的管理范围支持自定义,分为部门或项目,单据或员工的管理 【新增】角色的功能权限支持自定义,允许不同角色所拥有的功能权限不同