zoukankan      html  css  js  c++  java
  • <五>输入输出模型的建立及登陆验证

    仓储层和服务层建好了,那么就开始也业务逻辑吧。

    首先在服务层SysUserApp里面新建一个函数叫CheckLogin好了。

    public UserDto CheckLogin(LoginInputDto inputDto)
            {
                SysUserEntity entity= _sysUserRepository.GetAll().Where(b=>b.UserName.Equals(inputDto.name)&&b.Password.Equals(inputDto.pwd)).FirstOrDefault(); 
    UserDto dto
    = AutoMapper.Mapper.Map<UserDto>(entity); return dto;
    }

    看到代码里面的UserDto了没有。

    那是个什么东西?

    abp规定了数据在服务层和展示层的数据传输必须用数据传输对象。

    这样做的目的当然是层与层之间的分离拉。不懂的可以移步:https://aspnetboilerplate.com/Pages/Documents/Data-Transfer-Objects

    然后注意到AutoMapper没有?这也是个神一样模型类转换的框架,

    使用前需要配置一下映射,如何配置?打开Application层下的一个ApplicationModule文件,

    在Initialize函数里面添加automapper的映射配置,如下图:

     记得模块上面要加上依赖mapper的模块依赖:[DependsOn(typeof(AbpAutoMapperModule))]

    这是个啥玩意?想知道abp的模块系统?移步:https://aspnetboilerplate.com/Pages/Documents/Module-System

    我的登录验证输入dto只需要两个字段,一个是name ,一个是pwd,如下:

     public  class LoginInputDto
        {
         public LOginInputDto(string name,string pwd)
         {
          Name=naem;Pwd=pwd;
         }
    [Required]
    public string Name { get; set; } [Required] public string Pwd { get; set; } }

    发现了Required了吗?加入验证的特性后,abp会自动帮我们验证Name和Pwd是否为null,

    当然加入其他特性也会进行验证,如果有异常会自动抛出AbpValidationException的异常。

    传输对象弄好了,那么应该撸controller的checklogin代码了。

    [DontWrapResult]
            [DisableAbpAntiForgeryTokenValidation]
            public ActionResult CheckLogin(string username, string password, string code)
            {try
                {
                    if (SessionHelper.GetSession(SessionKey.session_verifycode.ToString())==string.Empty || Md5.GetMD5(code.ToLower()) != SessionHelper.GetSession(SessionKey.session_verifycode.ToString()))
                    {                   throw new Exception("验证码错误,请重新输入");
                    }
                    LoginInputDto inputDto = new LoginInputDto(username, Md5.GetMD5(password));
                    UserDto  userDto = _sysUser.CheckLogin(inputDto);
                    if (userDto != null)
                    {
                        UserInfo info = new UserInfo();
                        info.UserID = userDto.Id;
                        info.UserName = userDto.UserName;
                        FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket
                        (1, JsonConvert.SerializeObject(info), DateTime.Now, DateTime.Now.AddMinutes(20), false, "role");
                        string encryptedTicket = FormsAuthentication.Encrypt(authTicket);
                        HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
                        System.Web.HttpContext.Current.Response.Cookies.Add(authCookie);
                return Json(new AjaxResult{State=ResultType.success.ToString(),message="登录成功!"}) }
    return Json(new AjaxResult { state = ResultType.error.ToString(), message = "用户名或密码错误" }); } catch (Exception ex) { return Json(new AjaxResult { state = ResultType.error.ToString(), message = ex.Message }); } }

    实际上abp给我们实现了IAbpSession的接口会话,用来保存当前登录的用户Id和租户Id,但是只有这两个是不够的,拓展起来又贼麻烦。

    暂时不用它,等到要拓展多租户功能的时候再来用它,干脆先自己定义一个UserInfo类,权且保存当前的登录用户信息。后面再搞。

    大家注意到这个玩意了吗?[DisableAbpAntiForgeryTokenValidation]

    这个是防止CSRF(跨网站请求伪造)的,abp默认为action添加了这个验证,

    如果我们不使用abp.ajax进行请求的话,会报这个没有 AntiForgeryToken的错误。加上这个去掉默认验证。

    所以当我们只用jquery的ajax进行请求的话,加上取消防CSRF标志,就好了。

    先实现一下登录功能先。

    登录成功进入到首页

    由于我们还没有建立菜单和首页,所以什么都没有。

    下一篇我们来显示左侧菜单。

  • 相关阅读:

    ATM三层架构思路
    一个项目的从无到有
    re模块
    logging模块
    物联网公共安全平台软件体系架构
    本科生怎样发表自己的论文
    Cloud Native 云化架构阅读笔记
    实验5 Spark SQL编程初级实践
    云计算环境下计算机软件系统架构分析
  • 原文地址:https://www.cnblogs.com/choii/p/11443877.html
Copyright © 2011-2022 走看看