2016-04-05 17 views
0

私はSpotfire(6.5)レポートの行レベルのセキュリティに取り組んでいます。Spotfire - 高度な行レベルのセキュリティ

これはL1、L2、L3の3つのレベルで実装する必要があります。 Userloginsとユーザーがアクセスできるすべてのレベルで指定された値を含む追加のマッピングテーブルがあります。さらに、ユーザーがマッピングテーブルにない場合、彼は何らかのルートユーザーであり、すべてにアクセスできます。 DB側で

それは次のようになります。

CREATE TABLE SECURITY 
(
    USER_ID VARCHAR2(100 BYTE) 
, L1 VARCHAR2(100 BYTE) 
, L2 VARCHAR2(100 BYTE) 
, L3 VARCHAR2(100 BYTE) 
--, L1L2L3 VARCHAR2(100 BYTE) -- option there could be one column that contains lowest possible level 
); 

INSERT INTO SECURITY (USER_ID, L1) VALUES ('UNAME1','A'); 
INSERT INTO SECURITY (USER_ID, L2) VALUES ('UNAME2','BB'); 
INSERT INTO SECURITY (USER_ID, L3) VALUES ('UNAME3','CCC'); 

CREATE TABLE SECURED_DATA 
(
    L1 VARCHAR2(100 BYTE) 
, L2 VARCHAR2(100 BYTE) 
, L3 VARCHAR2(100 BYTE) 
, V1 NUMBER 
); 

INSERT INTO SECURED_DATA (L1, V1) VALUES ('A',1); 
INSERT INTO SECURED_DATA (L1, L2, V1) VALUES ('B','BB',2); 
INSERT INTO SECURED_DATA (L1, L2, L3, V1) VALUES ('C','CC','CCC',3); 

最後に、私は情報リンクを作ったし、私はそのようなことにそのSQLコードを変更しました:

SELECT 
    M.* 
FROM 
    SECURITY S 
INNER JOIN SECURED_DATA M 
ON 
    (
    M.L1  = S.L1 
    AND S.USER_ID = (%CURRENT_USER%) 
) 
UNION ALL 
SELECT 
    M.* 
FROM 
    SECURITY S 
INNER JOIN SECURED_DATA M 
ON 
    (
    M.L2 = S.L2 
    AND S.USER_ID = (%CURRENT_USER%) 
) 
UNION ALL 
SELECT 
    M.* 
FROM 
    SECURITY S 
INNER JOIN SECURED_DATA M 
ON 
    (
    M.L3  = S.L3 
    AND S.USER_ID = (%CURRENT_USER%) 
) 
UNION ALL 
SELECT 
    M.* 
FROM 
    SECURED_DATA M 
WHERE 
    (
    SELECT 
     COUNT(1) 
    FROM 
     SECURITY S 
    WHERE S.USER_ID = (%CURRENT_USER%) 
) 
    =0 

それは動作します良いですが、よりスマートでSpotfireの方があれば、私は疲れていますか?

多くのおかげに関して、 マチェイ

答えて

0
「よりスマートで、よりスポットファイアの道」の私の推測では、あなたがそれを制限し、設定された単一のデータをキャッシュし、複数のユーザーのためにそれを使用できるようにしたいということです

データを抽出するのではなく、分析的に分析します。データが技術的にアナリティックに置かれ、ビジュアライゼーションを編集して追加する権限を持っていれば、見えないものや見えないものを制御することができなくなるため、セキュリティ上の理由でこれを行うのは危険です。 Web Playerで特定のアナリティクスのオーサリングが許可されている場合は、すべての有価証券をDataBase側で行うことをお勧めします。

あなたはとにかくスポットファイアでそれをしたい場合は、ここで私のお勧めです:

は、SECURITYからWHERE S.USER_ID =(%のCURRENT_USER *選択している(IL_SecurityCheckという名前の例の場合、用)情報リンクを持っています%)。

カバーページからデータが入っているページに移動する場合は、スクリプトにコードを挿入してページを変更できます。そうでない場合は、私がここで説明した方法を使用することができます:Spotfire Current Date in input field with calendar popupオープン時にスクリプトを起動します。

ボタンのスクリプトに必要な:式によって制限され

from Spotfire.Dxp.Data import * 

crossSource = Document.Data.Tables["IL_SecurityCheck"] 

rowCount = crossSource.RowCount 
rowIndexSet = IndexSet(rowCount, True) 

print rowCount 
#rowCount = Document.Data.Tables["Managed Care UpDownStream"].RowCount 
colCurs = DataValueCursor.CreateFormatted(crossSource.Columns["L1"]) 
colCurs2 = DataValueCursor.CreateFormatted(crossSource.Columns["L2"]) 
colCurs3 = DataValueCursor.CreateFormatted(crossSource.Columns["L3"]) 

x = "" 
if rowIndexSet.IsEmpty != True: 
    for row in crossSource.GetRows(rowIndexSet, colCurs): 
     if colCurs.CurrentValue is not None: 
      x += "[L1] = '" + colCurs.CurrentValue + "' and " 
    for row in crossSource.GetRows(rowIndexSet, colCurs2): 
     if colCurs2.CurrentValue is not None: 
      x += "[L2] = '" + colCurs2.CurrentValue + "' and " 
    for row in crossSource.GetRows(rowIndexSet, colCurs3): 
     if colCurs3.CurrentValue is not None: 
      x += "[L3] = '" + colCurs3.CurrentValue + "' and " 
    x = x[:len(x) - 4] 
else: 
    x = "1=1" 

Document.Properties["SecurityLimits"] = x 

可視化データ:$ {} SecurityLimits

関連する問題