add permission view

This commit is contained in:
2026-05-05 14:49:34 +02:00
parent f09f148aea
commit e5ee067db4
8 changed files with 154 additions and 33 deletions

View File

@@ -24,6 +24,7 @@ GO
-- DROP VIEW IF EXISTS dbo.vAuthentications;
-- DROP VIEW IF EXISTS dbo.vEventLog;
-- DROP VIEW IF EXISTS dbo.vNotifyTray;
-- DROP VIEW IF EXISTS dbo.vPermissionOverview;s
-- DROP TABLE IF EXISTS dbo.AuthenticationRoles;
-- DROP TABLE IF EXISTS dbo.AuthenticationGroups;
@@ -550,6 +551,55 @@ JOIN dbo.Permission p
GO
CREATE OR ALTER VIEW dbo.vPermissionOverview AS
SELECT
p.ID AS Permission_ID,
p.Scope,
p.Resource,
p.Action,
p.Scope + '.' + p.Resource + '.' + p.Action AS PermissionKey,
r.ID AS Role_ID,
-- 🔥 NEU: Anzahl Rollen pro Permission
COUNT(r.ID) OVER (PARTITION BY p.ID) AS RoleCount,
COUNT(gr.Group_ObjectGUID) AS GroupCount,
COUNT(ar.Authentication_ObjectGUID) AS DirectUserCount,
COUNT(ag.Authentication_ObjectGUID) AS GroupUserCount,
COUNT(
COALESCE(ar.Authentication_ObjectGUID, ag.Authentication_ObjectGUID)
) AS TotalUserCount
FROM dbo.Permission AS p
INNER JOIN dbo.RolePermissions AS rp
ON rp.Permission_ID = p.ID
INNER JOIN dbo.Role AS r
ON r.ID = rp.Role_ID
LEFT JOIN dbo.GroupRoles AS gr
ON gr.Role_ID = r.ID
LEFT JOIN dbo.AuthenticationRoles AS ar
ON ar.Role_ID = r.ID
LEFT JOIN dbo.AuthenticationGroups AS ag
ON ag.Group_ObjectGUID = gr.Group_ObjectGUID
GROUP BY
p.ID,
p.Scope,
p.Resource,
p.Action,
r.ID,
r.Name;
GO
-- ========================================================
-- 5. PERMISSION MATRIX (FAST LOOKUP)
-- ========================================================

View File

@@ -235,10 +235,13 @@ const rbacPermissionsVT = virtualTable({
deletePermission(row['ID'], `${row['Scope']}.${row['Resource']}.${row['Action']}`);
}
});
createTd(tr, row['ID'], { classes: [ 'text-align:left' ], styles: { 'max-width': '100px' } } );
createTd(tr, row['Scope'], { classes: [ 'text-align:left' ] });
createTd(tr, row['Resource'], { classes: [ 'text-align:center' ] });
createTd(tr, row['Action'], { classes: [ 'text-align:center' ] });
createTd(tr, row['Permission_ID'], { classes: [ 'text-align:left' ], styles: { 'width': '100px' } } );
createTd(tr, row['GroupUserCount'], { classes: [ 'text-align:center' ] });
createTd(tr, row['TotalUserCount'], { classes: [ 'text-align:center' ] });
createTd(tr, row['RoleCount'], { classes: [ 'text-align:center' ], styles: { 'width': '100px' } });
createTd(tr, row['Scope'], { classes: [ 'text-align:right' ], styles: { 'width': '100px' } });
createTd(tr, row['Resource'], { classes: [ 'text-align:center' ], styles: { 'width': '100px' } });
createTd(tr, row['Action'], { classes: [ 'text-align:left' ], styles: { 'width': '100px' } });
}
});

View File

@@ -67,7 +67,7 @@ input {
<div class="card" style="flex:1 1 auto;min-width:300px">
Users <input id="newUserName" placeholder="sAMAccountName" /> <button class="bluebutton" onclick="createUser()">Create User</button>
<div class="table-wrapper fit-table">
<table id="rbacUsersTable" style="height:100%">
<table id="rbacUsersTable" style="">
<thead>
<tr>
<th class="text-align:left"></th>
@@ -88,6 +88,33 @@ input {
</div>
</div>
<!-- PERMISSIONS -->
<div class="card" style="min-width:300px;flex:1 1 auto">
<input id="permScope" placeholder="Scope" />.<input id="permResource" placeholder="Resource" />.<input id="permAction" placeholder="Action" />
<button class="bluebutton" onclick="createPermission()">Create Permission</button>
<div class="table-wrapper fit-table">
<table id="rbacPermissionsTable" style="">
<thead>
<tr>
<th class="text-align:left"></th>
<th class="text-align:left">ID</th>
<th class="text-align:center">Gruppen</th>
<th class="text-align:center">Benutzer</th>
<th class="text-align:center">Rollen</th>
<th class="text-align:right">Scope</th>
<th class="text-align:center">Resource</th>
<th class="text-align:left">Action</th>
</tr>
</thead>
<tbody>
<tr><td colspan="100%">BERECHTIGUNGEN WERDEN GELADEN . . .</td></tr>
</tbody>
</table>
</div>
</div>
<!-- GROUPS -->
<div class="card" style="min-width:300px;flex:1 1 calc(300px)">
<input id="newGroupName" placeholder="Gruppenname" /> <button class="bluebutton" onclick="createGroup()">Create Group</button>
@@ -106,30 +133,6 @@ input {
<span>ROLLEN WERDEN GELADEN . . .</span>
</div>
</div>
<!-- PERMISSIONS -->
<div class="card" style="min-width:300px;flex:1 1 auto">
<input id="permScope" placeholder="Scope" />.<input id="permResource" placeholder="Resource" />.<input id="permAction" placeholder="Action" />
<button class="bluebutton" onclick="createPermission()">Create Permission</button>
<div class="table-wrapper fit-table">
<table id="rbacPermissionsTable" style="height:100%">
<thead>
<tr>
<th class="text-align:left"></th>
<th class="text-align:left">ID</th>
<th class="text-align:left">Scope</th>
<th class="text-align:center">Resource</th>
<th class="text-align:center">Action</th>
</tr>
</thead>
<tbody>
<tr><td colspan="100%">BERECHTIGUNGEN WERDEN GELADEN . . .</td></tr>
</tbody>
</table>
</div>
</div>
</div>
</body>

View File

@@ -117,8 +117,8 @@ const server = https.createServer(httpsOptions, app);
databaseModel.set('authenticationOverviewView', require(`@models/authenticationOverviewView`)(service.get('sqlManager').getInstance('main')));
databaseModel.set('groupOverviewView', require(`@models/groupOverviewView`)(service.get('sqlManager').getInstance('main')));
databaseModel.set('roleOverviewView', require(`@models/roleOverviewView`)(service.get('sqlManager').getInstance('main')));
databaseModel.set('PermissionTraceView', require(`@models/PermissionTraceView`)(service.get('sqlManager').getInstance('main')));
databaseModel.set('permissionTraceView', require(`@models/permissionTraceView`)(service.get('sqlManager').getInstance('main')));
databaseModel.set('permissionOverviewView', require(`@models/permissionOverviewView`)(service.get('sqlManager').getInstance('main')));
service.set('rbacManager', new RBACManager(databaseModel, runtimeFile.configuration.live.integration.token.secret));

View File

@@ -0,0 +1,65 @@
const { DataTypes } = require('sequelize');
module.exports = (sequelize) => {
const VPermissionOverviewView = sequelize.define(
'vPermissionOverviewView',
{
Permission_ID: {
type: DataTypes.INTEGER,
primaryKey: true
},
Scope: {
type: DataTypes.STRING
},
Resource: {
type: DataTypes.STRING
},
Action: {
type: DataTypes.STRING
},
PermissionKey: {
type: DataTypes.STRING
},
Role_ID: {
type: DataTypes.INTEGER,
primaryKey: true
},
RoleCount: {
type: DataTypes.INTEGER
},
GroupCount: {
type: DataTypes.INTEGER
},
DirectUserCount: {
type: DataTypes.INTEGER
},
GroupUserCount: {
type: DataTypes.INTEGER
},
TotalUserCount: {
type: DataTypes.INTEGER
}
},
{
tableName: 'vPermissionOverview', // ⚠️ exakt dein SQL View Name
timestamps: false,
freezeTableName: true,
// 🔒 Wichtig für Views
createdAt: false,
updatedAt: false
}
);
// 🚫 keine Mutationen erlauben (View!)
VPermissionOverviewView.removeAttribute('id');
return VPermissionOverviewView;
};

View File

@@ -351,6 +351,7 @@ module.exports = {
app.post('/api/rbac/permission/get', async (req, res) => {
try {
rbacPermissions = await service.get('rbacManager').getPermission();
console.log(rbacPermissions)
res.json(rbacPermissions);
} catch (err) {
res.status(500).json({ error: err.message });

View File

@@ -425,8 +425,7 @@ async removeRoleFromUser(authId, roleId) {
// 🔐 PERMISSION CRUD
// =========================================================
async getPermission() {
const permission = this.db.get('permissionModel');
console.log(permission)
const permission = this.db.get('permissionOverviewView');
return await permission.findAll({ raw: true }) || [];
}