??? ? 前提 :已有成功部署的 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 ,像我這樣用代理的必然死瀏覽器,看來里面有技術問題。我第一次提交瀏覽器就死了,這是我第四次提交。
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
