前提:已有成功部署的SQL2008报表(2005也行,不过调的webservice可能不一样,我直接从2008开始学的),并在VS2005下新建一个网站。
完成功能:今天看了蜡人张的博文http://www.cnblogs.com/waxdoll/archive/2006/07/30/463114.html得到启发,简单调试了一下,完成SQL2008 Reporting Service下的表单验证。
实现思路:过程如下:用户输入用户名、密码-》通过数据库验证用户-》若成功,则返回该用户Windows下的身份凭证-》用返回的凭证登录报表服务器-》返回报表项-》遍历该用户权限,若有读权限,则在treeview上绑定一个节点-》验证过程完毕!为简单起见,我略去数据库验证这一环,要添上也非常简单,建一个用户表就行,不过里面要加上从当前用户到windows用户或组的映射,所谓映射其实就是让该用户名与windows用户的帐户、密码做个对应,后面添加两个字段就行。控制用户权限时直接更该对应的windows用户就行。
过程截图:
一、添加web引用,URL:http://localhost/reportserver/reportservice2005.asmx?wsdl,点击添加引用。注意:此处地址跟蜡人张博文中的不一样。有心情可以看下该webservice提供的方法,有的将会在以后的应用中用到。
二、在页面上放上一个Table、两个TextBox、一个Button、一个Treeview、一个ReportViewer,在此只做简单介绍,故空间ID都不改了,大家在实际项目中可千万要记得改。界面也不作修饰了,截图如下。
三、进入代码编辑界面,双击Button进入代码编辑页面,输入如下代码:
#region//用户登录并更新树
protected void Button1_Click(object sender, EventArgs e)
{
//实现接口ICredentials,在此可通过数据库验证用户的登录,并返回该用户所映射到的windows帐户、密码,并以此帐户、密码登录报表服务器,关键就在这
ICredentials credentials = new NetworkCredential(TextBox1.Text,TextBox2.Text, "esint-9eb6bad34");
rs.Credentials = credentials;
TreeView1.Nodes.Clear();
try
{
this.AddNodes(this.TreeView1.Nodes, "/");
}
catch
{
Response.Write("<script>alert('您的登录名或密码有误!')</script>");
}
}
#endregion
补充:需添加using引用:using System.Web.Services.Protocols;using System.Net;
四、添加方法AddNodes完成绑定树节点的操作,代码如下:
#region//给树添加节点
private void AddNodes(TreeNodeCollection tnc, string nodepath)
{
//返回所有报表项 的集合
localhost.CatalogItem[] items = rs.ListChildren(nodepath, true);
TreeNode tn = new TreeNode();//声明一个空节点,存放文件夹节点
for (int i = 0; i <items.Length; i++)
{
/*返回该用户的所有权限,管理员的权限项分别为:Create Folder、Delete、Read Properties、
* Update Properties、Create Report、Create Resource、Create data source、Create Model、
* Read Security Policies、Update Security Policies */
string[] perm = rs.GetPermissions(items[i].Path);
//添加节点,该方法只限于文件夹嵌套层次为一层的情况下
foreach (string per in perm)
{
//判断是否拥有度权限
if (per == "Read Properties")
{
//如果该项为文件夹
if (items[i].Type == localhost.ItemTypeEnum.Folder)
{
tn = new TreeNode(items[i].Name, "folder" + items[i].Path, "folder.gif", "", "");
tnc.Add(tn);
}
else if (items[i].Type == localhost.ItemTypeEnum.Report)
{
//在已添加的文件夹节点就爱如报表节点
tn.ChildNodes.Add(new TreeNode(items[i].Name, "report" + items[i].Path, "report.gif", "", ""));
tn.Expanded = false;//设置文件夹节点初始为闭合状态
}
}
}
}
items = null;//清空项
}
#endregion
五、加入点击树的事件代码:
#region//完成点击treeview的事件
protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e)
{
//显示报表
if (TreeView1.SelectedNode != null)
{
string type = TreeView1.SelectedNode.Value.Substring(0, 6);
if (type == "report")
{
this.ReportViewer1.Visible = true;
this.ReportViewer1.ProcessingMode = Microsoft.Reporting.WebForms.ProcessingMode.Remote;
this.ReportViewer1.ServerReport.ReportServerUrl = new Uri("http://localhost/reportserver");
this.ReportViewer1.ServerReport.ReportPath = TreeView1.SelectedNode.Value.Substring(6);
}
}
}
#endregion
六、预览一下
前提说明:已创建了三个用户,一个Administrator为管理员,ReportUser为用户,有除AC目录外的权限,ReportUser2为用户,只有浏览目录的权限。
首先管理员登录,截图如下:
然后用ReportUser登录,截图如下,看是不是没有AC目录了。
最后用ReportUser2登录,该用户只有浏览目录的权限,所以目录前面没有加号。不好意思,忘了添加隐藏报表的语句了。
总结:算是一个简单教程吧,也是本人博客的开篇,以后学习过程中我将会把自己实现的一些比较有特点的功能跟大家做交流,如果大家有更好的方法,也希望能分享一下,毕竟我还刚开始学。博客园是个非常好的学习平台,大家要好好利用。
严重建议博客园更改图片插入功能,虽然功能很强大,但是我觉得大多数人都不会去用那些功能,只需简单的能插入就行。更严重的是里面有太多的JS代码,占用太多CPU资源。这个图片上传是不是另外又开了个Socket,像我这样用代理的必然死浏览器,看来里面有技术问题。我第一次提交浏览器就死了,这是我第四次提交。