沙发(SF)通用权限验证组件
开篇
上一篇提到了通用权限的设计思路,根据设计思路一步一步的来实现一个相对通用的权限验证组件。在VS2010下用C#语言基于.net framework2.0框架实现具体功能。
配置文件
配置文件为XML格式(SFPermission.xml)公有四个节点分类:
一、AppSet节点:此节点配置一些基础信息。
1 <AppSet> 2 <!--数据库节点名称(必须在Web.config的connectionStrings节点下面)--> 3 <add key="DataConnName" value="ConnString"/> 4 <!--数据库连接字符串(DataConnName和ConnString节点只要有一个存在即可)--> 5 <add key="ConnString" value="数据库连接字符串"/> 6 <!--页面截取规则(0:只截取文件名,1:截取全路径,2:截取全路径(单文件去掉第一个[/]、包含路径的保留第一个[/]),可以在Page节点配置例外)--> 7 <add key="PageAllPath" value="2"/> 8 <!--未登录时的返回页面(登录验证为通过或SQL语句参数要取的Session值为空或不存在)--> 9 <add key="OutLogin" value="未登录时的输出信息"/> 10 <!--登录验证的Session名称--> 11 <add key="LoginSessionName" value="SysUserCode"/> 12 </AppSet>
二、MessageSet节点:没有权限时提示信息的配置。
1 <MessageSet> 2 <!--没有权限时的配置信息(Key为后缀名[后缀名为通配]或文件名,value为需要输出的文本)--> 3 <add key=".aspx" value="没有权限"/> 4 <!--没有权限时的配置信息(Key为后缀名,value为需要输出的文本)--> 5 <add key=".ashx" value="没有权限"/> 6 </MessageSet>
三、Pages节点:配置在截取验证URL的名称时要拼接参数的参数。
1 <!--需要连接参数的页面配置(配置的页面将用组合后的整体作为验证权限的页面名称)--> 2 <Pages> 3 <!--名称的第一个字符为(点)表示此种后缀名的请求都将连接某参数,value多个参数名用逗号分隔--> 4 <add key=".ashx" value="Action" /> 5 </Pages>
四、Permission节点:配置需要权限验证的页面、忽略权限验证的页面、权限验证的SQL语句、有权限的子功能(权限控制到按钮时)查询语句。
1 <Permission> 2 <!--做权限验证的页面(.开始表示后缀名通配规则,/开始表示目录通配,/结束标志包含子目录)--> 3 <PermissionPage> 4 <add value="/Manage" /> 5 <add value=".aspx" /> 6 <add value=".ashx" /> 7 </PermissionPage> 8 <!--不作权限和登录验证的页面(.开始表示后缀名通配规则,/开始表示目录通配,/结束标志包含子目录)--> 9 <Ignore> 10 <add value="/Manage/Default.aspx" /> 11 <add value="/Manage/Login.aspx" /> 12 <add value="/Manage/VerifyCode.aspx" /> 13 </Ignore> 14 <!--查询URL记录的SQL语句(可以有多个,只要有一个语句查询到记录即可,只有能查询到记录的URL请求才会进行权限验证)--> 15 <PermissionUrlSQL> 16 <!--查询权限SQL语句--> 17 <CommandText value="select A.FID from Man_Function A where A.FURL=@FURL" /> 18 <Parameter> 19 <!--SQL语句参数名--> 20 <ParameterName value="@FURL" /> 21 <!--SQL语句参数类型--> 22 <DBType value="VarChar" /> 23 <!--SQL语句参数要取的Session名称([PageName]表示取URL的字符串)--> 24 <SessionName value="PageName" /> 25 </Parameter> 26 </PermissionUrlSQL> 27 <!--权限验证SQL语句(可以有多个,只要有一个语句验证有权限则可以通过)--> 28 <PermissionSQL> 29 <!--查询权限SQL语句--> 30 <CommandText value="select A.FID from Man_Function A,Man_Popedom B where A.FID=B.FID AND B.EmpCode=@EmpCode AND A.FURL=@FURL" /> 31 <Parameter> 32 <!--SQL语句参数名--> 33 <ParameterName value="@EmpCode" /> 34 <!--SQL语句参数类型--> 35 <DBType value="VarChar" /> 36 <!--SQL语句参数要取的Session名称([PageName]表示取URL的字符串)--> 37 <SessionName value="SysUserCode" /> 38 </Parameter> 39 <Parameter> 40 <!--SQL语句参数名--> 41 <ParameterName value="@FURL" /> 42 <!--SQL语句参数类型--> 43 <DBType value="VarChar" /> 44 <!--SQL语句参数要取的Session名称([PageName]表示取URL的字符串)--> 45 <SessionName value="PageName" /> 46 </Parameter> 47 </PermissionSQL> 48 <!--查询URL子项记录的SQL语句(可以有多个,只要有一个语句查询到记录即可,只有能查询到记录的URL请求才会进行权限验证,通常情况是权限需要控制到按钮时需要的)--> 49 <ChildUrlSQL> 50 <!--查询权限SQL语句--> 51 <CommandText value="select A.FID from Man_Function A where A.FID=@FID" /> 52 <Parameter> 53 <!--SQL语句参数名--> 54 <ParameterName value="@FID" /> 55 <!--SQL语句参数类型--> 56 <DBType value="Int" /> 57 <!--SQL语句参数要取的Session名称([PageName]表示取URL的字符串)--> 58 <SessionName value="PageName" /> 59 <!--SQL语句参数要取的列名称(PermissionSQL结点中SQL语句的列,[PageName]表示取URL的字符串),和SessionName节点不能同事存在--> 60 <ColumnName value="FID" /> 61 </Parameter> 62 </ChildUrlSQL> 63 <!--菜单的子项查询(通常情况是权限需要控制到按钮时需要的)--> 64 <ChildSQL> 65 <!--查询SQL语句--> 66 <CommandText value="select A.FID from Man_Function A where A.FID=@FID" /> 67 <Parameter> 68 <!--SQL语句参数名--> 69 <ParameterName value="@FID" /> 70 <!--SQL语句参数类型--> 71 <DBType value="Int" /> 72 <!--SQL语句参数要取的Session名称--> 73 <SessionName value="DateTime" /> 74 <!--SQL语句参数要取的列名称(PermissionSQL结点中SQL语句的列,[PageName]表示取URL的字符串),和SessionName节点不能同事存在--> 75 <ColumnName value="FID" /> 76 </Parameter> 77 <!--按钮权限标志的列名称,这个值是要和前台页面元素的[sfcode]的值所对应的--> 78 <ButtonFlagColumn value="FID" /> 79 </ChildSQL> 80 </Permission>
其中ChildUrlSQL和ChildSQL节点是在权限验证控制到按钮(功能点)时才用到的,如果只是控制到页面可以删除这两个节点;
PermissionUrlSQL和PermissionSQL节点是控制到页面时的权限验证的SQL语句配置,如果只是做简单的登录验证也可以删除这两个节点。
下一篇文章将介绍组件的整体结构和实现,具体的编码工作也已经完成,初步测试了一下还可以。
ASP.NET通用权限组件实现一,布布扣,bubuko.com
原文:http://www.cnblogs.com/shangfeng/p/3915401.html