You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
iot/projects/ManagementCenter/Startup.cs

129 lines
6.2 KiB

using Application.Domain.Entities;
using Infrastructure.Data;
using Infrastructure.Email;
using Infrastructure.Extensions;
using Infrastructure.Sms;
using Infrastructure.Web;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Hosting;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace ManagementCenter
{
public class Startup : BaseStartup
{
public Startup(IConfiguration configuration, IWebHostEnvironment env) : base(configuration, env)
{
}
public override void ConfigureServices(IServiceCollection services)
{
services.AddTransient<IEmailSender, EmptyEmailSender>();
services.AddTransient<ISmsSender, EmptySmsSender>();
services.AddSignalR(o => o.EnableDetailedErrors = true);
services.AddTransient<IRoleService, RoleService>();
base.ConfigureServices(services);
}
public override Task ValidatePrincipal(CookieValidatePrincipalContext arg)
{
return Task.Run(() =>
{
var userRepo = arg.HttpContext.RequestServices.GetService<IRepository<User>>();
var userName = arg.Principal.Identity.Name;
var userPermissions = userRepo.ReadOnlyTable().Where(o => o.UserName == userName)
.SelectMany(o => o.UserRoles)
.Select(o => o.Role)
.SelectMany(o => o.RolePermissions)
.Select(o => o.Permission.Number)
.ToList();
var currentPermissions = arg.Principal.Claims.Where(o => o.Type == "Role").Select(o => o.Value).ToList();
if (!currentPermissions.SequenceEqual(userPermissions))
{
arg.HttpContext.SignOutAsync();
arg.HttpContext.SignIn(userName, userPermissions, arg.Properties.IsPersistent);
}
});
}
public override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<PermissionCategory>().HasOne(o => o.Parent).WithMany(o => o.Children).HasForeignKey(o => o.ParentId);
modelBuilder.Entity<Permission>().HasOne(o => o.Category).WithMany(o => o.Permissions).HasForeignKey(o => o.CategoryId);
modelBuilder.Entity<UserRole>().HasOne(o => o.User).WithMany(o => o.UserRoles).HasForeignKey(o => o.UserId);
modelBuilder.Entity<UserRole>().HasOne(o => o.Role).WithMany(o => o.UserRoles).HasForeignKey(o => o.RoleId);
modelBuilder.Entity<RolePermission>().HasOne(o => o.Role).WithMany(o => o.RolePermissions).HasForeignKey(o => o.RoleId);
modelBuilder.Entity<RolePermission>().HasOne(o => o.Permission).WithMany(o => o.RolePermissions).HasForeignKey(o => o.PermissionId);
modelBuilder.Entity<User>().HasIndex(o => o.UserName).IsUnique();
modelBuilder.Entity<Role>().HasIndex(o => o.Name).IsUnique();
modelBuilder.Entity<PermissionCategory>().HasIndex(o => o.Number).IsUnique();
modelBuilder.Entity<Permission>().HasIndex(o => o.Number).IsUnique();
modelBuilder.Entity<UserRole>().HasIndex(o => new { o.UserId, o.RoleId }).IsUnique();
modelBuilder.Entity<RolePermission>().HasIndex(o => new { o.RoleId, o.PermissionId }).IsUnique();
}
public override void Seed(DbContext dbContext, IServiceProvider serviceProvider, IConfiguration configuration)
{
dbContext.Set<PermissionCategory>().Add(new PermissionCategory
{
Name = "<22><><EFBFBD><EFBFBD>",
Number = "EFConfigurationValue",
Permissions = new List<Permission> {
new Permission { Name = "<22><EFBFBD><E9BFB4><EFBFBD><EFBFBD>", Number = "Read-EFConfigurationValue" },
new Permission { Name = "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", Number = "Add-EFConfigurationValue" },
new Permission { Name = "<22>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD>", Number = "Edit-EFConfigurationValue" },
new Permission { Name = <><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", Number = "Delete-EFConfigurationValue" }
}
});
foreach (var item in dbContext.Model.GetEntityTypes())
{
var type = item.ClrType;
var name = type.GetDisplayName();
var number = type.Name;
var category = new PermissionCategory
{
Name = name,
Number = type.Name
};
category.Permissions.Add(new Permission { Name = $"<22>鿴{name}", Number = $"Read-{number}" });
category.Permissions.Add(new Permission { Name = $"<22><><EFBFBD><EFBFBD>{name}", Number = $"Add-{number}" });
category.Permissions.Add(new Permission { Name = $"<22>޸<EFBFBD>{name}", Number = $"Edit-{number}" });
category.Permissions.Add(new Permission { Name = $"ɾ<><C9BE>{name}", Number = $"Delete-{number}" });
dbContext.Set<PermissionCategory>().Add(category);
}
dbContext.SaveChanges();
var saRole = new Role { Name = "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա", IsReadOnly = true };
var adminRole = new Role { Name = "<22><><EFBFBD><EFBFBD>Ա", IsReadOnly = true };
foreach (var item in dbContext.Set<Permission>())
{
saRole.RolePermissions.Add(new RolePermission { Permission = item, IsReadOnly = true });
if (!item.Name.Contains(<><C9BE>"))
{
adminRole.RolePermissions.Add(new RolePermission { Permission = item, IsReadOnly = true });
}
}
dbContext.Set<User>().Add(new User
{
UserName = "super",
UserRoles = new List<UserRole> { new UserRole { Role = saRole } }
});
var user1Id = dbContext.Set<User>().Add(new User
{
UserName = "admin",
UserRoles = new List<UserRole> { new UserRole { Role = adminRole } }
}).Entity.Id;
dbContext.SaveChanges();
}
}
}