ASP.Net MVC Core 设计多租户的SaaS框架

设计一个多租户的SaaS框架需要考虑多个方面,包括租户识别、数据隔离、权限控制等。以下是一个基于ASP.NET Core 8的多租户SaaS框架的设计方案。

1. 租户识别与数据隔离

1.1 租户模型

首先,定义一个租户模型。

public class Tenant
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Identifier { get; set; } // 租户标识符,例如域名或子域名
}
1.2 租户服务

创建一个租户

public interface ITenantService
{
    Tenant GetTenant();
}

public class TenantService : ITenantService
{
    private readonly HttpContext _httpContext;
    private readonly Tenant _currentTenant;

    public TenantService(IHttpContextAccessor httpContextAccessor)
    {
        _httpContext = httpContextAccessor.HttpContext;
        _currentTenant = ResolveTenant();
    }

    private Tenant ResolveTenant()
    {
        // 从HttpContext中解析租户信息,例如从域名或子域名中获取
        var host = _httpContext.Request.Host.Host;
        // 根据host查找租户信息
        // 这里假设有一个TenantRepository来获取租户信息
        var tenant = TenantRepository.GetTenantByIdentifier(host);
        return tenant;
    }

    public Tenant GetTenant()
    {
        return _currentTenant;
    }
}
1.3 租户中间件

创建一个中间件来设置当前租户。

public class TenantMiddleware
{
    private readonly RequestDelegate _next;

    public TenantMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task InvokeAsync(HttpContext context, ITenantService tenantService)
    {
        var tenant = tenantService.GetTenant();
        if (tenant != null)
        {
            context.Items["Tenant"] = tenant;
        }
        await _next(context);
    }
}

在 Program.cs 中注册中间件。

app.UseMiddleware<TenantMiddleware>();

2. 数据隔离

2.1 数据库上下文

在数据库上下文中添加租户过滤器。

public class ApplicationDbContext : DbContext
{
    private readonly Tenant _currentTenant;

    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options, ITenantService tenantService)
        : base(options)
    {
        _currentTenant = tenantService.GetTenant();
    }

    public DbSet<User> Users { get; set; }
    public DbSet<Company> Companies { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        // 添加租户过滤器
        modelBuilder.Entity<User>().HasQueryFilter(u => u.TenantId == _currentTenant.Id);
        modelBuilder.Entity<Company>().HasQueryFilter(c => c.TenantId == _currentTenant.Id);
    }
}
2.2 用户模型

在用户模型中添加租户ID。

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int TenantId { get; set; }
    public int CompanyId { get; set; }
    public int? ManagerId { get; set; }
    public UserRole Role { get; set; }
}

public enum UserRole
{
    Employee,
    Manager,
    Admin
}

3. 权限控制

3.1 权限服务

创建一个权限服务来管理用户权限。

public interface IPermissionService
{
    bool CanAccess(User user, User targetUser);
}

public class PermissionService : IPermissionService
{
    public bool CanAccess(User user, User targetUser)
    {
        if (user.Role == UserRole.Admin)
        {
            return true;
        }
        else if (user.Role == UserRole.Manager && user.CompanyId == targetUser.CompanyId)
        {
            return true;
        }
        else if (user.Id == targetUser.Id)
        {
            return true;
        }
        return false;
    }
}
3.2 控制器中的权限检查

在控制器中使用权限服务进行权限检查。

public class UserController : Controller
{
    private readonly ApplicationDbContext _context;
    private readonly IPermissionService _permissionService;

    public UserController(ApplicationDbContext context, IPermissionService permissionService)
    {
        _context = context;
        _permissionService = permissionService;
    }

    public IActionResult Details(int id)
    {
        var user = _context.Users.Find(id);
        if (user == null)
        {
            return NotFound();
        }

        var currentUser = GetCurrentUser();
        if (!_permissionService.CanAccess(currentUser, user))
        {
            return Forbid();
        }

        return View(user);
    }

    private User GetCurrentUser()
    {
        // 从HttpContext中获取当前用户
        var userId = int.Parse(User.FindFirst(ClaimTypes.NameIdentifier).Value);
        return _context.Users.Find(userId);
    }
}

4. 注册服务

在 Program.cs 中注册所有服务。

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddControllersWithViews();
builder.Services.AddDbContext<ApplicationDbContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));
builder.Services.AddScoped<ITenantService, TenantService>();
builder.Services.AddScoped<IPermissionService, PermissionService>();
builder.Services.AddHttpContextAccessor();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Home/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthentication();
app.UseAuthorization();

app.UseMiddleware<TenantMiddleware>();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

本项目是一个基于SSM(Spring+SpringMVC+MyBatis)后端框架与Vue.js前端框架开发的疫情居家办公系统。该系统旨在为居家办公的员工提供一个高效、便捷的工作环境,同时帮助企业更好地管理远程工作流程。项目包含了完整的数据库设计、前后端代码实现以及详细的文档说明,非常适合计算机相关专业的毕设学生和需要进行项目实战练习的Java学习者。 系统的核心功能包括用户管理、任务分配、进度跟踪、文件共享和在线沟通等。用户管理模块允许管理员创建和管理用户账户,分配不同的权限。任务分配模块使项目经理能够轻松地分配任务给团队成员,并设置截止日期。进度跟踪模块允许员工实时更新他们的工作状态,确保项目按计划进行。文件共享模块提供了一个安全的平台,让团队成员可以共享和协作处理文档。在线沟通模块则支持即时消息和视频会议,以增强团队之间的沟通效率。 技术栈方面,后端采用了Spring框架来管理业务逻辑,SpringMVC用于构建Web应用程序,MyBatis作为ORM框架简化数据库操作。前端则使用Vue.js来实现动态用户界面,搭配Vue Router进行页面导航,以及Vuex进行状态管理。数据库选用MySQL,确保数据的安全性和可靠性。 该项目不仅提供了一个完整的技术实现示例,还为开发者留下了扩展和改进的空间,可以根据实际需求添加新功能或优化现有功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值