h1. Papéis atrelados à usuários e webcontents
Justificativa:
- Ausência de ferramentas no Liferay para identificar quais são os usuários de um determinado papel (role)
- Dificuldade em encontrar os webcontent que possuem permissão de um determinado papel
Solução
- Feita em velocity com Estrutura e Modelo de Webcontent para nao ter deploy de portlet
- Ambas foram criadas no contexto Global para poder ser incluída em qualquer site
- A busca é feita no site em que o webcontent (com a estrutura e modelo) está sendo executado
- utiliza somente serviços expostos pelo liferay
- não verifica permissão do usuário logado
Como Usar:
- Basta digitar o nome completo do Papel e apertar enter (submeter o formulário)
Informações ténicas:
- A Estrutura possui apenas um campo texto (não indexado) chamado void (ou qq outro nome).
- O modelo tem o seguinte código:
#set ($portletId = $request.theme-display.portlet-display.id)
#set ($roleName = $getterUtil.getString($request.get("parameters").get("roleName")))
<form method="get">
<input type="hidden" name="p_p_id" value="$portletId">
<label class="aui-field-label" for="roleName"> Role:
<span class="taglib-icon-help">
<img alt="" aria-labelledby="kzka" onblur="Liferay.Portal.ToolTip.hide();" onfocus="Liferay.Portal.ToolTip.show(this);" onmouseover="Liferay.Portal.ToolTip.show(this);" src="http://portal-d.tjsc.jus.br/portal-servidor-theme/images/portlet/help.png" tabindex="0">
<span class="aui-helper-hidden-accessible tooltip-text" id="kzka">
Digite o nome completo das roles separadas por ponto e vírgula sem espaço entre elas</span></span>
</label>
<input name="roleName" id="roleName" class="aui-field-input aui-field-input-text" style="width: 100%;" value="$roleName">
</form><BR>
#set($roleLocalService = $serviceLocator.findService("com.liferay.portal.service.RoleLocalService"))
#set ($companyId = $getterUtil.getLong($companyId))
#set ($groupId = $getterUtil.getLong($groupId))
#set($userLocalService = $serviceLocator.findService("com.liferay.portal.service.UserLocalService"))
#set($userGroupRoleLocalService = $serviceLocator.findService("com.liferay.portal.service.UserGroupRoleLocalService"))
#set($resourcePermissionLocalService = $serviceLocator.findService("com.liferay.portal.service.ResourcePermissionLocalService"))
#set($journalArticleLocalService = $serviceLocator.findService("com.liferay.portlet.journal.service.JournalArticleLocalService"))
#foreach($role in $roleName.split(";"))
#set($role_u1 = "")
#set($role_u1_id = 0)
#set($role_u1 = $roleLocalService.getRole($companyId, $role))
#set($role_u1_id = $role_u1.getRoleId())
#if (!($role_u1_id > 1))
Role <b>$role</b> não encontrada<BR>
#else
Role <b>$role</b> (id $role_u1_id) encontrada:<BR>
#set($usersInRole = "")
#set($siteUserGroupRoles = "")
#set($siteUserGroupRoles = $userGroupRoleLocalService.getUserGroupRolesByGroupAndRole($groupId, $role_u1_id))
#if ($siteUserGroupRoles.size() > 0) ##site role
Total de usuarios: $siteUserGroupRoles.size()<br>
#foreach($userGroupRole in $siteUserGroupRoles)
#set($usr = $userGroupRole.getUser())
- $usr.getFullName()<BR>
#end
#else ##organization role
Global Role detected!<BR>
#set($siteUserGroupRoles = "")
#set($users = $userLocalService.getRoleUsers($role_u1_id))
Total de usuarios: $users.size()<br>
#foreach($usr in $users)
- $usr.getFullName()<BR>
#end
#end
#set($resources = $resourcePermissionLocalService.getRoleResourcePermissions($role_u1_id))
Total de objetos (incluindo web contents): $resources.size()<br>
Lista de Web Contents:<BR>
#foreach($rscr in $resources)
#if ($rscr.getName()=="com.liferay.portlet.journal.model.JournalArticle" && $rscr.getPrimKey()!=$companyId)
#set ($artPrimKey = $getterUtil.getLong($rscr.getPrimKey()))
#set($ja = $journalArticleLocalService.getLatestArticle($artPrimKey))
- $artPrimKey - <a href="$ja.getUrlTitle()">$ja.getTitle($ja.getDefaultLocale())</a><BR>
#end
#end
#end
<hr>
#end
Pontos de Atenção:
- Não é possível "esconder" (retirar as permissões) de todos pois alguns papéis tem direito de ver qualquer webcontent e/ou qualquer publicador de conteudo web. É bom estar atento mas não há nenhuma criticidade em mostrar quais usuários possuem quais papéis
Melhorias futuras:
- exibir link com URL da página em que o webcontent está
- numa versao futura poderia haver seleção do site ou buscar em todos, assim seria possível buscar por qualquer role a partir de qualquer site.
segunda-feira, 27 de julho de 2015
sexta-feira, 16 de janeiro de 2015
Passando o Pool de Conexões de Banco de Dados do Liferay 6.1 e para o Tomcat 7
Em teoria, a única diferença entre ter um container gerenciador do pool de conexões com o banco de dados ao invés de tê-lo na aplicação é ter possibilidade de monitorar a carga do pool usando interfaces padrão (JBoss console, ou visualVM). Dessa forma o administrador da aplicação pode avaliar e tomar decisão de aumentar o pool, caso necessário. Outra vantagem é poder trocar de servidor de banco de dados (Oracle para MySQL, por exemplo). A desvantagem é que se você usa spring, você vai ter mais trabalho para configurar testes do data source JNDI na suas unit tests (veja aqui)
Utilizamos a mesma classe (com.mchange.v2.c3p0.ComboPooledDataSource) que o liferay utiliza porém sem a customização que Liferay faz para incluir logs e já notamos alguma melhora na performance. Há outros gerenciadores de pool de conexões JNDI mas não chegamos a fazer testes com nenhum deles.
Para remover pool de conexões do Liferay 6.1 e passar para o Tomcat precisamos:
1) Parar o Liferay
2) Criar (ou editar caso já exista) o arquivo
liferay/apache-tomcat-7.x.xx/conf/Catalina/localhost/ROOT.xml
(não se se faz diferença, mas ROOT.xml maiúsculo!)
3) Editar o arquivo portal-ext.properties
- comentar os parâmetros:
#jdbc.default.driverClassName
#jdbc.default.url
#jdbc.default.username
#jdbc.default.password
- incluir o parâmetro
jdbc.default.jndi.name=jdbc/liferayPool
Note que o jndi.name é o mesmo nome dado no Resource do arquivo ROOT.xml
5) Iniciar o Liferay
Saravá!
Mais informações nas documentações oficiais:
http://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html
http://tomcat.apache.org/tomcat-7.0-doc/jndi-resources-howto.html
http://tomcat.apache.org/tomcat-7.0-doc/jndi-datasource-examples-howto.html
http://www.mchange.com/projects/c3p0/
Dicas extras:
http://javaguru.fi/blog/-/blogs/configuring-c3p0-connection-pool-for-liferay-on-tomcat
https://www.liferay.com/pt/web/pmesotten/blog/-/blogs/database-connection-pool-sharing-between-portal-and-portlets
http://www.tomcatexpert.com/blog/2010/04/01/configuring-jdbc-pool-high-concurrency
Utilizamos a mesma classe (com.mchange.v2.c3p0.ComboPooledDataSource) que o liferay utiliza porém sem a customização que Liferay faz para incluir logs e já notamos alguma melhora na performance. Há outros gerenciadores de pool de conexões JNDI mas não chegamos a fazer testes com nenhum deles.
Para remover pool de conexões do Liferay 6.1 e passar para o Tomcat precisamos:
1) Parar o Liferay
2) Criar (ou editar caso já exista) o arquivo
liferay/apache-tomcat-7.x.xx/conf/Catalina/localhost/ROOT.xml
(não se se faz diferença, mas ROOT.xml maiúsculo!)
<Context path="" crossContext="true"> <Resource name="jdbc/liferayPool" auth="Container" type="com.mchange.v2.c3p0.ComboPooledDataSource" maxPoolSize="100" minPoolSize="10" acquireIncrement="5" initialPoolSize="20" maxIdleTimeExcessConnections="3600" idleConnectionTestPeriod="180" debugUnreturnedConnectionStackTraces="true" unreturnedConnectionTimeout="300" factory="org.apache.naming.factory.BeanFactory" description="Liferay JNDI Pool" user="user" password="password" driverClass="oracle.jdbc.driver.OracleDriver" jdbcUrl="jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=host)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=service_name)))"/> </Context>
3) Editar o arquivo portal-ext.properties
- comentar os parâmetros:
#jdbc.default.driverClassName
#jdbc.default.url
#jdbc.default.username
#jdbc.default.password
- incluir o parâmetro
jdbc.default.jndi.name=jdbc/liferayPool
Note que o jndi.name é o mesmo nome dado no Resource do arquivo ROOT.xml
5) Iniciar o Liferay
Saravá!
Mais informações nas documentações oficiais:
http://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html
http://tomcat.apache.org/tomcat-7.0-doc/jndi-resources-howto.html
http://tomcat.apache.org/tomcat-7.0-doc/jndi-datasource-examples-howto.html
http://www.mchange.com/projects/c3p0/
Dicas extras:
http://javaguru.fi/blog/-/blogs/configuring-c3p0-connection-pool-for-liferay-on-tomcat
https://www.liferay.com/pt/web/pmesotten/blog/-/blogs/database-connection-pool-sharing-between-portal-and-portlets
http://www.tomcatexpert.com/blog/2010/04/01/configuring-jdbc-pool-high-concurrency
Assinar:
Comentários (Atom)