ユーザーが属するユーザーグループに応じて、ダイアログタブパネルを非表示または表示する方法はありますか?
私はCRXコンテンツエクスプローラー(ACL)を介してこれを実行しようとしました。しかし、私はそれであまり運が良くありません。
乾杯
anthonyhが指摘しているように、ACLアプローチがその方法です(そのような動作が本当に必要な場合)。
たとえば、ベースページコンポーネントの[画像]タブを非表示にするには、次のようにします。
/libs/foundation/components/page/dialog/items/tabs/items/imagedeny jcr:readするauthorインクルードされているタブの場合はxtype=cqinclude、インクルードされた定義ではなく、インクルード自体に設定する必要があることに注意してください。実行時に、インクルードのターゲットが欠落していることについて文句を言い、ダイアログをまったくレンダリングしないためです。
これは、カスタムサーブレットとダイアログイベントリスナーを使用して実行できます。
リスナー関数はサーブレットにリクエストを送信し、現在のユーザーIDと目的のグループを渡します。サーブレットの応答に基づいて、ダイアログタブを非表示にできます。
CQ5コンポーネントのdialog.xmlの例を次に示します。
<?xml version="1.0" encoding="UTF-8"?>
<jcr:root
xmlns:cq="http://www.day.com/jcr/cq/1.0"
xmlns:jcr="http://www.jcp.org/jcr/1.0"
jcr:primaryType="cq:Dialog"
xtype="dialog">
<listeners jcr:primaryType="nt:unstructured"
loadcontent="function(dialog) {
var url = '/bin/member.json';
// check if current user belongs to administrators group
url = CQ.HTTP.addParameter(url, 'userId', CQ.User.getUserID());
url = CQ.HTTP.addParameter(url, 'groupId', 'administrators');
var result = CQ.HTTP.eval(url);
if (!result.isMember) {
// hide "tab2" if user is not an administrator
dialog.findByType('tabpanel')[0].hideTabStripItem(1);
}
}" />
<items jcr:primaryType="cq:WidgetCollection">
<tab1 jcr:primaryType="cq:Widget" title="Text" xtype="panel">
<items jcr:primaryType="cq:WidgetCollection">
...
</items>
</tab1>
<tab2 jcr:primaryType="cq:Widget" title="Image" xtype="panel">
<items jcr:primaryType="cq:WidgetCollection">
...
</items>
</tab2>
</items>
</jcr:root>
対応するサーブレットは次のとおりです。
import java.io.IOException;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Properties;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Service;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.servlets.SlingAllMethodsServlet;
import org.codehaus.jackson.JsonFactory;
import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.JsonGenerator.Feature;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.day.cq.security.Group;
import com.day.cq.security.User;
import com.day.cq.security.UserManager;
import com.google.common.collect.ImmutableMap;
@Component(immediate = true)
@Service
@Properties({
@Property(name = "service.description", value = "Group Member servlet checks if a user is a member of a group."),
@Property(name = "sling.servlet.paths", value = "/bin/member")
})
public class GroupMemberServlet extends SlingAllMethodsServlet {
/** Required. */
private static final long serialVersionUID = 1L;
/** Logger */
private static final Logger LOG = LoggerFactory.getLogger(GroupMemberServlet.class);
private static final JsonFactory FACTORY = new JsonFactory().disable(Feature.AUTO_CLOSE_TARGET);
private static final ObjectMapper MAPPER = new ObjectMapper();
@Override
protected void doGet(final SlingHttpServletRequest request, final SlingHttpServletResponse response) {
final UserManager userManager = request.getResourceResolver().adaptTo(UserManager.class);
final String userId = request.getRequestParameter("userId").getString();
final String groupId = request.getRequestParameter("groupId").getString();
final Group group = (Group) userManager.get(groupId);
final User user = (User) userManager.get(userId);
writeJsonResponse(response, ImmutableMap.of("isMember", group.isMember(user)));
}
private void writeJsonResponse(final SlingHttpServletResponse response, final Object object) {
response.setContentType("application/json");
response.setCharacterEncoding("utf-8");
try {
final JsonGenerator generator = FACTORY.createJsonGenerator(response.getWriter());
MAPPER.writeValue(generator, object);
} catch (final JsonGenerationException jge) {
LOG.error("error generating JSON response", jge);
} catch (final JsonMappingException jme) {
LOG.error("error mapping JSON response", jme);
} catch (final IOException ioe) {
LOG.error("error writing JSON response", ioe);
}
}
}
1つの質問が頭に浮かびます...オーサリングダイアログの制御を制限してタブを削除したいのはなぜですか?
ACLがこのために機能しない理由はありません。タブに対して十分に制限するように設定しましたか?管理者以外のユーザーでテストしましたか?アクセスの問題を解決するために、コードが非常に多いものを使用する場合は注意が必要です。
個人的には、ACLが期待どおりに機能しない場合は、CQ5の1つのバージョンに固有のコードソリューションではなく、タブパネルのxtypeに基づいて新しいウィジェットを作成することを検討します。
私の答え:ACLを使用してください。
これらの漠然と関連する公式文書を見てください-同じ原則ですが異なる目的:
http://dev.day.com/content/kb/home/cq5/CQ5SystemAdministration/CQ53HowToHideCQNavigationButtons.html
と
http://dev.day.com/docs/en/cq/current/administering/security.html