脚手架白小僧的furion,orm sqlsugar

与其说magic.net的多租户应用不如说是sqlsugar 对多租户 多数据库对象的自由切换贡献了很大的力量

当然 多租户架构,数据库表的设计,租户管理,权限相关的思想,应该出自admin.net ,但是admin.net 是ef版本的.

总体来看 magic跟admin.net 数据库一样的,orm是不同的,把ef 翻译到sqlsugar版本

经过几天的入手,强烈的建议使用sqlsugar ,对框架的支持,写法都很方便.

关于权限 

设置完角色后, 分配角色目录授权, 然后给用户授权角色,那此用户便有了此角色分配的目录的权限

关于租户

租户相当于系统管理员角色,可以为租户用户授权菜单,登录时则显示授权的菜单,这样有效的显示该显示部分.

关于多租户saas.

可以采用业务部分数据库独立,比如一个租户独自有自己的业务数据库. 在路由请求业务时根据租户id 切换到数据库对象即可,这个sqlsugar均提供了功能

开启软件,加载数据库列表,此列表是从主数据库的租赁用户表配置中获得,以租户id为configid,在切换时 ,可以通过changedb命令.数据库操作,或者获取数据对象通过id 就不用来回切换了,获取了id用完了自动回到了主数据库对象,在后台就转换了

关于实体类生成

sqlsugar还提供了WebFirst.exe 很方便的把数据库的表生成实体类.

maigic后台也能生成代码,可以自动的生成路由到路由表内.很方便. 前提是先在项目用加入要生成代码的实体类.

关于开发流程

我是数据库表先设计好了,再生成实体 ,实体内要继承base那个类,实体内要去掉base公用的部分

然后就是input 请求时的实体类, long ? int? 的要对应好,免得提交时不加参数再转换时 int成了0 数据库会修改了数据,实体类中要加上这个问号,这样再实体类转换的时候,才不会没传参值是null.

 关于token 验证部分

结合了微软的权限部分,token在背后就给验证了,验证完之后的权限是通过路由请求获得.验证完token之后会对请求的上下文的获取后做权限判断,

如果此用户的权限表内没有当前的请求路由则返回错误. 此处是区分大小写的.路由大小写对应路由表的大小写要统一,或者在获取路由的时候给大小写转换.不改的话也挺好,自己开发人员知道这个规格,也能因拼写问题阻拦一部分未知请求者 ,

        /// 检查权限
        /// </summary>
        /// <param name="httpContext"></param>
        /// <returns></returns>
        private static async Task<bool> CheckAuthorzieAsync(DefaultHttpContext httpContext)
        {
            // 管理员跳过判断
            if (UserManager.IsSuperAdmin) return true;

            // 路由名称
            var routeName = httpContext.Request.Path.Value.Substring(1).Replace("/", ":");

            //var allPermission = await App.GetService<ISysMenuService>().GetAllPermission();
            //此处感觉是非路由表数据放行.暂时注释掉.
            /*if (!allPermission.Contains(routeName))
            {
                return true;
            }*/


            //// 默认路由(获取登录用户信息)
            //var defalutRoute = new List<string>()
            //{
            //    "getLoginUser",
            //    "sysNotice:unread",
            //    "codeGenerate:InformationList",
            //    "sysFileInfo:uploadAvatar",
            //    "sysFileInfo:preview"
            //};

            //if (defalutRoute.Contains(routeName)) return true;

            // 获取用户权限集合(按钮或API接口)
            var permissionList = await App.GetService<ISysMenuService>().GetLoginPermissionList(UserManager.UserId);

            // 检查授权
            return permissionList.Contains(routeName);
        }

关于测试api

用swagger 页面api 测试挺好.

swagger 能自动把 input 类的参数给放入请求参数中,input类内可以规定参数是否必须等等.

 

 

 

 

第一步先在验证部分请求登录,登录后swagger 页面会自动把token值 加入到页面内

 

后台配置内把token 的过期时间设置的长点,这样用的长久一点.

token 是能解开的.只是秘钥在服务器存着.

请求的时候, 点try it out 就可以了.

 

 如果需要留言后续再加开发中注意细节.

 

posted on 2022-05-07 15:56  小石头的一天  阅读(748)  评论(0)    收藏  举报