2012-03-12 25 views
6

を制限するには、Ploneの4:インストールPloneの4.xではで公開されたコンテンツ

  1. 公開されたコンテンツは、プライベートコンテンツがためのメニューと検索で表示させることも、特定のユーザー/グループに制限または
  2. することができますいずれかログインしていないユーザーですか?

は、私は、特定のユーザー/グループが表示できるコンテンツを持つことができることを望んでいる顧客を持っていますが、ログインしていないときに、メニューや検索に表示されます。

何だろうこの機能を達成するための最善のアプローチですか?あなたは以下のようにワークフローをカスタマイズする必要があります

+0

メニューや検索で「プライベート」コンテンツがリンクされていますか?もしそうなら、匿名ユーザーがこれらのリンクを訪問するとどうなりますか? –

+0

「プライベート」コンテンツは、管理者または割り当てられたユーザーまたはグループにのみ表示されます。匿名ユーザーがリンクを訪問すると、期待どおりにログインページにリダイレクトされます。私の目標は、メニューと検索で表示されるコンテンツを持つ方法を見つけることですが、ページやフォルダを訪れたときにログインするようにリダイレクトします。 –

答えて

7

  • Zopeの管理Interface-に行く>は新しい状態を作成し、カスタマイズができ、これはオプションである(のは「トレーラー」を言わせ
  • をportal_workflow代わりに既存の状態...プライベート状態が特定のユーザー/グループの制限を処理するための良いオプションになる可能性があります)
  • 特定の状態の匿名ユーザーから "アクセスするコンテンツ情報"以外のすべてのアクセス許可を削除します。
  • プッシュ「セキュリティの更新」ボタン」

完了! "Trailer"状態のすべてのコンテンツは検索可能ですが、匿名ユーザーは表示できません。

注:新しい状態を作成する場合は、必要なすべての遷移も必ず追加してください。

編集

は、残念ながら、私は最近のPloneのバージョンでは、それが使用されるように動作するように上記のプロセスを妨げるportal_catalog(allowedRolesAndUsers)で新しいインデックスがあることを認識していませんでした。上記のプロセスは正しいですが、デフォルトのインデクサーをオーバーライドする必要があります。 最初にcreate a new package with paster "plone"テンプレートを使用します。そして、パッケージのメインレベル(例えばmy.package /私/パッケージ)に追加したファイルはこれでindexers.pyと呼ば:

from zope.interface import Interface 
from plone.indexer.decorator import indexer 
from AccessControl.PermissionRole import rolesForPermissionOn 
from Products.CMFCore.utils import getToolByName 
from Products.CMFCore.CatalogTool import _mergedLocalRoles 

@indexer(Interface) 
def allowedRolesAndUsers(obj): 
    """Return a list of roles and users with View permission. 

    Used by PortalCatalog to filter out items you're not allowed to see. 
    """ 
    allowed = {} 
    for r in rolesForPermissionOn('Access contents information', obj): 
     allowed[r] = 1 
    # shortcut roles and only index the most basic system role if the object 
    # is viewable by either of those 
    if 'Anonymous' in allowed: 
     return ['Anonymous'] 
    elif 'Authenticated' in allowed: 
     return ['Authenticated'] 
    localroles = {} 
    try: 
     acl_users = getToolByName(obj, 'acl_users', None) 
     if acl_users is not None: 
      localroles = acl_users._getAllLocalRoles(obj) 
    except AttributeError: 
     localroles = _mergedLocalRoles(obj) 
    for user, roles in localroles.items(): 
     for role in roles: 
      if role in allowed: 
       allowed['user:' + user] = 1 
    if 'Owner' in allowed: 
     del allowed['Owner'] 
    return list(allowed.keys()) 

し、同じレベルでのファイルこれでoverrides.zcml追加:

<configure xmlns="http://namespaces.zope.org/zope"> 

    <adapter factory=".indexers.allowedRolesAndUsers" name="allowedRolesAndUsers" /> 

</configure> 
を最後に

製品のツリーは次のようになります。

my.package/ 
├── my 
│   ├── __init__.py 
│   └── package 
│    ├── configure.zcml 
│  ├── overrides.zcml 
│  ├── indexers.py 
│    ├── __init__.py 
│    ├── profiles 
│    │   └── default 
│    │    └── metadata.xml 
│    └── tests.py 
├── README.txt 
├── setup.cfg 
└── setup.py 

最後のものは、あなたがあなたのbuildout.cfgで、新しく作成された卵を含める必要があります。

eggs = 
     my.package 

develop = 
     src/my.package 

再構築ビルド。それで全部です。

+0

私はPlone 4.1.2を実行しています。 'Access contents information'は、メニューや検索に表示されている項目に影響しないようです。 「表示」権限をチェックしたときにのみ、メニューまたは検索結果に表示されます。私は自分の状態を変更するだけでなく、プライベート状態を変更し、匿名ユーザーのために 'Access contents information'をチェックしています –

+0

この事実を無視してください:Giacomoは言ったように常に "Access Contents information"を "View" ユニークな許可として考えてください! –

+0

@keul Viewを確認する必要があると言われるようです。それがあなたが言っていることであれば、公表されたのと同じタイプの国家が作られますが、これは目標を達成できません。私はあなたを誤解している可能性があります。 –

関連する問題