zoukankan      html  css  js  c++  java
  • 基于.net mvc的校友录(五、web.config对的配置以及filter实现的权限控制)

    web.config配置文件

    此文件是整个系统的配置中心,它告诉iis服务器本网站需要哪些运行时环境,需要哪些环境,将要进行哪些操作,开发人员也会将一个常量性的数据放在此配置中,以备系统全局调用。此文件内容丰富,对于一些普适性的项目,不作说明,只针对本系统的配置作相应说明。

                                        

     web.config配置文件

    web.config是xml格式的文件,它是一种结构性文档,可以通过结点对数据进行遍历。第一行<?xml version="1.0" encoding="utf-8"?>说明了xml所使用的格式与本文件的编码类型,默认是unicode,这里改成了utf-8。下面就是configuration父级结点,也就是说,这里所有内容都是配置性的内容了。这里要重点说明的是connectionStrings结点,这一项保存了ABConnection数据库连接字符串。此字符串中包含了数据库文件,并声明了所需要的支持引擎(System.Data.SqlServerCe.4.0)。

    在第97行有一个entityframework结点,这是vs自动配置的,用户可以在项目-属性中设置所使用的版本。当然,许多人还会在web.config中写membership,这是用来作权限控制的。这也是.NET MVC中的新功能,但是由于vs会因此自动建立数据表,导致用户对整个系统的掌握度降低,所以,权限方面设想了两种解决方案,后面会说。第70行runtime的第二子级都是默认引用的命名空间,当用户在本项目中新建一个类的时候,他们都会默认引用这些命名空间,以节省时间。

     权限控制模块Filter

    权限控制是一个网站系统的必须功能,大到角色权限,小到控制用户是否登陆,都有涉及。.net一直都为此提供了丰富的实用的方法,比如aspx时代的from验证,直接拖了控件就可以了,然后配置一下,每一页都会进行自动验证。而MVC不存在控制这个说法,所以拖控件这种形式已经不可取了,因为微软又给用户提供了membership来控制,但是由于membership要在数据库中自然生成表,而且,表的字段非常多,加上强制定义了一些person的属性,然后person实体类的构造方法又没有空参数的,所以,构造起来非常麻烦,想到每次要写几十个字段赋值,太可怕了。所以,经过考虑,决定自己来解决权限验证的问题,权限验证包括两部分:a.验证是不是在线用户;b.验证进行管理员操作的是不是管理员。其实这两种方法的实现是相同的,就拿检测用户是否存在为例说明,由于本项目目的在于应用.NET MVC,所以,期间并没有进行安全方面的过多设置。

    由于所有的逻辑都要由控制器来控制,所以最先想到的就是从控制器获取控制权限,想在每一个控制中调用一个静态方法,那就可以先写一个父控制器,实现一个静态方法,然后其它的控制器都继承该控制器,之后在每一个控制器的方法中,先使用此静态方法验证一次。但是,此方法似乎打破了.NET MVC的正常文件结构。所以,最后没有采用它,而选择了.NET MVC中新的特性filter。filter其实就是方法的特性属性。如果控制了方法的属性,写了方法的事件,那么该方法执行以后就可以得到控制。

    在项目中添加文件夹Filter,在此文件夹内新建类IsLogedAttribute.cs,这个类就是一个Filter,其功能是在执行一个控制器方法的时候,检测当前用户是否在线。

    引用的命名空间:

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Web;

    using System.Web.MVC;

    using AlumniBook.Models;

    using AlumniBook.Ensleep;

    Ensleep是自己写的工具类,里面提供了一些封装的方法。Models是对实体模型的引用,保证了在此类中可以调用实体模型,进行数据比对。其它系统级的调用,都是.NET MVC项目中必需引用的命名空间。

    public class IsLogedAttribute : FilterAttribute, IActionFilter

    {

          void IActionFilter.OnActionExecuted(ActionExecutedContext filterContext)

            {

             }

        void IActionFilter.OnActionExecuting(ActionExecutingContext filterContext)

            {

                此处省略代码内容

    }

    }

    此类继承了FilterAttribute和IActionFilter两个类,后者是接口,前面一个父类提供了公用方法,后面接口则确保了要实现OnActionExecuted和OnActionExecuting方法。这两个方法就是Filter功能实现的重点。

    OnActionExecuted是指在Action执行之后要执行的方法。这里面是要在方法执行之前进行操作,所以,这个方法无须进行额外操作。OnActionExecuting则是在方法执行之前触发,这里主要实现这个方法。它的参数为ActionExecutingContext类型,它包含了html请求中的所有属性,并且在方法执行完成后,它可以带着相应的数据回到之前的进程中,执行相应的操作。下面来看一下控制器方法如何引用Filter。

    public class PersonalCenterController : Controller

        {

             [IsLoged]

            public ActionResult Index()

            {}

    }

    这是个人中心的控制器,Index是它的一个方法,当有请求Url为:/Personal/Index时,因为有IsLoged特性标记,所以,会先执行IsLoged中的OnActionExecuting方法。然后从filterContext中取得session,再查看服务器上的sesson是否保存着当前对话,若是没有,说明用户浏览器关掉过,或者是用户已经长久没有操作了,这个时候就要让用户退出,用户所请求的操作非法,将用户转向登陆页面。filterContext.HttpContext.Response.Redirect("/Log/Login", true);是控制用户请求的转向,true代表用户之前的请求操作是否继续执行,true是终止。也就是说,控制器中的Index方法还没有执行的时候,就已经结束了。如果session验证的数据存在,那么,会调用封装的方法Sleep.IsMyuser(),这个方法判定一个用户是否是合法用户,传入的是字符串用户名,因为是测试功能实现的,所以,此处没有进行md5加密。如果检测到是数据库中的用户,那么就不进行任何操作,这样,当Filter执行完成后,会自动跳回到之前的控制器中的方法继续执行。如果不是数据库中的用户,那么就是没有登陆,这个时候,将session中的username移除,然后将用户转向到登陆页面。

    转载请标注原地址:http://www.cnblogs.com/ensleep/tag/%E5%9F%BA%E4%BA%8E.net%20mvc%E7%9A%84%E6%A0%A1%E5%8F%8B%E5%BD%95/

  • 相关阅读:
    Linux内核RPC请求过程
    二分图
    Java实现 蓝桥杯 算法提高 合并石子
    Java实现 蓝桥杯 算法提高 合并石子
    Java实现 蓝桥杯 算法提高 摩尔斯电码
    Java实现 蓝桥杯 算法提高 摩尔斯电码
    Java实现 蓝桥杯 算法提高 文本加密
    Java实现 蓝桥杯 算法提高 文本加密
    Java蓝桥杯 算法提高 九宫格
    Java蓝桥杯 算法提高 九宫格
  • 原文地址:https://www.cnblogs.com/ensleep/p/3144772.html
Copyright © 2011-2022 走看看