diff --git a/maxkey-core/src/main/java/org/dromara/maxkey/entity/idm/Groups.java b/maxkey-core/src/main/java/org/dromara/maxkey/entity/idm/Groups.java index 6abc0da3..895d1869 100644 --- a/maxkey-core/src/main/java/org/dromara/maxkey/entity/idm/Groups.java +++ b/maxkey-core/src/main/java/org/dromara/maxkey/entity/idm/Groups.java @@ -65,10 +65,6 @@ public class Groups extends JpaEntity implements Serializable { @Column String orgIdsList; - @Column - String resumeTime; - @Column - String suspendTime; @Column int isdefault; @@ -228,22 +224,6 @@ public class Groups extends JpaEntity implements Serializable { this.orgIdsList = orgIdsList; } - public String getResumeTime() { - return resumeTime; - } - - public void setResumeTime(String resumeTime) { - this.resumeTime = resumeTime; - } - - public String getSuspendTime() { - return suspendTime; - } - - public void setSuspendTime(String suspendTime) { - this.suspendTime = suspendTime; - } - public String getInstId() { return instId; } @@ -275,10 +255,6 @@ public class Groups extends JpaEntity implements Serializable { builder.append(filters); builder.append(", orgIdsList="); builder.append(orgIdsList); - builder.append(", resumeTime="); - builder.append(resumeTime); - builder.append(", suspendTime="); - builder.append(suspendTime); builder.append(", isdefault="); builder.append(isdefault); builder.append(", description="); diff --git a/maxkey-core/src/main/java/org/dromara/maxkey/entity/permissions/Roles.java b/maxkey-core/src/main/java/org/dromara/maxkey/entity/permissions/Roles.java index 5a5da077..85175ba2 100644 --- a/maxkey-core/src/main/java/org/dromara/maxkey/entity/permissions/Roles.java +++ b/maxkey-core/src/main/java/org/dromara/maxkey/entity/permissions/Roles.java @@ -64,10 +64,6 @@ public class Roles extends JpaEntity implements Serializable { @Column String orgIdsList; - @Column - String resumeTime; - @Column - String suspendTime; @Column int isdefault; @@ -230,22 +226,6 @@ public class Roles extends JpaEntity implements Serializable { this.orgIdsList = orgIdsList; } - public String getResumeTime() { - return resumeTime; - } - - public void setResumeTime(String resumeTime) { - this.resumeTime = resumeTime; - } - - public String getSuspendTime() { - return suspendTime; - } - - public void setSuspendTime(String suspendTime) { - this.suspendTime = suspendTime; - } - public String getAppId() { return appId; } @@ -285,10 +265,6 @@ public class Roles extends JpaEntity implements Serializable { builder.append(filters); builder.append(", orgIdsList="); builder.append(orgIdsList); - builder.append(", resumeTime="); - builder.append(resumeTime); - builder.append(", suspendTime="); - builder.append(suspendTime); builder.append(", isdefault="); builder.append(isdefault); builder.append(", description="); diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/GroupsService.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/GroupsService.java index 67b37ed5..1a11b1c4 100644 --- a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/GroupsService.java +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/GroupsService.java @@ -18,8 +18,6 @@ package org.dromara.maxkey.persistence.service; import java.sql.Types; -import java.time.LocalDateTime; -import java.time.LocalTime; import java.util.List; import org.apache.commons.lang3.StringUtils; @@ -35,13 +33,10 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; -import com.fasterxml.jackson.annotation.JsonIgnore; - @Repository public class GroupsService extends JpaService{ - static final Logger _logger = LoggerFactory.getLogger(GroupsService.class); - @JsonIgnore + @Autowired GroupMemberService groupMemberService; @@ -77,26 +72,6 @@ public class GroupsService extends JpaService{ public void refreshDynamicGroups(Groups dynamicGroup){ if(dynamicGroup.getCategory().equals(Roles.Category.DYNAMIC)) { - boolean isDynamicTimeSupport = false; - boolean isBetweenEffectiveTime = false; - if(StringUtils.isNotBlank(dynamicGroup.getResumeTime()) - &&StringUtils.isNotBlank(dynamicGroup.getSuspendTime()) - &&!dynamicGroup.getSuspendTime().equals("00:00")) { - LocalTime currentTime = LocalDateTime.now().toLocalTime(); - LocalTime resumeTime = LocalTime.parse(dynamicGroup.getResumeTime()); - LocalTime suspendTime = LocalTime.parse(dynamicGroup.getSuspendTime()); - - _logger.info("currentTime: {} , resumeTime : {} , suspendTime: {}" - , currentTime - , resumeTime - , suspendTime); - isDynamicTimeSupport = true; - - if(resumeTime.isBefore(currentTime) && currentTime.isBefore(suspendTime)) { - isBetweenEffectiveTime = true; - } - - } if(StringUtils.isNotBlank(dynamicGroup.getOrgIdsList())) { String []orgIds = dynamicGroup.getOrgIdsList().split(","); @@ -120,23 +95,15 @@ public class GroupsService extends JpaService{ _logger.info("filters include SQL Injection Attack Risk."); return; } - filters = filters.replace("&", " AND "); - filters = filters.replace("|", " OR "); + //replace & with AND, | with OR + filters = filters.replace("&", " AND ").replace("|", " OR "); dynamicGroup.setFilters(filters); } - - if(isDynamicTimeSupport) { - if(isBetweenEffectiveTime) { - groupMemberService.deleteDynamicMember(dynamicGroup); - groupMemberService.addDynamicMember(dynamicGroup); - }else { - groupMemberService.deleteDynamicMember(dynamicGroup); - } - }else{ - groupMemberService.deleteDynamicMember(dynamicGroup); - groupMemberService.addDynamicMember(dynamicGroup); - } + + groupMemberService.deleteDynamicMember(dynamicGroup); + groupMemberService.addDynamicMember(dynamicGroup); + } } diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/RolesService.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/RolesService.java index 18ab6834..25e2a212 100644 --- a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/RolesService.java +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/RolesService.java @@ -20,8 +20,6 @@ package org.dromara.maxkey.persistence.service; import java.sql.Types; -import java.time.LocalDateTime; -import java.time.LocalTime; import java.util.List; import org.apache.commons.lang3.StringUtils; @@ -36,13 +34,10 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; -import com.fasterxml.jackson.annotation.JsonIgnore; - @Repository public class RolesService extends JpaService { static final Logger _logger = LoggerFactory.getLogger(RolesService.class); - @JsonIgnore @Autowired RoleMemberService roleMemberService; @@ -75,24 +70,6 @@ public class RolesService extends JpaService { public void refreshDynamicRoles(Roles dynamicRole){ if(dynamicRole.getCategory().equals(Roles.Category.DYNAMIC)) { - boolean isDynamicTimeSupport = false; - boolean isBetweenEffectiveTime = false; - if(StringUtils.isNotBlank(dynamicRole.getResumeTime()) - &&StringUtils.isNotBlank(dynamicRole.getSuspendTime()) - &&!dynamicRole.getSuspendTime().equals("00:00")) { - LocalTime currentTime = LocalDateTime.now().toLocalTime(); - LocalTime resumeTime = LocalTime.parse(dynamicRole.getResumeTime()); - LocalTime suspendTime = LocalTime.parse(dynamicRole.getSuspendTime()); - - _logger.info("currentTime: {} , resumeTime : {} , suspendTime: {}" , - currentTime , resumeTime , suspendTime); - isDynamicTimeSupport = true; - - if(resumeTime.isBefore(currentTime) && currentTime.isBefore(suspendTime)) { - isBetweenEffectiveTime = true; - } - - } if(StringUtils.isNotBlank(dynamicRole.getOrgIdsList())) { String []orgIds = dynamicRole.getOrgIdsList().split(","); @@ -117,24 +94,16 @@ public class RolesService extends JpaService { _logger.info("filters include SQL Injection Attack Risk."); return; } - filters = filters.replace("&", " AND "); - filters = filters.replaceAll("\\|", " OR "); + //replace & with AND, | with OR + filters = filters.replace("&", " AND ").replace("\\|", " OR "); _logger.debug("set filters {}" , filters); dynamicRole.setFilters(filters); } - - if(isDynamicTimeSupport) { - if(isBetweenEffectiveTime) { - roleMemberService.deleteDynamicRoleMember(dynamicRole); - roleMemberService.addDynamicRoleMember(dynamicRole); - }else { - roleMemberService.deleteDynamicRoleMember(dynamicRole); - } - }else{ - roleMemberService.deleteDynamicRoleMember(dynamicRole); - roleMemberService.addDynamicRoleMember(dynamicRole); - } + + roleMemberService.deleteDynamicRoleMember(dynamicRole); + roleMemberService.addDynamicRoleMember(dynamicRole); + } } diff --git a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/entity/Groups.ts b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/entity/Groups.ts index 8aa7330c..470421e1 100644 --- a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/entity/Groups.ts +++ b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/entity/Groups.ts @@ -24,13 +24,8 @@ export class Groups extends BaseEntity { category!: String; filters!: String; orgIdsList!: String; - resumeTime!: String; - suspendTime!: String; isdefault!: String; - picker_resumeTime: Date = new Date(format(new Date(), 'yyyy-MM-dd 00:00:00')); - picker_suspendTime: Date = new Date(format(new Date(), 'yyyy-MM-dd 00:00:00')); - constructor() { super(); } @@ -40,13 +35,6 @@ export class Groups extends BaseEntity { if (this.status == 1) { this.switch_status = true; } - - if (this.resumeTime != '') { - this.picker_resumeTime = new Date(format(new Date(), `yyyy-MM-dd ${this.resumeTime}:00`)); - } - if (this.suspendTime != '') { - this.picker_suspendTime = new Date(format(new Date(), `yyyy-MM-dd ${this.suspendTime}:00`)); - } } override trans(): void { if (this.switch_status) { @@ -54,12 +42,5 @@ export class Groups extends BaseEntity { } else { this.status = 0; } - - if (this.picker_resumeTime) { - this.resumeTime = format(this.picker_resumeTime, 'HH:mm'); - } - if (this.picker_suspendTime) { - this.suspendTime = format(this.picker_suspendTime, 'HH:mm'); - } } } diff --git a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/entity/Roles.ts b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/entity/Roles.ts index 1e5cc6fc..dfbee3bd 100644 --- a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/entity/Roles.ts +++ b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/entity/Roles.ts @@ -1,19 +1,18 @@ /* * Copyright [2024] [MaxKey of copyright http://www.maxkey.top] - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ - import format from 'date-fns/format'; @@ -27,11 +26,7 @@ export class Roles extends BaseEntity { category!: String; filters!: String; orgIdsList!: String; - resumeTime!: String; - suspendTime!: String; isdefault!: String; - picker_resumeTime: Date = new Date(format(new Date(), 'yyyy-MM-dd 00:00:00')); - picker_suspendTime: Date = new Date(format(new Date(), 'yyyy-MM-dd 00:00:00')); constructor() { super(); @@ -45,13 +40,6 @@ export class Roles extends BaseEntity { } else { this.switch_status = false; } - - if (this.resumeTime != '') { - this.picker_resumeTime = new Date(format(new Date(), `yyyy-MM-dd ${this.resumeTime}:00`)); - } - if (this.suspendTime != '') { - this.picker_suspendTime = new Date(format(new Date(), `yyyy-MM-dd ${this.suspendTime}:00`)); - } } override trans(): void { @@ -60,11 +48,5 @@ export class Roles extends BaseEntity { } else { this.status = 0; } - if (this.picker_resumeTime) { - this.resumeTime = format(this.picker_resumeTime, 'HH:mm'); - } - if (this.picker_suspendTime) { - this.suspendTime = format(this.picker_suspendTime, 'HH:mm'); - } } } diff --git a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/idm/groups/group-editer/group-editer.component.html b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/idm/groups/group-editer/group-editer.component.html index 2f3001c1..ada827da 100644 --- a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/idm/groups/group-editer/group-editer.component.html +++ b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/idm/groups/group-editer/group-editer.component.html @@ -28,30 +28,6 @@ - - {{ 'mxk.groups.resumeTime' | i18n }} - - - - - - {{ 'mxk.groups.suspendTime' | i18n }} - - - - {{ 'mxk.groups.orgIdsList' | i18n }} diff --git a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/permissions/roles/role-editer/role-editer.component.html b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/permissions/roles/role-editer/role-editer.component.html index 43e12f5b..361a50d4 100644 --- a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/permissions/roles/role-editer/role-editer.component.html +++ b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/permissions/roles/role-editer/role-editer.component.html @@ -4,8 +4,7 @@ {{ 'mxk.text.id' | i18n }} - + @@ -19,22 +18,26 @@ {{ 'mxk.text.id' | i18n }} - + {{ 'mxk.roles.name' | i18n }} - + {{ 'mxk.roles.appId' | i18n }} - + @@ -48,43 +51,56 @@ - - {{ 'mxk.roles.resumeTime' | i18n }} - - - - - - {{ 'mxk.roles.suspendTime' | i18n }} - - - - {{ 'mxk.roles.orgIdsList' | i18n }} - - + + {{ 'mxk.roles.filters' | i18n }} - + {{ 'mxk.text.description' | i18n }} - + @@ -93,4 +109,4 @@
-
\ No newline at end of file + diff --git a/maxkey-webs/maxkey-web-mgt/src/main/java/org/dromara/maxkey/autoconfigure/MaxKeyMgtListenerConfig.java b/maxkey-webs/maxkey-web-mgt/src/main/java/org/dromara/maxkey/autoconfigure/MaxKeyMgtListenerConfig.java index 0b4575cb..8712409f 100644 --- a/maxkey-webs/maxkey-web-mgt/src/main/java/org/dromara/maxkey/autoconfigure/MaxKeyMgtListenerConfig.java +++ b/maxkey-webs/maxkey-web-mgt/src/main/java/org/dromara/maxkey/autoconfigure/MaxKeyMgtListenerConfig.java @@ -20,11 +20,13 @@ package org.dromara.maxkey.autoconfigure; import org.dromara.maxkey.authn.session.SessionManager; import org.dromara.maxkey.configuration.ApplicationConfig; import org.dromara.maxkey.listener.DynamicGroupsListenerAdapter; +import org.dromara.maxkey.listener.DynamicRolesListenerAdapter; import org.dromara.maxkey.listener.ReorgDeptListenerAdapter; import org.dromara.maxkey.listener.SessionListenerAdapter; import org.dromara.maxkey.persistence.service.ConnectorsService; import org.dromara.maxkey.persistence.service.GroupsService; import org.dromara.maxkey.persistence.service.OrganizationsService; +import org.dromara.maxkey.persistence.service.RolesService; import org.dromara.maxkey.provision.thread.ProvisioningRunner; import org.dromara.maxkey.provision.thread.ProvisioningRunnerThread; import org.dromara.maxkey.schedule.ScheduleAdapterBuilder; @@ -85,6 +87,23 @@ public class MaxKeyMgtListenerConfig { logger.debug("DynamicGroups ListenerAdapter inited ."); return "dynamicGroupsListenerAdapter"; } + + @Bean + String dynamicRolesListenerAdapter( + Scheduler scheduler, + RolesService rolesService, + @Value("${maxkey.job.cron.schedule}") String cronSchedule + ) throws SchedulerException { + new ScheduleAdapterBuilder() + .setScheduler(scheduler) + .setCron(cronSchedule) + .setJobClass(DynamicRolesListenerAdapter.class) + .setJobData("rolesService",rolesService) + .build(); + + logger.debug("Dynamic Roles ListenerAdapter inited ."); + return "dynamicRolesListenerAdapter"; + } @Bean String provisioningRunnerThread( diff --git a/maxkey-webs/maxkey-web-mgt/src/main/java/org/dromara/maxkey/listener/DynamicRolesListenerAdapter.java b/maxkey-webs/maxkey-web-mgt/src/main/java/org/dromara/maxkey/listener/DynamicRolesListenerAdapter.java new file mode 100644 index 00000000..4159dfb5 --- /dev/null +++ b/maxkey-webs/maxkey-web-mgt/src/main/java/org/dromara/maxkey/listener/DynamicRolesListenerAdapter.java @@ -0,0 +1,68 @@ +/* + * Copyright [2024] [MaxKey of copyright http://www.maxkey.top] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package org.dromara.maxkey.listener; + +import java.io.Serializable; + +import org.dromara.maxkey.persistence.service.RolesService; +import org.dromara.maxkey.schedule.ScheduleAdapter; +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class DynamicRolesListenerAdapter extends ScheduleAdapter implements Job , Serializable { + /** + * + */ + private static final long serialVersionUID = 7000735366821127880L; + + static final Logger logger = LoggerFactory.getLogger(DynamicRolesListenerAdapter.class); + + transient RolesService rolesService; + + @Override + public void execute(JobExecutionContext context){ + if(jobStatus == JOBSTATUS.RUNNING) {return;} + + init(context); + + logger.debug("running ... " ); + jobStatus = JOBSTATUS.RUNNING; + try { + if(rolesService != null) { + rolesService.refreshAllDynamicRoles(); + Thread.sleep(10 * 1000);//10 minutes + } + logger.debug("finished " ); + jobStatus = JOBSTATUS.FINISHED; + }catch(Exception e) { + jobStatus = JOBSTATUS.ERROR; + logger.error("Exception " ,e); + } + } + + @Override + protected void init(JobExecutionContext context){ + super.init(context); + if(rolesService == null) { + rolesService = getParameter("rolesService",RolesService.class); + } + } + +}