Skip to content

Commit

Permalink
Update role mining feature
Browse files Browse the repository at this point in the history
1. Performing clustering over users objects.
2. Fix for jaccard metric.
  • Loading branch information
tchrapovic committed Jun 23, 2023
1 parent 00a350f commit f6cb98b
Show file tree
Hide file tree
Showing 46 changed files with 1,020 additions and 3,071 deletions.
1 change: 0 additions & 1 deletion config/sql/native-new/postgres-new-audit.sql
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,6 @@ DO $$ BEGIN
'REPORT_DATA',
'RESOURCE',
'ROLE',
'MINING',
'CLUSTER',
'PARENT_CLUSTER',
'SECURITY_POLICY',
Expand Down
30 changes: 0 additions & 30 deletions config/sql/native-new/postgres-new.sql
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,6 @@ CREATE TYPE ContainerType AS ENUM (
'SIMULATION_RESULT_PROCESSED_OBJECT',
'TRIGGER');

ALTER TYPE ObjectType ADD VALUE 'MINING';
ALTER TYPE ObjectType ADD VALUE 'CLUSTER';
ALTER TYPE ObjectType ADD VALUE 'PARENT_CLUSTER';
-- NOTE: Keep in sync with the same enum in postgres-new-audit.sql!
Expand Down Expand Up @@ -78,7 +77,6 @@ CREATE TYPE ObjectType AS ENUM (
'REPORT_DATA',
'RESOURCE',
'ROLE',
'MINING',
'CLUSTER',
'PARENT_CLUSTER',
'SECURITY_POLICY',
Expand Down Expand Up @@ -1160,34 +1158,6 @@ CREATE INDEX m_report_data_createTimestamp_idx ON m_report_data (createTimestamp
CREATE INDEX m_report_data_modifyTimestamp_idx ON m_report_data (modifyTimestamp);


CREATE TABLE m_mining_table (
oid UUID NOT NULL PRIMARY KEY REFERENCES m_object_oid(oid),
objectType ObjectType GENERATED ALWAYS AS ('MINING') STORED
CHECK (objectType = 'MINING'),
identifier TEXT,
riskLevel TEXT,
roles TEXT[],
rolesCount INTEGER,
members TEXT[],
membersCount INTEGER,
similarGroups TEXT[],
similarGroupsCount INTEGER
)
INHERITS (m_assignment_holder);

CREATE TRIGGER m_mining_table_oid_insert_tr BEFORE INSERT ON m_mining_table
FOR EACH ROW EXECUTE FUNCTION insert_object_oid();
CREATE TRIGGER m_mining_table_update_tr BEFORE UPDATE ON m_mining_table
FOR EACH ROW EXECUTE FUNCTION before_update_object();
CREATE TRIGGER m_mining_table_oid_delete_tr AFTER DELETE ON m_mining_table
FOR EACH ROW EXECUTE FUNCTION delete_object_oid();

CREATE INDEX m_mining_table_identifier_idx ON m_mining_table (identifier);
CREATE INDEX m_mining_table_riskLevel_idx ON m_mining_table (riskLevel);
CREATE INDEX m_mining_table_rolesCount_idx ON m_mining_table (rolesCount);
CREATE INDEX m_mining_table_membersCount_idx ON m_mining_table (membersCount);
CREATE INDEX m_mining_table_similarGroupsCount_idx ON m_mining_table (similarGroupsCount);

CREATE TABLE m_cluster_table (
oid UUID NOT NULL PRIMARY KEY REFERENCES m_object_oid(oid),
objectType ObjectType GENERATED ALWAYS AS ('CLUSTER') STORED
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,16 @@
import static com.evolveum.midpoint.gui.api.component.mining.analyse.tools.grouper.Grouper.getRoleGroupByJc;

import java.util.*;
import java.util.stream.Collectors;

import com.evolveum.midpoint.gui.impl.page.admin.role.mining.algorithm.DataPoint;
import com.evolveum.midpoint.prism.impl.binding.AbstractReferencable;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;

import org.jetbrains.annotations.NotNull;

import com.evolveum.midpoint.gui.impl.page.admin.role.mining.utils.RoleUtils;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.xml.ns._public.common.common_3.MiningType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType;

public class JacquardSorter {

Expand All @@ -41,15 +44,25 @@ private static double jacquardSimilarityMs(@NotNull UniqueRoleSet set1, UniqueRo
return (double) intersection.size() / union.size();
}

public static List<PrismObject<MiningType>> jaccSortMiningSet(List<PrismObject<MiningType>> miningSets) {
public static List<String> getRolesOid(AssignmentHolderType object) {
List<String> oidList;
List<AssignmentType> assignments = object.getAssignment();
oidList = assignments.stream().map(AssignmentType::getTargetRef).filter(
targetRef -> targetRef.getType().equals(RoleType.COMPLEX_TYPE))
.map(AbstractReferencable::getOid).sorted()
.collect(Collectors.toList());
return oidList;
}

public static List<DataPoint> jaccSortDataPoints(List<DataPoint> dataPoints) {

List<PrismObject<MiningType>> sortedUserSets = new ArrayList<>();
List<PrismObject<MiningType>> remainingUserSets = new ArrayList<>(miningSets);
List<DataPoint> sortedUserSets = new ArrayList<>();
List<DataPoint> remainingUserSets = new ArrayList<>(dataPoints);

remainingUserSets.sort(Comparator.comparingInt(set -> -set.asObjectable().getRoles().size()));
remainingUserSets.sort(Comparator.comparingInt(set -> -set.getRoles().size()));

while (!remainingUserSets.isEmpty()) {
PrismObject<MiningType> currentUserSet = remainingUserSets.remove(0);
DataPoint currentUserSet = remainingUserSets.remove(0);
double maxSimilarity = 0;
int insertIndex = -1;

Expand All @@ -61,26 +74,26 @@ public static List<PrismObject<MiningType>> jaccSortMiningSet(List<PrismObject<M
}
} else {
for (int i = 1; i < sortedUserSets.size(); i++) {
PrismObject<MiningType> prevUserSet = sortedUserSets.get(i - 1);
PrismObject<MiningType> nextUserSet = sortedUserSets.get(i);
double similarity = RoleUtils.jacquardSimilarity(currentUserSet.asObjectable().getRoles(),
prevUserSet.asObjectable().getRoles());
double nextSimilarity = RoleUtils.jacquardSimilarity(currentUserSet.asObjectable().getRoles(),
nextUserSet.asObjectable().getRoles());
DataPoint prevUserSet = sortedUserSets.get(i - 1);
DataPoint nextUserSet = sortedUserSets.get(i);
double similarity = RoleUtils.jacquardSimilarity(currentUserSet.getRoles(),
prevUserSet.getRoles());
double nextSimilarity = RoleUtils.jacquardSimilarity(currentUserSet.getRoles(),
nextUserSet.getRoles());

if (Math.max(similarity, nextSimilarity) > maxSimilarity
&& Math.min(similarity, nextSimilarity) >= RoleUtils.jacquardSimilarity(
prevUserSet.asObjectable().getRoles(), nextUserSet.asObjectable().getRoles())) {
prevUserSet.getRoles(), nextUserSet.getRoles())) {
maxSimilarity = Math.max(similarity, nextSimilarity);
insertIndex = i;
}
}

if (insertIndex == -1) {
if (RoleUtils.jacquardSimilarity(currentUserSet.asObjectable().getRoles(),
sortedUserSets.get(0).asObjectable().getRoles())
> RoleUtils.jacquardSimilarity(sortedUserSets.get(0).asObjectable().getRoles(),
sortedUserSets.get(1).asObjectable().getRoles())) {
if (RoleUtils.jacquardSimilarity(currentUserSet.getRoles(),
sortedUserSets.get(0).getRoles())
> RoleUtils.jacquardSimilarity(sortedUserSets.get(0).getRoles(),
sortedUserSets.get(1).getRoles())) {
sortedUserSets.add(0, currentUserSet);
} else {
sortedUserSets.add(currentUserSet);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
import javax.xml.namespace.QName;

import com.evolveum.midpoint.gui.impl.page.admin.role.mining.page.MainPageMining;
import com.evolveum.midpoint.gui.impl.page.admin.role.PageRoleMining;
import com.evolveum.midpoint.gui.impl.page.admin.role.PageRoleMiningRBAM;
import com.evolveum.midpoint.gui.impl.page.admin.role.PageRoleMiningSimple;
import com.evolveum.midpoint.model.api.authentication.GuiProfiledPrincipal;
Expand Down Expand Up @@ -56,7 +55,6 @@
import com.evolveum.midpoint.model.api.authentication.CompiledDashboardType;
import com.evolveum.midpoint.model.api.authentication.CompiledGuiProfile;
import com.evolveum.midpoint.model.api.authentication.CompiledObjectCollectionView;
import com.evolveum.midpoint.model.api.authentication.GuiProfiledPrincipal;
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.prism.query.builder.S_FilterEntryOrEmpty;
import com.evolveum.midpoint.schema.result.OperationResult;
Expand All @@ -81,7 +79,6 @@
import com.evolveum.midpoint.web.page.admin.reports.PageCreatedReports;
import com.evolveum.midpoint.web.page.admin.resources.PageConnectorHosts;
import com.evolveum.midpoint.web.page.admin.resources.PageImportResource;
import com.evolveum.midpoint.web.page.admin.resources.PageResourceTemplates;
import com.evolveum.midpoint.web.page.admin.server.PageNodes;
import com.evolveum.midpoint.web.page.admin.server.PageTasksCertScheduling;
import com.evolveum.midpoint.web.page.admin.workflow.PageAttorneySelection;
Expand Down Expand Up @@ -403,7 +400,6 @@ private MainMenuItem createRolesMenu() {
createBasicAssignmentHolderMenuItems(roleMenu, PageTypes.ROLE);
roleMenu.addMenuItem(new MenuItem("PageAdmin.menu.top.roles.mining", PageRoleMiningSimple.class));
roleMenu.addMenuItem(new MenuItem("RBAM", PageRoleMiningRBAM.class));
roleMenu.addMenuItem(new MenuItem("CL", PageRoleMining.class));
roleMenu.addMenuItem(new MenuItem("Mining", MainPageMining.class));

return roleMenu;
Expand Down

This file was deleted.

0 comments on commit f6cb98b

Please sign in to comment.