IAM体系建设

 2023-09-05 阅读 166 评论 0

摘要:1 策略 支持系统策略和自定义策略,系统策略由开发人员初始化,自定义策略由用户自己来创建、但必须遵守我们的规则。 1.1 策略列表 1.2 策略详情 一个策略的动作(Action)可以有多个策略表达式,一个策略表达式一般对应一个接口. 2 用户组 给用户组授权策略,

1 策略

支持系统策略和自定义策略,系统策略由开发人员初始化,自定义策略由用户自己来创建、但必须遵守我们的规则。

1.1 策略列表

1.2 策略详情

一个策略的动作(Action)可以有多个策略表达式,一个策略表达式一般对应一个接口.

2 用户组

给用户组授权策略,一个用户组可以拥有多个用户,那在这个用户组下的用户就拥有这些策略。

2.1 用户组列表

2.2 给用户组授权

3 IAM用户

3.1 IAM用户列表

3.2 创建IAM用户 

 把创建的IAM用户加入用户组,则创建成功.

4 网关

4.1 配置路由信息

一个接口有一个具体的策略表达式,一个接口配置一条路由信息,一条路由信息有唯一的编码.

4.2 访问控制过滤器

网关通过访问控制过滤器获取到被访问接口的路由信息,通过路由信息的唯一编码获取到当前接口的策略表达式;然后拿着策略表达式和当前用户的token,去调用访问控制服务的接口来校验当前用户是否拥有该接口的访问权限.

5 访问控制服务

大致逻辑是:根据用户id获取用户组,然后获取用户组的所有策略,然后拿着这个接口的策略表达式去匹配这些策略,如果匹配到,则代表用户拥有这个接口的权限,如果匹配不到,则代表用户没有这个接口的权限.

/*** 将操作表达式与所有策略匹配** @param expression 表达式* @param policyIds  策略ID* @return*/@Overridepublic boolean checkExpressionByPolicyIds(String expression, Set<Long> policyIds) {boolean flag = false;for (Long policyId : policyIds) {// 根据策略ID获取策略内容IamPermissionPolicy iamPermissionPolicy =iamPolicyManageService.getIamPermissionPolicy(policyId);if (iamPermissionPolicy == null)continue;// 将策略json字符串转换实体类PolicyBean policyBean = JSON.parseObject(iamPermissionPolicy.getPolicyContent(), PolicyBean.class);// 将表达式与策略内容匹配int result = AccessControlUtil.checkAction(expression, policyBean);if (result == AccessControlUtil.ALLOW_MARK) {if (!flag) flag = true;} else if (result == AccessControlUtil.DENY_MARK) {return false;}}return flag;}
/*** 校验操作表达式是否能通过策略内容校验* @param action* @param policyBean* @return*/public static int checkAction(String action, PolicyBean policyBean) {if (ObjectUtils.isEmpty(policyBean)) return MISS_MARK;List<StatementBean> beans = policyBean.getStatement();if (CollectionUtils.isEmpty(beans)) return MISS_MARK;int beanSize = beans.size();boolean flag = false;StatementBean curBean;for (int j = 0; j < beanSize; j++) {curBean = beans.get(j);if (curBean == null) continue;if (curBean.isDeny()) {if (curBean.isMatched(action))return DENY_MARK;} else if (curBean.isAllow()) {if (curBean.isMatched(action))if (!flag) flag = true;}}if (flag)return ALLOW_MARK;return MISS_MARK;}
/*** 是否匹配** @param action* @return*/public boolean isMatched(String action) {if (StringUtils.isBlank(action)) {return false;}if (CollectionUtils.isNotEmpty(this.Action)) {if (Action.contains(action)) {return true;}for (String curAction : this.Action) {if (StringUtils.isNotBlank(curAction)) {if ("*".equals(curAction) || Pattern.matches(curAction.replaceAll("\\*", "[\\\\S\\\\s]*"), action)) {return true;}}}}return false;}

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://808629.com/485.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 86后生记录生活 Inc. 保留所有权利。

底部版权信息