Problema di progettazione di dati / oggetto

4

Obiettivo:

Sto cercando di capire il modo migliore per modellare / progettare e quindi implementare una funzione "utente" in un sistema.

Sfondo:

Sto progettando un sistema di richiesta di accesso on-line, quindi la nostra azienda può utilizzare un metodo basato sul Web per gli utenti che richiedono l'accesso a vari sistemi software. Dato che il sistema è interamente relativo all '"utente", l'utente è il punto focale del sistema.

Quindi, un utente può richiedere l'accesso a un sistema. Quindi, il Gestore dell'utente approverà / respingerà la richiesta. Successivamente, il proprietario del sistema approverà / respingerà la richiesta. Quindi è l'amministratore di sistema che approva / rifiuta e infine l'amministratore di sicurezza approva / rifiuta e li aggiunge al gruppo di Active Directory appropriato in modo che possano accedere all'applicazione basata su Active Directory di destinazione (non questa applicazione).

Problema:

Vedo tutte le entità che rappresentano un utente come una (e) classe (i) principale (i) nel sistema. L'oggetto User è semplice: basta passare il proprio accesso di Windows a Active Directory (AD) tramite una query LDAP e ottenere le informazioni e caricarle in un oggetto. In una query LDAP, se ci sono altri utenti che segnalano loro (il gestore di un utente è memorizzato nel nostro annuncio), questo "utente" non è solo un utente in questo sistema ma anche un manager. Se anche questo utente si trova nel database come proprietario del sistema, è anche un proprietario del sistema.

Finora:

(Si supponga che un Manager sia qualcuno con almeno un rapporto diretto ad esso assegnato in AD.)

Ho considerato un singolo oggetto utente, con proprietà come IsManager o IsSystemOwner. Tuttavia, dovrei costruire una gerarchia di oggetti dove (ad esempio) una classe Manager eredita dall'utente? Ci sono stranezze con questo, perché un proprietario del sistema potrebbe ereditare da utente o gestore. Non tutti i proprietari di sistemi sono gestori. Tuttavia, Manager, System Owners, System Admins e Security Admins sono tutti Utenti, poiché possono richiedere l'accesso ad alcuni sistemi software in cui il ruolo in questo sistema è solo come Utente. Ecco una panoramica di "è un" per tutte le entità utente:

  • Un utente può richiedere l'accesso ad altri sistemi software in questo sistema.
  • Un manager è un utente.
  • Un proprietario del sistema è un utente.
  • Un amministratore di sistema è un utente.
  • Un amministratore della sicurezza è un utente (ma improbabile, a causa della nostra organizzazione).
  • Un manager può essere un proprietario del sistema, ma non sempre.
  • Un proprietario del sistema può essere un gestore, ma non sempre.
  • Un amministratore di sistema può essere un gestore, ma non sempre.
  • Un amministratore di sistema potrebbe essere un proprietario del sistema, ma non probabile.
  • Un amministratore della sicurezza può essere un gestore, ma non sempre.
  • Un amministratore della sicurezza potrebbe essere un proprietario del sistema, ma non probabile.

Alcune informazioni aggiuntive:

  • Non prevedo che gli amministratori di sicurezza utilizzino il sistema come utente per richiedere l'accesso, ma è sempre possibile.
  • Un manager può creare una richiesta di accesso per conto di uno dei suoi dipendenti (per revocare l'accesso a un dipendente licenziato, ad esempio)
  • Tutti i dipendenti nel dominio Windows avranno accesso a questo sito. Presumo che avrò alcuni gruppi di Active Directory creati per amministratori di sistema e amministratori della sicurezza, poiché gli utenti di questi gruppi non saranno dinamici, piuttosto gli utenti di un team sono amministratori del sistema e gli utenti di un altro team sono amministratori della sicurezza.
  • Il proprietario del sistema è soggetto a modifiche e verrà memorizzato nel database, insieme alla possibilità di designare un approvatore alternativo in vacanza, ecc.
  • Potrei aver bisogno di un Manager per avere un approvatore alternativo, ma non avevo intenzione di archiviare tutti gli utenti nel dominio nel database!

Sembra che sia così facile modellare sulla carta, ma farcela in un codice buono e flessibile mi sta bloccando. Tutti i suggerimenti sono ben accetti.

EDIT: sulla base del feedback di Karl, ho questo modello prototipo. Sembra solido da una prospettiva OOP, in base alla mia destinazione d'uso?

Public Class MyCustomUserObject

    Public Property LoginID As String
    Public Property FirstName As String
    Public Property LastName As String
    Public Property EmailAddress As String

    Public Property Roles As List(Of Role)

    Public Function IsManager() As Boolean
        ' If List(Of Role) contains an object of type ManagerRole, then True, else False.
    End Function

    Public Function IsSystemOwner(systemName As String) As Boolean
        ' If List(Of Role) contains an object of type SystemOwnerRole with matching name
        ' in SystemOwnerRole.SoftwareSystems, then True, else False.
    End Function

    Public Function IsSystemAdministrator(systemName As String) As Boolean
        ' If List(Of Role) contains an object of type SystemAdministratorRole with matching name
        ' in SystemAdministratorRole.SoftwareSystems, then True, else False.
    End Function

    Public Function IsSecurityAdministrator() As Boolean
        Return My.User.IsInRole("My Active Directory group name for Security Admins")
    End Function

End Class

Public Class SoftwareSystem

    Public Property ID As String
    Public Property Name As String

End Class

Public MustInherit Class Role

    Public Property DesignatedApproverLoginID As String

End Class

Public Class ManagerRole
    Inherits Role

    Public Property Subordinates As List(Of AafUser)
    ' Or this, with a List of login IDs?
    ' Public Property Subordinates As List(Of String)

End Class

Public Class SystemOwnerRole
    Inherits Role

    Public Property SoftwareSystems As List(Of SoftwareSystem)

End Class

Public Class SystemAdministratorRole
    Inherits Role

    Public Property SoftwareSystems As List(Of SoftwareSystem)

End Class

Public Class SecurityAdministratorRole
    Inherits Role

    ' Explictly a Security Admin for all Software Systems.

End Class
    
posta HardCode 11.05.2012 - 20:19
fonte

3 risposte

3

Il mio suggerimento è piuttosto che creare classi User diverse per ruoli diversi, avere una sola classe User che contenga un elenco di oggetti Role . Role sarebbe una classe base, con Manager , SystemOwner , SecurityAdmin e SystemAdmin come classi derivate, con campi specifici per le loro esigenze. Manager avrebbe una lista di subordinati, SystemOwner avrebbe le descrizioni del sistema, ecc. Role potrebbe avere campi comuni, come ad esempio un approvatore alternativo,

Quell'architettura apre molte possibilità. Ad esempio, qualcuno può facilmente essere il proprietario di più sistemi. Ciò rende anche le query come "elenca tutti i proprietari di sistema" più facilmente.

    
risposta data 11.05.2012 - 21:03
fonte
1

Penso che il bit che ti manca è che il ruolo non è un attributo dell'utente. Il ruolo è un attributo della relazione tra due entità (due utenti o un utente e un sistema).

Ad esempio:

  • Bob potrebbe essere il proprietario del sistema del database Oracle ma non ha i privilegi di proprietà con il database SQL.
  • Paul potrebbe essere il manager di Bob ma non il manager di Jason.

Nel mondo UML, questo genere di cose è chiamato classe di associazione . Nel mondo del database, è chiamato attributo descrittivo .

Avrai bisogno di

  1. Una tabella di utenti, inclusi ID utente, nome e ID LAN
  2. Una tabella di sistemi
  3. Una tabella di relazioni utente-utente. Ogni riga deve contenere un FromUserID, ToUserID e un RoleID (ad esempio, manager). Potresti anche desiderare una data di inizio e di fine, poiché i ruoli potrebbero cambiare.
  4. Una tabella di relazioni sistema-utente. Ogni riga deve contenere UserID, SystemID e un SystemRoleID (ad es. Proprietario). Anche in questo caso, potresti anche desiderare una data di inizio e di fine.

Puoi sempre avere un metodo IsManagerOf o IsOwnerOf , ovviamente, per questioni di convenienza. Ma i termini del tuo modello di dati, non appartengono affatto all'utente, appartengono alla relazione che è collegata all'utente.

    
risposta data 24.05.2017 - 01:03
fonte
0

Il tuo modello di dominio è ottimizzato per i tuoi casi d'uso. Per "Acess Management", non è necessario modellare o archiviare chi si trova nella propria squadra nel proprio database - tali informazioni sarebbero più aggiornate nei sistemi LDAP.

Credo che tu stia complicando la memorizzazione dei ruoli. I seguenti diagrammi possono fornire un modello semplicistico che potrebbe coprire i tuoi casi d'uso.

L'oggetto utente ha solo bisogno di un ID unico per tutta l'azienda, nient'altro. La maggior parte dei dati di gerarchia potrebbe già essere presente in ldap aziendale.

Lamaggiorpartedellalogicaaziendalepesantepuòessereutilizzatanellivellodiservizio:conLDAPeiltuodatabaselocalecomeoriginidati.

L'oggettorichiestapuòattraversarevaristati,persistere/interrogatiperulteriorielaborazionieanalisideidati,ecc.

    
risposta data 14.10.2018 - 08:14
fonte

Leggi altre domande sui tag