0

xpages ベースの Web ページの Web ユーザーが、匿名が ACL にアクセスできないデータベースにあるドキュメントを (読み取りモードのみ) 表示できる方法はありますか? アクセスできる場合は、たとえば次のようにドキュメントを取得できます。 https://servername/otherdatabase.nsf/O/"+thisid+"/$FILE/"+thisdocument

SessionAsSigner で可能に違いないと思いますが、どうやって?

次に、このユーザーが、匿名ユーザーがアクセスできないデータベースからのビューを表示する方法はありますか? どうすればこれを設定できますか?

4

3 に答える 3

9

もう 1 つのオプションは、XAgent を使用することです。たとえば、beforeRenderResponseイベントを次のように設定します。

var fileDb = sessionAsSigner.getDatabase((param.server || ""), param.path);
var fileDocument = fileDb.getDocumentByUNID(param.id);
var attachment = fileDocument.getAttachment(param.filename);
var inputStream = attachment.getInputStream();
var response = facesContext.getExternalContext().getResponse();
/* The following MIME type is generic, should work for all image types;
If you know what type the image will be, set a more specific MIME type */
response.setContentType("application/octet-stream");
var outputStream = response.getOutputStream();
com.acme.xsp.util.StreamUtil.copyStream(inputStream, outputStream);
inputStream.close();
outputStream.close();
attachment.recycle();
fileDocument.recycle();
facesContext.responseComplete();

com.acme.xsp.util.StreamUtilあるストリームを別のストリームにパイプライン処理するための Java コンビニエンス クラスを参照します。

public class StreamUtil {
    public static void copyStream(InputStream input, OutputStream output) throws IOException {
        byte[] buffer = new byte[1024];
        int bytesRead;
        while ((bytesRead = input.read(buffer)) != -1) {
            output.write(buffer, 0, bytesRead);
        }
    }
}

したがって、画像タグを添付ファイルに直接リンクする代わりに、次のようになります。

<xp:image url="/download.xsp?server=ACME01&amp;path=images.nsf&amp;id=OU812&amp;filename=photo.jpg" />

このアプローチでは、他のオプションも提供されます。特定のファイルがアクセスされた回数のログ記録、リファラー URL (Google で画像を検索するときに時々表示される「ホットリンクなし」の画像置換を実装する場合)、または実際に必要なもの.

具体的な例として、約 10 年前、ある同僚が、サイトのすべてのページの会社のロゴにこの手法を使用していたため、JavaScript をサポートしていないブラウザーでも機能する、Google アナリティクスに相当する基本的な社内ツールを実装しているのを見ました。ロゴ JPG に直接リンクする代わりに、彼は IP、リファラー、ユーザー エージェントなどを取得する PHP ファイルにリンクし、すべてのメタデータを MySQL データベースに書き出し、最後にロゴのバイトをブラウザーにストリーミングしました。これは明らかに、あなたが達成しようとしているように聞こえるものの範囲外ですが、XPages ではこのタイプのユースケースがかなり単純になっていることに興味を持っていただけるのではないかと思いました。

于 2013-04-18T11:27:17.893 に答える
4

これは、sessionAsSigner と、たとえば繰り返しを使用して可能です。XPage が同じデータベースにある場合は、XPage を公開アクセス可能としてマークしてください。次の簡単な例では、ビュー列のコンテンツとドキュメントの画像を表示します。

<xp:repeat id="protectedView" rows="15" removeRepeat="true" var="rowEntry" disableOutputTag="true">
    <xp:this.value><![CDATA[#{javascript:
        var thisDb = sessionAsSigner.getDatabase(database.getServer(), database.getFilePath());
        var aView = thisDb.getView("protectedView");
        return staffView.getAllEntries(); // return collection of docs
    }]]></xp:this.value>
        <xp:text>
            <xp:this.value><![CDATA[#{javascript:rowEntry.getColumnValues().elementAt(1)}]]></xp:this.value>
        </xp:text>
        <xp:br />
        <xp:text>
            <xp:this.value><![CDATA[#{javascript:rowEntry.getColumnValues().elementAt(2)}]]></xp:this.value>
        </xp:text>
        <xp:br />
        <xp:inputRichText id="inputRichText1" readonly="true">
            <xp:this.value><![CDATA[#{javascript:
                // wrap NotesDocument into NotesXspDocumenet to easily display picture
                wrapDocument(rowEntry.getDocument()).getValue("Picture");}]]></xp:this.value>
        </xp:inputRichText>
</xp:repeat>

は wrapDocument XSnippet を使用して、NotesDocument を NotesXspDocument に変換します。

于 2013-04-18T09:43:19.013 に答える
2

本質的にこれは不可能です。

sessionAsSigner を使用して URL を作成できますが、ユーザーがドキュメントや画像にアクセスしようとすると、未承認の例外が発生します。

データのビューを表示できる唯一の方法は、sessionAsSigner を使用してビューの内容をスコープ変数 (または Bean) に読み込み、ビューの代わりにスコープ変数からデータを参照する繰り返しコントロールを表示することです。

より大きな問題は、なぜこれをやりたいのかということです。Anonymous が問題のデータベースにアクセスできない場合、これには十分な理由があります。別の方法として、匿名アクセスを許可するドキュメント/ビューで $PublicAccess フラグを使用することを検討することもできます。次に、ACL では、Anonymous がパブリック データを読み取ることができる限り、データベースにアクセスできません。

マット

于 2013-04-18T09:06:06.493 に答える