创建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. db2简单语句记录

    db2start db2 connect reset 断开连接 db2 drop db xxx 删除数据库 db2 list tables 查看表 db2 create database xxx 建立 ...

  2. WPF学习之路(四)路由

    路由事件概述 功能定义:路由事件是一种可以针对元素树中的多个侦听器(而不是仅针对引发该事件的对象)调用处理程序的事件. 实现定义:路由事件是一个 CLR 事件,可以由RouteEvent 类的实例提供 ...

  3. HTTP请求工具类

    HTTP请求工具类,适用于微信服务器请求,可以自测 代码; /// <summary> /// HTTP请求工具类 /// </summary> public class Ht ...

  4. 腾讯开放平台 IOS应用URL schema、Boundle ID填写 (含微博、微信)

    解释如下: qq比较麻烦点,需要两个 URL schemes 1.QQ+appID(appid原本是10进制的,需要转换16进制,网址:http://tool.oschina.net/hexconve ...

  5. DataTable去除重复行,根据某一字段进行distinct

    网上有很多方法,比如利用视图处理: //去掉重复行 DataView dv = table.DefaultView; table = dv.ToTable(true, new string[] { & ...

  6. expr

    将变量的值当作数值处理而不是字符串,shell支持6种算术运算符:加+, 减-,乘\*,除/, 取余%, 括号\( \),每种算术运算符的两边都要有空格 $echo "Res = $(exp ...

  7. gvim的菜单乱码解决方法

    gvim的菜单乱码解决方法: (乱码是由于系统内码不兼容导致,系统内码包括gb2312 gb18030 utf-8 utf-16[unicode]等) 生成文件 ~/.gvimrc 并添加如下语句:s ...

  8. HDU 4866 Shooting(持久化线段树)

    view code//第二道持久化线段树,照着别人的代码慢慢敲,还是有点不理解 #include <iostream> #include <cstdio> #include & ...

  9. oracle之报错:ORA-00054: 资源正忙,要求指定 NOWAIT

    oracle之报错:ORA-00054: 资源正忙,要求指定 NOWAIT 问题如下: SQL> conn scott/tiger@vm_database Connected to Oracle ...

  10. [书目20160624]Android应用开发从入门到精通

    卢海东 著 第1章 揭开神秘面纱——Android系统简介 1   1.1 认识Android系统 2   1.1.1 Android成长历程 2   1.1.2 发行版本 3   1.1.3 得到大 ...