2009-08-03 11 views
1

私はzope 2サイトのセクションに 'content'とサイトワイドマクロの中間マクロを使用しています。私はフォルダにセキュリティを適用したくないですが、それを使用するページを読み込もうとすると、暫定マクロがユーザーをログイン画面にリダイレクトするようにしたいと思います。zopeの特定の役割を簡単にリダイレクトする方法

この例では、このようになります

page_htmlそれはstandard_templateにおけるマクロにspecial_templateマクロ、次いでスロットを使用して、コンテンツを含みます。したがって、私はそれをログイン画面にリダイレクトします。 page_htmlがspecial_templateを使用せず、standard_template(サイトのほとんどのページが行うことです)にまっすぐ行った場合、私はそれをリダイレクトしたくありません。

これをどのように達成できますか?

+0

ことの一つは、このことをした(して明白なことを述べるために私を撮影しない) - これが唯一の匿名ユーザーのために発生する必要があるので、任意の認証された用途には、再ログインする必要はありません – chrism

+0

が関係を次のようにします:http://stackoverflow.com/questions/6948507/if-a-user-doesnt-have-permission-to-render-a-view-configured-on-configure-zcml –

答えて

2

まず、Zopeのアクセス許可で保護できる場所に認証が必要なこれらすべてのページを配置するようにサイトを再構築しないでください。カスタム(ローカル)ワークフローは、Zope自身の自動認証フレームワークを使用して、州ごとおよび場所ごとに権限を適用できます。ワークフローを使用しない場合、カスタムタイプでも、URL空間でその下にあるものによって取得された権限を適用できます。

special_templateから呼び出されるメソッド(スキン層のPythonスクリプト、取得コンテキストのメソッド、外部メソッド、ベストプラクティスの大まかな順序)を作成することができますマクロをtal:defineステートメントを使用して実行します。私はそれを気にしないので、出力をダミー変数に代入します。副作用として使用します。次の例では、Z3ビューの道を行ってきた前提としています。これは、名前redirect_if_anonymousで登録ビューをインスタンス化します

<body tal:define="dummy context/@@redirect_if_anonymous"> 

。このビューでは、アプリケーションに応じて、標準のZope APIメソッドまたはクッキーのテストを使用して、Web訪問者が認証されているかどうかをテストできます。ここに標準のAPIの例があります。ログインを強制するためにUnauthorizedが呼び出されます。

url = self.request['URL0'] + '/login.html' 
self.request.response.redirect(url) 

あなたが最初のクッキーをテストしたい場合は、クッキーはリクエスト変数の一部である:あなたが望むすべてが別の場所へのリダイレクトがある場合

from Products.Five import BrowserView 
from AccessControl import getSecurityManager, Unauthorized 
from AccessControl.SpecialUsers import nobody 

class RedirectAnonymous(BrowserView): 
    def __call__(self): 
     sm = getSecurityManager() 
     user = sm.getUser() 
     if user is None or user is nobody: 
      raise Unauthorized 

、単にのResponse.Redirect()を使用します。私が言及するのを忘れてしまった

if 'mycookie' not in self.request.cookies: 
    self.request.response.redirect(url) 
関連する問題