Início > CMS, Programação > Como Negar Atualização de Conteúdo em um Web Content do Liferay

Como Negar Atualização de Conteúdo em um Web Content do Liferay

Nosso portal utiliza web contents para apresentar imagens, textos e links. Frequentemente precisamos alterar conteúdos em virtude de demandas internas. Pretendíamos delegar parte do gerenciamente de conteúdo para um perfil de usuário (Role), mas encontramos uma limitação no Liferay 6.0: ao delegar a permissão de atualização de conteúdo a uma Role, o usuário que a possui pode alterar o conteúdo de qualquer portlet web content existente no portal!

Como o Liferay concede aquela permissão para todos os web contents, minha linha de desenvolvimento visava não alterar essa característica do Liferay, mas sim possibilitar a negação de atualização de conteúdo em alguns portlets utilizando suas próprias interfaces administrativas.

Cada permissão que uma Role possui é tratada como uma action. A idéia é definir uma nova action que será setada pelo Administrador via configurações do web content para negar edição de conteúdo a uma Role. Para alcançar esse resulatado, precisei criar hooks para dois arquivos jsp e adicionar algumas configurações no próprio .war do Liferay em seu diretório de deploy no servlet container.

Configurações

No diretório {SERVLET_CONTAINER_DEPLOY_DIR}/ROOT.war/WEB-INF/classes/, crie uma pasta chamada resource-actions e dentro dessa pasta crie um arquivo chamado default-ext.xml:

<?xml version="1.0"?>
<!DOCTYPE resource-action-mapping PUBLIC 
"-//Liferay//DTD Resource Action Mapping 6.0.0//EN"
"http://www.liferay.com/dtd/liferay-resource-action-mapping_6_0_0.dtd">

<resource-action-mapping>
	<portlet-resource>
		<portlet-name>15</portlet-name>
		<permissions>
			<supports>
				<action-key>NEGAR_ATUALIZACAO</action-key>
			</supports>
			<community-defaults>
				<action-key>VIEW</action-key>
			</community-defaults>
			<guest-defaults>
				<action-key>VIEW</action-key>
			</guest-defaults>
			<guest-unsupported>
				<action-key>ACCESS_IN_CONTROL_PANEL</action-key>
				<action-key>CONFIGURATION</action-key>
				<action-key>NEGAR_ATUALIZACAO</action-key>
			</guest-unsupported>
		</permissions>
	</portlet-resource>
	<portlet-resource>
		<portlet-name>56</portlet-name>
		<permissions>
			<supports>
				<action-key>NEGAR_ATUALIZACAO</action-key>
			</supports>
			<community-defaults>
				<action-key>VIEW</action-key>
			</community-defaults>
			<guest-defaults>
				<action-key>VIEW</action-key>
			</guest-defaults>
			<guest-unsupported>
				<action-key>CONFIGURATION</action-key>
				<action-key>NEGAR_ATUALIZACAO</action-key>
			</guest-unsupported>
		</permissions>
	</portlet-resource>
</resource-action-mapping>

Note a existência de uma action chamada NEGAR_ATUALIZACAO que está disponível para os portlets 15 (web content da interface administrativa) e para o portlet 56 (qualquer outro web content), mas não está disponível se o usuário for o guest.

Em seguida, inclua ou altere a propriedade “resource.actions.configs” do arquivo portal-ext.properties como segue:

resource.actions.configs=resource-actions/default.xml,resource-actions/default-ext.xml

Dessa forma, o arquivo de permissões padrão default.xml e o arquivo customizado com a nova action default-ext.xml serão carregados em memória.

Hooks

É no hook que vamos utilizar a action NEGAR_ATUALIZACAO definida anteriormente. É necessário criar um projeto hook para customizar dois arquivos jsp:

1. portlet/portlet_configuration/edit_permissions_algorithm_5_to_6.jsp
2. portlet/journal_content/view.jsp

O arquivo (1) redefine a aba de permissões da tela de configurações do web content. Note que uma nova coluna com checkboxes chamada “NEGAR_ATUALIZACAO” foi apresentada. Precisamos verificar programaticamente se um checkbox deve ser apresentado marcado ou desmarcado para uma dada Role. Procure a linha que contém o loop:

for (String action : actions)

Dentro do loop, encontre o seguinte teste:

if (action.equals(ActionKeys.ACCESS_IN_CONTROL_PANEL))
	disabled = true;

Após essa linha, insira um novo teste:

if(action.equals("NEGAR_ATUALIZACAO"))
	disabled = true;

Se você quizer, pode internacionalizar o cabeçalho da nova coluna criando um hook para o arquivo de internacionalização e definindo nele a seguinte propriedade:

action.NEGAR_ATUALIZACAO=Negar

O arquivo (2) define a apresentação do portlet quando em modo view. Vamos alterá-lo para exibir o botão de edição de conteúdo apenas se a Role do usuário corrente não contiver a action “NEGAR_ATUALIZACAO” marcada para aquele portlet. Procure pelo loop:

for ( Role role : user.getRoles() )

Insira as linhas abaixo logo após o final do conteúdo do loop:

List<String> currentActions = new ArrayList<String>();

currentActions.addAll(currentIndividualActions);
currentActions.addAll(currentGroupActions);
	
boolean cannotUpdateCurrentPortlet = currentActions.contains("NEGAR_ATUALIZACAO");
	
if( !userAdmin && cannotUpdateCurrentPortlet ){
	showEditArticleIcon = false;

Utilização

Basta que um usuário Administrador abra as configurações do web content e clique no checkbox da coluna “Negar” para uma Role específica para que o botão de edição do web content não seja apresentado para os usuários com aquela Role.

Anúncios
  1. Nenhum comentário ainda.
  1. No trackbacks yet.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: