开源DDD设计模式框架YMNNetCoreFrameWork第四篇-增加YMNSession,增加异常处理,增加策略授权

1、增加YMNSession,可以获取当前登录的用户信息

2、增加异常处理,不要使用过滤器,过滤器只能获取到mvc异常

3、增加策略授权,策略授权支持用户角色、用户名授权,初步实现

代码地址:https://github.com/topgunymn/YMNNetCoreFrameWork

获取当前登录用户信息

 [HttpPost("Login")]
        public async Task<object> Login(string name, string password) {
            YMNSession.Configure(_httpContextAccessor);
            var user = await _userManager.FindByNameAsync(name);
            var result = await _signInManager.PasswordSignInAsync(user, password, false,false);
            //List<Claim> claims = new List<Claim>() {
            //     new Claim("userName",name)
            //};

            //这里可以随意加入自定义的参数,key可以自己随便起
            var claims = new[]
            {
                    new Claim(JwtRegisteredClaimNames.Nbf,$"{new DateTimeOffset(DateTime.Now).ToUnixTimeSeconds()}") ,
                    new Claim (JwtRegisteredClaimNames.Exp,$"{new DateTimeOffset(DateTime.Now.AddMinutes(30)).ToUnixTimeSeconds()}"),
                    new Claim(ClaimTypes.NameIdentifier, name)
             };
            var token =  CreateAccessToken(claims);

            YMNSession.UserId = user.Id;
            YMNSession.UserName = user.UserName;
            YMNSession.TenantId = user.TenantId;
            return token;
        }

[HttpGet]
[Route("Get2")]
[Authorize("YMNPolicy")]
public ActionResult<IEnumerable<string>> Get2()
{
//这是获取自定义参数的方法

return new string[] { "只有授权的用户才能访问该接口", $"userName={YMNSession.UserName}" };
}

 

2、增加异常处理

 public static void UseMyExceptionHandler(this IApplicationBuilder app, ILoggerFactory loggerFactory)
        {
            app.UseExceptionHandler(builder => {

                builder.Run(async context =>
                {
                    context.Response.StatusCode = StatusCodes.Status500InternalServerError;
                    context.Response.ContentType = "application/json";
                    var ex = context.Features.Get<IExceptionHandlerFeature>();
                    if (ex != null)
                    {
                        //记录日志
                        var logger = loggerFactory.CreateLogger("YmnFrmaworkExceptionHandler");
                        logger.LogDebug(500, ex.Error, ex.Error.Message);
                    }
                    await context.Response.WriteAsync(ex?.Error?.Message ?? "错误了");
                });
            });
        }

3、增加授权策略

       /// <summary>
        /// 验证策略
        /// </summary>
        /// <param name="context"></param>
        /// <param name="requirement"></param>
        /// <returns></returns>
        protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, YMNPolicy requirement)
        {
            //赋值用户权限
            var userPermissions = requirement.UserPermissions;
            //从AuthorizationHandlerContext转成HttpContext,以便取出表求信息
            var httpContext = (context.Resource as Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext).HttpContext;
            //请求Url
            var questUrl = httpContext.Request.Path.Value.ToUpperInvariant();
            //是否经过验证
            var isAuthenticated = httpContext.User.Identity.IsAuthenticated;
            if (isAuthenticated)
            {
                if (userPermissions.GroupBy(g => g.Url).Any(w => w.Key.ToUpperInvariant() == questUrl))
                {
                    //用户名
                    var userName = httpContext.User.Claims.SingleOrDefault(s => s.Type == ClaimTypes.NameIdentifier).Value;
                    if (userPermissions.Any(w => w.UserName == userName && w.Url.ToUpperInvariant() == questUrl))
                    {
                        //处理程序使用 AuthorizationHandlerContext 类来标记是否已满足要求:
                        context.Succeed(requirement);
                    }
                    else
                    {
                        //无权限跳转到拒绝页面
                        httpContext.Response.Redirect(requirement.DeniedAction);
                    }
                }
                else
                {
                    context.Succeed(requirement);
                }
            }
            return Task.CompletedTask;
        }

原文地址:https://www.cnblogs.com/topguntopgun/p/12269837.html

时间: 2024-08-30 02:59:14

开源DDD设计模式框架YMNNetCoreFrameWork第四篇-增加YMNSession,增加异常处理,增加策略授权的相关文章

开源DDD设计模式框架YMNNetCoreFrameWork第五篇-Swagger增加权限认证

配置文件services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Version = "v0.1.0",//版本号 Title = "尹大师框架说明,QQ:1390788386",//文档标题 Description = "框架说明文档",//文档描述 Contact = new OpenApiContact { Name = "道法自

开源DDD设计模式框架YMNNetCoreFrameWork第一篇

DDD设计模式:仓储.领域模型.应用层.聚合根.事件总线,以业务模型驱动设计,从数据模型驱动脱离,不用关心数据库设计,开发效率更高 DDD领域驱动设计模型概念不再讲解,直接上技术 框架搭建: 如图所示, Host是程序的路口,用来配置项目的 Application,是应用层,为用户提供接口 Core,领域模型层 EntityFrameWorkCore,基础设施层,提供仓储,数据库迁移, 源代码地址:https://github.com/topgunymn/YMNNetCoreFrameWork

开源DDD设计模式框架YMNNetCoreFrameWork第二篇-增加ASp.net core Identity身份认证,JWT身份认证

1.框架增加Identity注册功能 2.框架增加identity登录以后获取JWTtoken 3.请求接口通过token请求,增加验证特性 源代码地址:https://github.com/topgunymn/YMNNetCoreFrameWork JWTtoken生成代码: private string CreateAccessToken(IEnumerable<Claim> claims, TimeSpan? expiration = null) { var now = DateTime

手写MyBatis,纯手工打造开源框架(第四篇:决胜千里)- 第272篇

说明 MyBatis版本:3.5.1 相关历史文章(阅读本文之前,您可能需要先看下之前的系列) Spring Boot MyBatis最全教程:你值得拥有MyBatis能脱离Spring吗一图纵览MyBatis的工作原理从源码看MyBatis,竟如此简单MyBatis的Mapper是什么`垃圾` 手写MyBatis,纯手工打造开源框架(第一篇:风云再起) 手写MyBatis,纯手工打造开源框架(第二篇:君临天下) 手写MyBatis,纯手工打造开源框架(第三篇:运筹帷幄) 前言        运

SpringMVC框架之第四篇

5.SpringMVC异常处理 5.1.异常分类 1.可预知异常: Java编译时可检测异常,例如:IOException.SQLException等. 自定义异常(继承Exception父类的自定义类即为自定义异常). 2.不可预知异常: Java运行时异常,例如:NullPointerException.IndexOutOfBoundsException等. 5.2.SpringMVC异常处理 在JavaEE项目的开发中,不管是持久层的数据库操作过程,还是业务层的处理过程,还是控制层的处理过

Farseer.net轻量级ORM开源框架 V1.x 入门篇:数据库上下文

导航 目   录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:数据库配置文件 下一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:表实体类映射 前言 上文讲述了数据库配置使用,搭建好数据库的链接方式了我们知道怎么做了. 事实上,至今我们仍然还没有讲到代码方面,花了前面这么多篇幅讲解,主要是想由浅入深,不然一上来给大家讲解这讲解那的,听的也一头雾水,反而得不到效果. 这篇比较重要,因为它是我们在使用Far

Chrome下的语音控制框架MyVoix.js使用篇(四)

在上一篇博文中,我为大家介绍了myvoix.js中的smart learning模块,以及何如使用该功能.(myvoix.js的源码地址会在每一篇文章末尾放出) 文本将拓展 Chrome下的语音控制框架MyVoix.js使用篇(二) 中的实例(没看过的同学请猛戳链接),具象地介绍smart learning模块的使用.在之前的实例中,我们通过语音输入,让 Hello My Voix 标题变化成各种颜色, 并且通过预存指令来增加语音指令的识别率.在本文中将去除预存指令这一块,通过smart lea

Farseer.net轻量级ORM开源框架 V1.x 入门篇:存储过程数据操作

导航 目   录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:存储过程实体类映射 下一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:表/视图缓存操作 TableCahceSet.ViewCahceSet 前言 在上篇中,我们学会了存储过程的关系映射,其中知道了存储过程需要使用:ProcSet作为操作的上下文,以及在Field特性上,我们知道了新的两个属性用来存储过程的参数输入输出. 在上篇末尾,提到了

Farseer.net轻量级开源框架 V1.x 入门篇:数据库配置及其它配置文件

导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 V1.x 入门篇:新版本说明 下一篇:Farseer.net轻量级开源框架 V1.x 入门篇:表实体类映射 前言 Farseer.Net是支持多数据库的ORM,使用者通过配置文件即可切换指定的数据库而不需要修改项目中的任何代码.本篇讲述如何进行数据库环境的配置.同时也讲述其它配置文件的使用. 配置文件 1.配置文件的路径: 不管是WebForm.Mvc.WinForm,配置文件统一放在:~