Skip to content

Commit 7b3ba96

Browse files
author
ljl
committed
iam:fix role.
1 parent 8dc511c commit 7b3ba96

File tree

4 files changed

+143
-14
lines changed

4 files changed

+143
-14
lines changed

services/bios-all/config/locale/zh-cn.iam

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,4 +61,7 @@
6161
404-iam-cert-phone-not-exist 当前手机号不存在
6262
409-iam-cert-phone-bind-already-exist 手机号已存在绑定关系
6363
409-iam-cert-email-bind-already-exist 邮箱已存在绑定关系
64-
404-sync-element-not-found-error 请先添加同步按钮
64+
404-sync-element-not-found-error 请先添加同步按钮
65+
66+
409-role-is-not-app 该角色不属于app角色,不能删除
67+
409-role-is-extend 该角色是扩展角色,不能删除

support/iam/src/basic/serv/iam_role_serv.rs

Lines changed: 102 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
use std::ops::Add;
22

33
use async_trait::async_trait;
4-
use bios_basic::helper::request_helper::get_remote_ip;
5-
use bios_basic::process::task_processor::TaskProcessor;
4+
use tardis::{TardisFuns, TardisFunsInst};
65
use tardis::basic::dto::TardisContext;
76
use tardis::basic::field::TrimString;
87
use tardis::basic::result::TardisResult;
9-
use tardis::db::sea_orm::sea_query::{Expr, SelectStatement};
10-
use tardis::db::sea_orm::EntityName;
118
use tardis::db::sea_orm::*;
9+
use tardis::db::sea_orm::prelude::Expr;
10+
use tardis::db::sea_orm::sea_query::SelectStatement;
1211
use tardis::log::info;
1312
use tardis::web::web_resp::TardisPage;
14-
use tardis::{TardisFuns, TardisFunsInst};
1513

14+
use bios_basic::helper::request_helper::get_remote_ip;
15+
use bios_basic::process::task_processor::TaskProcessor;
1616
use bios_basic::rbum::dto::rbum_filer_dto::{RbumBasicFilterReq, RbumRelFilterReq};
1717
use bios_basic::rbum::dto::rbum_item_dto::{RbumItemKernelAddReq, RbumItemKernelModifyReq};
1818
use bios_basic::rbum::dto::rbum_rel_dto::{RbumRelBoneResp, RbumRelCheckReq};
@@ -23,9 +23,10 @@ use bios_basic::rbum::serv::rbum_item_serv::RbumItemCrudOperation;
2323
use bios_basic::rbum::serv::rbum_rel_serv::RbumRelServ;
2424

2525
use crate::basic::domain::iam_role;
26-
use crate::basic::dto::iam_filer_dto::IamRoleFilterReq;
26+
use crate::basic::dto::iam_filer_dto::{IamAppFilterReq, IamRoleFilterReq};
2727
use crate::basic::dto::iam_role_dto::{IamRoleAddReq, IamRoleAggAddReq, IamRoleAggModifyReq, IamRoleDetailResp, IamRoleModifyReq, IamRoleSummaryResp};
2828
use crate::basic::serv::iam_account_serv::IamAccountServ;
29+
use crate::basic::serv::iam_app_serv::IamAppServ;
2930
use crate::basic::serv::iam_key_cache_serv::IamIdentCacheServ;
3031
use crate::basic::serv::iam_rel_serv::IamRelServ;
3132
use crate::iam_config::{IamBasicConfigApi, IamBasicInfoManager, IamConfig};
@@ -240,6 +241,13 @@ impl RbumItemCrudOperation<iam_role::ActiveModel, IamRoleAddReq, IamRoleModifyRe
240241
{
241242
return Err(funs.err().conflict(&Self::get_obj_name(), "delete", "role is not private", "409-iam-delete-role-conflict"));
242243
}
244+
let sub_role = Self::find_id_items(&IamRoleFilterReq{
245+
extend_role_id: Some(id.to_string()),
246+
..Default::default()
247+
},None,None,funs,ctx).await?;
248+
for role_id in sub_role {
249+
Self::delete_item_with_all_rels(&role_id,funs,ctx).await?;
250+
}
243251
Ok(None)
244252
}
245253

@@ -341,6 +349,7 @@ impl IamRoleServ {
341349
},
342350
kind: Some(kind.clone()),
343351
in_embed: Some(true),
352+
in_base: Some(true),
344353
..Default::default()
345354
},
346355
None,
@@ -374,6 +383,50 @@ impl IamRoleServ {
374383
Ok(())
375384
}
376385

386+
pub async fn add_app_copy_role_agg(app_id: &str, funs: &TardisFunsInst, ctx: &TardisContext)-> TardisResult<()>{
387+
Self::copy_role_agg(app_id, &IamRoleKind::App, funs, ctx).await?;
388+
let tenant_app_roles = Self::find_detail_items(
389+
&IamRoleFilterReq {
390+
basic: RbumBasicFilterReq {
391+
with_sub_own_paths: true,
392+
..Default::default()
393+
},
394+
kind: Some(IamRoleKind::App),
395+
in_embed: Some(false),
396+
in_base: Some(false),
397+
..Default::default()
398+
},
399+
None,
400+
None,
401+
funs,
402+
ctx,
403+
)
404+
.await?;
405+
for app_role in tenant_app_roles {
406+
Self::add_role_agg(
407+
&mut IamRoleAggAddReq {
408+
role: IamRoleAddReq {
409+
code: Some(TrimString::from(format!("{}:{}", app_id, app_role.code))),
410+
name: TrimString::from(app_role.name),
411+
icon: Some(app_role.icon),
412+
sort: Some(app_role.sort),
413+
kind: Some(app_role.kind),
414+
scope_level: Some(RbumScopeLevelKind::Private),
415+
in_embed: Some(app_role.in_embed),
416+
extend_role_id: Some(app_role.id),
417+
disabled: Some(app_role.disabled),
418+
in_base: Some(false),
419+
},
420+
res_ids: None,
421+
},
422+
funs,
423+
ctx,
424+
)
425+
.await?;
426+
}
427+
Ok(())
428+
}
429+
377430
pub async fn get_embed_subrole_id(extend_role_id: &str, funs: &TardisFunsInst, ctx: &TardisContext) -> TardisResult<String> {
378431
let scope_level = get_scope_level_by_context(ctx)?;
379432
info!(
@@ -398,6 +451,49 @@ impl IamRoleServ {
398451
Err(funs.err().not_found(&Self::get_obj_name(), "get_embed_subrole_id", "role not found", "404-iam-role-not-found"))
399452
}
400453

454+
/// 租户添加应用角色
455+
pub async fn tenant_add_app_role_agg(add_req: &mut IamRoleAggAddReq, funs: &TardisFunsInst, ctx: &TardisContext) -> TardisResult<String> {
456+
add_req.role.scope_level = Some(RbumScopeLevelKind::Private);
457+
let app_role_id = Self::add_role_agg(add_req,funs,ctx).await?;
458+
let app_ids = IamAppServ::find_id_items(&IamAppFilterReq {
459+
basic: RbumBasicFilterReq{
460+
with_sub_own_paths:true,
461+
..Default::default()
462+
},
463+
..Default::default()
464+
}, None, None, funs, ctx).await?;
465+
let app_role = Self::get_item(&app_role_id,&IamRoleFilterReq {
466+
basic: RbumBasicFilterReq{
467+
with_sub_own_paths:true,
468+
..Default::default()
469+
},
470+
..Default::default()
471+
}, funs, ctx).await?;
472+
for app_id in app_ids {
473+
Self::add_role_agg(
474+
&mut IamRoleAggAddReq {
475+
role: IamRoleAddReq {
476+
code: Some(TrimString::from(format!("{}:{}", app_id, app_role.code))),
477+
name: TrimString::from(app_role.name.clone()),
478+
icon: Some(app_role.icon.clone()),
479+
sort: Some(app_role.sort),
480+
kind: Some(app_role.kind.clone()),
481+
scope_level: Some(RbumScopeLevelKind::Private),
482+
in_embed: Some(app_role.in_embed),
483+
extend_role_id: Some(app_role_id.clone()),
484+
disabled: Some(app_role.disabled),
485+
in_base: Some(false),
486+
},
487+
res_ids: None,
488+
},
489+
funs,
490+
ctx,
491+
)
492+
.await?;
493+
}
494+
Ok(app_role_id)
495+
}
496+
401497
pub async fn add_role_agg(add_req: &mut IamRoleAggAddReq, funs: &TardisFunsInst, ctx: &TardisContext) -> TardisResult<String> {
402498
let role_id = Self::add_item(&mut add_req.role, funs, ctx).await?;
403499
if let Some(res_ids) = &add_req.res_ids {

support/iam/src/console_app/api/iam_ca_role_api.rs

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1-
use bios_basic::process::task_processor::TaskProcessor;
21
use tardis::web::context_extractor::TardisContextExtractor;
2+
use tardis::web::poem::Request;
33
use tardis::web::poem_openapi;
44
use tardis::web::poem_openapi::{param::Path, param::Query, payload::Json};
55
use tardis::web::web_resp::{TardisApiResult, TardisPage, TardisResp, Void};
66

7+
use bios_basic::helper::request_helper::add_remote_ip;
8+
use bios_basic::process::task_processor::TaskProcessor;
79
use bios_basic::rbum::dto::rbum_filer_dto::{RbumBasicFilterReq, RbumItemRelFilterReq};
810
use bios_basic::rbum::dto::rbum_rel_dto::RbumRelBoneResp;
911
use bios_basic::rbum::rbum_enumeration::RbumRelFromKind;
@@ -17,8 +19,7 @@ use crate::basic::serv::iam_role_serv::IamRoleServ;
1719
use crate::iam_constants;
1820
use crate::iam_constants::RBUM_SCOPE_LEVEL_APP;
1921
use crate::iam_enumeration::{IamRelKind, IamRoleKind};
20-
use bios_basic::helper::request_helper::add_remote_ip;
21-
use tardis::web::poem::Request;
22+
2223
#[derive(Clone, Default)]
2324
pub struct IamCaRoleApi;
2425

@@ -128,6 +129,29 @@ impl IamCaRoleApi {
128129
add_remote_ip(request, &ctx.0).await?;
129130
let mut funs = iam_constants::get_tardis_inst();
130131
funs.begin().await?;
132+
let app_role = IamRoleServ::get_item(&id.0,&IamRoleFilterReq{
133+
basic: RbumBasicFilterReq {
134+
with_sub_own_paths: true,
135+
..Default::default()
136+
},
137+
..Default::default()
138+
},&funs,&ctx.0).await?;
139+
if app_role.kind != IamRoleKind::App {
140+
Err(funs.err().conflict(
141+
&IamRoleServ::get_obj_name(),
142+
"delete",
143+
"This role is not an app role, cannot be deleted",
144+
"409-role-is-not-app",
145+
))?;
146+
}
147+
if app_role.extend_role_id != "".to_string() {
148+
Err(funs.err().conflict(
149+
&IamRoleServ::get_obj_name(),
150+
"delete",
151+
"This role is extend role, cannot be deleted",
152+
"409-role-is-extend",
153+
))?;
154+
}
131155
IamRoleServ::delete_item_with_all_rels(&id.0, &funs, &ctx.0).await?;
132156
funs.commit().await?;
133157
ctx.0.execute_task().await?;

support/iam/src/console_tenant/api/iam_ct_role_api.rs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,18 @@ pub struct IamCtRoleApi;
2727
impl IamCtRoleApi {
2828
/// Add Role
2929
#[oai(path = "/", method = "post")]
30-
async fn add(&self, mut add_req: Json<IamRoleAggAddReq>, ctx: TardisContextExtractor, request: &Request) -> TardisApiResult<String> {
30+
async fn add(&self,is_app: Query<Option<bool>>, mut add_req: Json<IamRoleAggAddReq>, ctx: TardisContextExtractor, request: &Request) -> TardisApiResult<String> {
3131
add_remote_ip(request, &ctx.0).await?;
3232
let mut funs = iam_constants::get_tardis_inst();
3333
funs.begin().await?;
34-
add_req.0.role.kind = Some(IamRoleKind::Tenant);
35-
let result = IamRoleServ::add_role_agg(&mut add_req.0, &funs, &ctx.0).await?;
34+
let mut result = "".to_string();
35+
if is_app.0.unwrap_or(false) {
36+
add_req.0.role.kind = Some(IamRoleKind::App);
37+
result = IamRoleServ::tenant_add_app_role_agg(&mut add_req.0, &funs, &ctx.0).await?;
38+
}else{
39+
add_req.0.role.kind = Some(IamRoleKind::Tenant);
40+
result = IamRoleServ::add_role_agg(&mut add_req.0, &funs, &ctx.0).await?;
41+
}
3642
funs.commit().await?;
3743
ctx.0.execute_task().await?;
3844
TardisResp::ok(result)
@@ -95,7 +101,7 @@ impl IamCtRoleApi {
95101
with_sub_own_paths: with_sub.0.unwrap_or(false),
96102
..Default::default()
97103
},
98-
kind: Some(IamRoleKind::Tenant),
104+
// kind: Some(IamRoleKind::Tenant),
99105
in_base: in_base.0,
100106
in_embed: in_embed.0,
101107
extend_role_id: extend_role_id.0,

0 commit comments

Comments
 (0)