创建Manager用户验证表

这一篇主要讲解使用AOP对用户操作进行验证,如果通过验证,则继续执行,反之,则不能执行。其思想和上一篇完全一致。

由于需要用到用户认证,所以我们新建一个Manager实体类,并按照开篇中的方法做Mapper:

Manager实体类代码:

   1:   
   2:  namespace BookStore.Data.Entities
   3:  {
   4:      public class Manager
   5:      {
   6:          public int ID { get; set; }
   7:          public string UserName { get; set; }
   8:          public string PassWord { get; set; }
   9:      }
  10:  }

ManagerMapper代码:

   1:  using BookStore.Data.Entities;
   2:  using System.Data.Entity.ModelConfiguration;
   3:  using System.ComponentModel.DataAnnotations.Schema;
   4:   
   5:  namespace BookStore.Data.Mapper
   6:  {
   7:      public class ManagerMapper:EntityTypeConfiguration<Manager>
   8:      {
   9:          public ManagerMapper()
  10:          {
  11:              this.ToTable("Manager");
  12:   
  13:              this.HasKey(c => c.ID);
  14:              this.Property(c => c.ID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
  15:              this.Property(c => c.ID).IsRequired();
  16:   
  17:              this.Property(c => c.UserName).HasMaxLength(50).IsRequired();
  18:   
  19:              this.Property(c => c.PassWord).HasMaxLength(50).IsRequired();
  20:          }
  21:      }
  22:  }

将其放倒OnModelCreating方法中,用于向数据库中生成数据表:

   1:  modelBuilder.Configurations.Add(new ManagerMapper());

建立好以后,运行起来,我们就新增加了一个Manager数据表到数据库中。

AOP用户验证的实现

下面继续进行AOP用户验证的讲解。

首先,新建一个BookStore.BussinessLogic类库项目,并添加IBookOperation接口和BookOperation类,用于提供业务逻辑操作(注意,由于BookStore.Data只提供最基本的数据元操作,所以,业务逻辑部分最好重新组织一个新的模块建立,以便于后期维护方便)。

在IBookOperation接口中,加入如下定义:

   1:   
   2:  namespace BookStore.BussinessLogic
   3:  {
   4:      public interface IBookOperation
   5:      {
   6:          bool UserLogin(string userName, string passWord);
   7:      }
   8:  }

在BookOperation类中,加入如下实现:

   1:  using System.Linq;
   2:  using BookStore.Data;
   3:   
   4:  namespace BookStore.BussinessLogic
   5:  {
   6:      public class BookOperation:IBookOperation
   7:      {
   8:          public BookOperation()
   9:          {
  10:              this.context = new BookContext();
  11:          }
  12:   
  13:          private BookContext context;
  14:   
  15:          public bool UserLogin(string userName, string passWord)
  16:          {
  17:              var manager = (from p in context.Managers 
  18:                             where p.UserName == userName && p.PassWord == passWord 
  19:                             select p).FirstOrDefault();
  20:              if (manager != null) return true;
  21:              return false;
  22:          }
  23:      }
  24:  }

代码的具体意思我就不讲解了,就是从数据表中取出数据,和用户输入的用户名密码进行比对。

然后,在BookStore.AOP项目中,新建一个AuthAdvice类,继承自IAdvice接口,并提供实现方法:

   1:  using System;
   2:  using BookStore.BussinessLogic;
   3:   
   4:  namespace BookStore.AOP
   5:  {
   6:      public class AuthAdvice:IAdvice
   7:      {
   8:          public AuthAdvice()
   9:          {
  10:              Initializement();
  11:          }
  12:   
  13:          public void Initializement()
  14:          {
  15:              bookOperation = new BookOperation();
  16:              
  17:              log4net.Config.XmlConfigurator.Configure();
  18:              log = log4net.LogManager.GetLogger(typeof(LogAdvice));
  19:          }
  20:   
  21:          private IBookOperation bookOperation;
  22:          private log4net.ILog log;
  23:   
  24:          public void BeforeCall(AopAlliance.Intercept.IMethodInvocation invocation)
  25:          {
  26:              log.Info(string.Format("调用验证开始:{0}", invocation.Method.Name));
  27:          }
  28:   
  29:          public void AfterCall(AopAlliance.Intercept.IMethodInvocation invocation)
  30:          {
  31:              log.Info(string.Format("调用验证结束:{0}", invocation.Method.Name));
  32:          }
  33:   
  34:          public object Invoke(AopAlliance.Intercept.IMethodInvocation invocation)
  35:          {
  36:              try
  37:              {
  38:                  BeforeCall(invocation);
  39:                  bool flag = bookOperation.UserLogin("admin", "admin888");
  40:                  if (flag)
  41:                  {
  42:                      log.Info(string.Format("用户验证成功,开始执行函数..."));
  43:                      object resultObj = invocation.Proceed();
  44:                      return resultObj;
  45:                  }
  46:                  else
  47:                  {
  48:                      log.Error(string.Format("用户验证失败,准备退出执行..."));
  49:                      return null;
  50:                  }
  51:                  AfterCall(invocation);
  52:              }
  53:              catch (Exception ex)
  54:              {
  55:                  log.Error(string.Format("调用函数错误:{0},{1},{2}", invocation.Method.Name, ex.Message, ex.StackTrace));
  56:                  return null;
  57:              }
  58:          }
  59:   
  60:          public void Dispose()
  61:          {
  62:              throw new NotImplementedException();
  63:          }
  64:      }
  65:  }

上面的验证代码和上一篇没什么区别,但是请注意这段代码:bookOperation.UserLogin("admin", "admin888"),它是在函数执行之前,先从数据库进行用户名密码验证的,如果验证通过,执行函数,否则放弃执行,通过这样的方式,我们就能够实现用户验证了。

接下来就是去BookStore.RestService项目中配置web.cofig代码,使其运行:

   1:  <!--Spring Config Node-->
   2:    <spring>
   3:      <context>
   4:        <resource uri="config://spring/objects"/>
   5:      </context>
   6:      <objects xmlns="http://www.springframework.net">
   7:        <!--without aop-->
   8:        <object name="BookRepository" type="BookStore.Data.BookRepository, BookStore.Data" />
   9:        
  10:        <!--with aop-->
  11:        <object name="BookRepositoryAOP" type="Spring.Aop.Framework.ProxyFactoryObject" >
  12:          <property name="Target">
  13:            <object type="BookStore.Data.BookRepository, BookStore.Data" />
  14:          </property>
  15:          <property name="InterceptorNames">
  16:            <list>
  17:              <value>LogTraceAroundAdvice</value>
  18:              <value>AuthTraceAroundAdvice</value>
  19:            </list>
  20:          </property>
  21:        </object>
  22:        <!--Advices-->
  23:        <object id="LogTraceAroundAdvice" type="BookStore.AOP.LogAdvice, BookStore.AOP"></object>
  24:        <object id="AuthTraceAroundAdvice" type="BookStore.AOP.AuthAdvice, BookStore.AOP"></object>
  25:      </objects>
  26:    </spring>

最后来看看运行结果:

这样就达到了我们验证的目的了。

源码下载

最后这里附上源代码下载。

TinyFrame尾篇:整合Spring AOP实现用户认证的更多相关文章

  1. TinyFrame再续篇:整合Spring AOP实现日志拦截

    上一篇中主要讲解了如何使用Spring IOC实现依赖注入的.但是操作的时候,有个很明显的问题没有解决,就是日志记录问题.如果手动添加,上百个上千个操作,每个操作都要写一遍WriteLog方法,工作量 ...

  2. TinyFrame续篇:整合Spring IOC实现依赖注入

    上一篇主要讲解了如何搭建基于CodeFirst的ORM,并且在章节末我们获取了上下文对象的实例:BookContext.这节主要承接上一篇,来讲解如何整合Spring IOC容器实现控制反转,依赖注入 ...

  3. 从零开始学 Java - Spring AOP 实现用户权限验证

    每个项目都会有权限管理系统 无论你是一个简单的企业站,还是一个复杂到爆的平台级项目,都会涉及到用户登录.权限管理这些必不可少的业务逻辑.有人说,企业站需要什么权限管理阿?那行吧,你那可能叫静态页面,就 ...

  4. Spring第六篇【Spring AOP模块】

    前言 Spring的第五篇也算是AOP编程的开山篇了,主要讲解了代理模式-..本博文主要讲解Spring的AOP模块:注解方式和XML方式实现AOP编程.切入点表达式.. AOP的概述 Aop: as ...

  5. spring-第十七篇之spring AOP基于注解的零配置方式

    1.基于注解的零配置方式 Aspect允许使用注解定义切面.切入点和增强处理,spring框架可以识别并根据这些注解来生成AOP代理.spring只是用了和AspectJ 5一样的注解,但并没有使用A ...

  6. SpringBoot安全篇Ⅵ --- 整合Spring Security

    知识储备: 关于SpringSecurity的详细学习可以查看SpringSecurity的官方文档. Spring Security概览 应用程序的两个主要区域是"认证"和&qu ...

  7. Spring课程 Spring入门篇 6-1 Spring AOP API的PointCut、advice的概念及应用

    本节主要是模拟spring aop 的过程. 实现spring aop的过程 这一节老师虽然说是以后在工作中不常用这些api,实际上了解还是有好处的, 我们可以从中模拟一下spring aop的过程. ...

  8. Django【第9篇】:Django之用户认证auth模块

    用户认证--------------auth模块 一.auth模块 from django.contrib import auth 1 .authenticate()   :验证用户输入的用户名和密码 ...

  9. spring-第十八篇之spring AOP基于XML配置文件的管理方式

    1.在XML配置文件中配置切面.切入点.增强处理.spring-1.5之前只能使用XML Schema方式配置切面.切入点.增强处理. spring配置文件中,所有的切面.切入点.增强处理都必须定义在 ...

随机推荐

  1. JSON 数据使用方法

    当同一个模板需要替换不同的数据显示的时候,如果数据量大点,用json很方便. json对象: var JSONObject= { "name":"Bill Gates&q ...

  2. 字节流InputStream/OutputStream

    字节流InputStream/OutputStream 本篇将对JAVA I/O流中的字节流InputStream/OutputStream做个简单的概括: 总得来说,每个字节流类都有一个对应的用途, ...

  3. 十五天精通WCF——第八天 对“绑定”的最后一点理解

    转眼已经中断10几天没有写博客了,也不是工作太忙,正好碰到了端午节,然后最近看天津台的爱情保卫战入迷了...太好看了,一直都是回味无穷...而且 涂磊老师话说的真是tmd的经典,然后就这样耽搁了,好了 ...

  4. W3School-CSS 文本实例

    CSS 文本实例 CSS 实例 CSS 背景实例 CSS 文本实例 CSS 字体(font)实例 CSS 边框(border)实例 CSS 外边距 (margin) 实例 CSS 内边距 (paddi ...

  5. 烂泥:puppet3.7安装与配置

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 有关服务器的自动化管理,这方面以前没有接触过.打算这段时间把这块知识给补上. 现在服务器自动化管理软件,使用最多也最火的就是puppet了. 那么我们今 ...

  6. Cookie在IE缓存问题深度研究

    最近在发布net到生产环境的时候,测试发现了问题,IE的登录无效. 同样的版本在QA环境没有遇到问题. 代码一样,chrome,firefox 都可以.就是IE不行,调试发现 登录完成,读取cooki ...

  7. canvas作为背景

    比如canvas的id是HB, 画好后执行document.body.style.background = "url('"+HB.toDataURL()+"')" ...

  8. Windows Azure支持七层负载均衡--Application Gateway

    一直以来Windows Azure的负载均衡(Loadbalancer)功能一直被客户诟病,无法其竞争对手(特别是国内的云厂商)匹敌. Windows Azure的负载均衡器是四层的,前期的版本不支持 ...

  9. 借用Snippet插件美化博客中的代码

    书写博客,难免要贴出代码.然而直接贴出代码,则不美观.于是,应运而生出现了很多代码美化的插件.其中比较有名的是Syntax Highlighting插件.   笔者在网上翻阅的时候发现了Snippet ...

  10. Scikit-Learn模块学习笔记——数据预处理模块preprocessing

    preprocessing 模块提供了数据预处理函数和预处理类,预处理类主要是为了方便添加到 pipeline 过程中. 数据标准化 标准化预处理函数: preprocessing.scale(X, ...