TinyFrame尾篇:整合Spring AOP实现用户认证
创建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实现用户认证的更多相关文章
- TinyFrame再续篇:整合Spring AOP实现日志拦截
上一篇中主要讲解了如何使用Spring IOC实现依赖注入的.但是操作的时候,有个很明显的问题没有解决,就是日志记录问题.如果手动添加,上百个上千个操作,每个操作都要写一遍WriteLog方法,工作量 ...
- TinyFrame续篇:整合Spring IOC实现依赖注入
上一篇主要讲解了如何搭建基于CodeFirst的ORM,并且在章节末我们获取了上下文对象的实例:BookContext.这节主要承接上一篇,来讲解如何整合Spring IOC容器实现控制反转,依赖注入 ...
- 从零开始学 Java - Spring AOP 实现用户权限验证
每个项目都会有权限管理系统 无论你是一个简单的企业站,还是一个复杂到爆的平台级项目,都会涉及到用户登录.权限管理这些必不可少的业务逻辑.有人说,企业站需要什么权限管理阿?那行吧,你那可能叫静态页面,就 ...
- Spring第六篇【Spring AOP模块】
前言 Spring的第五篇也算是AOP编程的开山篇了,主要讲解了代理模式-..本博文主要讲解Spring的AOP模块:注解方式和XML方式实现AOP编程.切入点表达式.. AOP的概述 Aop: as ...
- spring-第十七篇之spring AOP基于注解的零配置方式
1.基于注解的零配置方式 Aspect允许使用注解定义切面.切入点和增强处理,spring框架可以识别并根据这些注解来生成AOP代理.spring只是用了和AspectJ 5一样的注解,但并没有使用A ...
- SpringBoot安全篇Ⅵ --- 整合Spring Security
知识储备: 关于SpringSecurity的详细学习可以查看SpringSecurity的官方文档. Spring Security概览 应用程序的两个主要区域是"认证"和&qu ...
- Spring课程 Spring入门篇 6-1 Spring AOP API的PointCut、advice的概念及应用
本节主要是模拟spring aop 的过程. 实现spring aop的过程 这一节老师虽然说是以后在工作中不常用这些api,实际上了解还是有好处的, 我们可以从中模拟一下spring aop的过程. ...
- Django【第9篇】:Django之用户认证auth模块
用户认证--------------auth模块 一.auth模块 from django.contrib import auth 1 .authenticate() :验证用户输入的用户名和密码 ...
- spring-第十八篇之spring AOP基于XML配置文件的管理方式
1.在XML配置文件中配置切面.切入点.增强处理.spring-1.5之前只能使用XML Schema方式配置切面.切入点.增强处理. spring配置文件中,所有的切面.切入点.增强处理都必须定义在 ...
随机推荐
- C#中方法的参数的四种类型
C#中方法的参数有四种类型: 1. 值参数类型 (不加任何修饰符,是默认的类型) 2. 引用型参数 (以ref 修饰符声明) 3. 输出型参数 (以out 修 ...
- (视频) 《快速创建网站》 2.3 WordPress初始化和功能简介
本文是<快速创建网站>系列的第4篇,如果你还没有看过之前的内容,建议你点击以下目录中的章节先阅读其他内容再回到本文. 访问本系列目录,请点击:http://devopshub.cn/tag ...
- yii2 gridview 是否显示某列案例
作者:白狼 出处:http://www.manks.top/article/yii2_gridview_visible 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给 ...
- OEM代工厂产品经理个人经历谈
创业不是一件随随便便的事情! 到2007年时,我已经在上海.广州.东莞三地的工厂打工有十来年了.正是这个时间结点,我也即将做父亲了.打了很久的工后,就开始感到疲倦,做来做去,都是给老板做,也就在这时开 ...
- PMBOK(第五版)学习笔记二-十大知识领域(P87)
五大项目管理过程组:启动.规划.执行.监控.收尾过程组 十大知识领域是:项目整合管理.项目范围管理.项目时间管理.项目成本管理.项目质量管理.项目人力资源管理.项目沟通管理.项目风险管理.项目采购管理 ...
- NOSQL(一)--Redis
简介 最近开始接触NoSQL,翻译过来就是 not only sql,非关系型数据库吧. 其中主要有四大类NoSQL,今天我们介绍其中的一种键值对的NoSQL:Redis. 定义:Redis是一个开源 ...
- URL编码知识摘抄备忘
网页工具 http://www.107000.com/T-UrlEncode/ 参考: 维基百科http://zh.wikipedia.org/zh/%E7%99%BE%E5%88%86%E5%8F% ...
- TCMalloc 对MYSQL 性能 优化的分析
虽然经过研究发现TCMalloc不适合我们现有的游戏框架,但意外收获发现TCMalloc可以大幅度提高MYSQL 性能及内存占用,这里给出配置及测试的结果: 1.配置 关于TCMalloc的安装,在& ...
- AStar算法的学习
摘自:http://www.cnblogs.com/hxsyl/p/3994730.html A*算法的java实现 import java.util.ArrayList; import java.u ...
- Hadoop_MapReduce流程
Hadoop学习笔记总结 01. MapReduce 1. Combiner(规约) Combiner号称本地的Reduce. 问:为什么使用Combiner? 答:Combiner发生在Map端,对 ...