Sto cercando di creare un sistema di autorizzazione nella mia applicazione C #.
La mia idea è questa:
Class: Permission
- string name;
- string value;
Class: Role
- string name
- List<Permission> Permissions;
Class: User
- List<Role> Roles;
- List<Permission> AdditionalPermissions;
Molto bello e flessibile. Posso creare ruoli con permessi, e persino personalizzare assegnare permessi ad alcuni utenti, in casi particolari.
Il framework Entity aveva altri piani, nel database, la tabella dei permessi ha un UserID e un riferimento RoleID, non esattamente quello che mi aspettavo.
Table: Permissions
- int id;
- nvarchar name;
- nvarchar value;
- int UserID
- int RoleID
Table: Roles
- int id;
- nvarchar name;
Table: Users;
- int id
Posso rendere il framework di entità creare una struttura come di seguito, senza dover creare personalmente le classi C #?
Table: Permissions
- int id;
- nvarchar name;
- nvarchar value;
Table: Roles
- int id;
- nvarchar name;
Table: Users;
- int id
Table: Users_Permissions
- int UserID;
- int PermissionID;
Table: Role_Permissions
- int RoleID
- int PermissionID;
Quando strutturi le tue classi di entità in questo modo, la struttura di db risulta come tu vuoi:
public class Permission
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
public string Value { get; set; }
}
public class RolePermission
{
[ForeignKey(nameof(Role))]
public int RoleId { get; set; }
public virtual Role Role { get; set; }
[ForeignKey(nameof(Permission))]
public int PermissionId { get; set; }
public virtual Permission Permission { get; set; }
}
public class Role
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<RolePermission> RolePermissions { get; set; }
}
Per garantire che la tabella RolePermission
ottenga una chiave primaria composta delle due chiavi esterne, aggiungerla al contesto:
protected override void OnModelCreating(ModelBuilder builder)
{
builder.Entity<RolePermission>().HasKey(table => new {
table.RoleId,
table.PermissionId
});
}