terça-feira, 28 de julho de 2015

Como usar autenticação basic e form em uma aplicação Grails com Spring Security

No Grails é possível usar duas formas de autenticação em uma aplicação. Só é preciso definir um path separado para que o Spring Security possa tratar diferentemente. No meu caso, eu quero que um controller responda a solicitação via autenticação FORM caso venha de um acesso web e responda a solicitação via autenticação BASIC caso seja uma chamada de uma API.

Primeiro temos um controller Grails qualquer. Estou mantendo apenas um action a titulo de exemplo:

@Secured(["hasAnyRole('ROLE_PESSOA','ROLE_ADMIN')"])
@Transactional(readOnly = true)
class PessoaController {

 static allowedMethods = [save: "POST", update: "PUT", delete: "DELETE"]

    def index(Integer max) {
        params.max = Math.min(max ?: 50, 100)

  def list = quickSearchService.search(domainClass: Pessoa, searchParams: params,
   searchProperties: searchProperties, query: params.q, customCriteria: customCriteria)
  
        respond list, model:[pessoaInstanceCount: list.totalCount]
    }

}

Esse controller já responde tanto a solicitações HTML quanto JSON. Ex.:
Para HTML:
http://localhost:8080/aplicacao/pessoa/index
Para JSON:
http://localhost:8080/aplicacao/pessoa/index.json

Agora vamos precisar que este controller responda em um segundo endereço que, por sua vez, será configurado para usar autenticação BASIC. Para isso, basta herdar do primeiro colocando o novo controller em um namespace e package diferente.

@Secured(["hasAnyRole('ROLE_PESSOA_API','ROLE_ADMIN')"])
class PessoaController extends br.com.lesteti.PessoaController {
    static scaffold = false
    static namespace = "api"
}

Neste momento, o segundo controller tem as mesmas funcionalidades do primeiro porém responde em um outro endereço por causa da definição do namespace e tem acesso por outra role (ROLE_PESSOA_API).
Para HTML:
http://localhost:8080/api/aplicacao/pessoa/index
Para JSON:
http://localhost:8080/api/aplicacao/pessoa/index.json

Agora falta somente configurar o spring security para que os endereços que contenham /api/ sejam seguros com autenticação BASIC. Altere o Config.groovy adicionando os itens abaixo logo depois da sua configuração normal do Spring Security.

grails.plugin.springsecurity.useBasicAuth = true
grails.plugin.springsecurity.basic.realmName = "LTI"
grails.plugin.springsecurity.filterChain.chainMap = [
        '/api/**': 'JOINED_FILTERS,-exceptionTranslationFilter',
        '/**': 'JOINED_FILTERS,-basicAuthenticationFilter,-basicExceptionTranslationFilter'
]

terça-feira, 14 de julho de 2015

Acessar MySQL via Tomcat no Ubuntu 14.04

Houve uma mudança na organização dos diretórios do Tomcat no Ubuntu 14.04. A melhor forma de incluir o driver jdbc do MySQL é a seguinte:

1. Baixe o driver jdbc MySQL. Aqui eu suponho que o Tomcat já esteja instalado.
sudo apt-get install libmysql-java

2. Crie um link do driver para a pasta lib do Tomcat. Essa pasta mudou de lugar nesta nova versão.
root@nnnnnn:/usr/share/tomcat7/lib# ln -s /usr/share/java/mysql.jar

É isso.

sexta-feira, 25 de julho de 2014

Memória do Tomcat no Amazon Linux

Desde sempre eu consegui alterar a memória do Tomcat no Linux alterando o arquivo catalina.sh, mas quando tentei fazer isso no AMI (Amazon Linux), para minha surpresa, esse arquivo não existia. A solução está em fazer o seguinte:

# instalar o Tomcat
sudo yum install tomcat7

# alterar tomcat7.conf
sudo nano /etc/tomcat7/tomcat7.conf

# adicionar a seguinte linha no arquivo
JAVA_OPTS="-Xms256m -Xmx1024m -XX:MaxPermSize=256m -server"

Provavelmente já haverá uma linha semelhante comentada. Basta descomentar e alterar.

# reiniciar o Tomcat
sudo service tomcat7 restart

Se o aplicativo manager estiver instalado e acessível é possível enxergar a mudança na opção Server Status. Lá mostra quanto de memória está reservada.

Neste caso estou reservando 1GB de memória máxima para o Java, mas vai depender do total de memória do servidor.

quinta-feira, 24 de outubro de 2013

Configurando o Sendmail para uso com o Jobsworth (ClockingIT)

O Sendmail é um sistema envio e recebimento de e-mail que pode ser usado em conjunto com com o Jobsworth. Os e-mails podem ser utilizados de duas formas. A primeira, quando o sistema envia alertas de novas atividades ou andamento em atividades já existentes. A segunda, quando o usuário responde ao e-mail de alerta enviado pelo sistema e esta resposta é automaticamente anexada aos andamentos da atividade correspondente.

Envio
Para configurar o Sendmail para envio de e-mails no Ubuntu 12.04:
1. Simplesmente instale o Sendmail
sudo apt-get install sendmail

e pronto! Você já pode enviar e-mails!

2. Supondo que o sendmail está instalado no mesmo servidor em que está a aplicação, configure o context.xml para usar localhost como SMTP.
  <!-- Jobsworth SMTP settings -->
  <Parameter name="config.smtp_host" value="localhost" override="false"/>
  <Parameter name="config.smtp_port" value="25" override="false"/>
  <Parameter name="config.smtp_domain" value="seudominio.com.br" override="false"/>


Crie uma nova tarefa e veja se chegou o e-mail de alerta do Jobsworth.

Recebimento
A configuração para recebimento de e-mails é um pouco mais complicada pois o Sendmail vai redirecionar os e-mails recebidos para um script do Linux. O sistema sabe a que atividade associar o e-mail que chegou porque o destinatário contém o código da mesma. Por exemplo:
task-1234@jobs.seudominio.com.br
[Aqui, jobs é o subdomínio definido no cadastro da empresa, na tabela ´companies´]

Vamos lá:
1. Instale o Sendmail. Se não estiver instalado, veja as instruções acima em "Envio".
2. Adicione o domínio em /etc/mail/local-host-names
jobs.seudominio.com.br

3. Adicione uma entrada em /etc/mail/aliases para associar um alias a um script.
jobsworth: "|/usr/local/share/jobsworth/mail_script.sh"

4. Adicione uma entrada em /etc/mail/virtusertable para direcionar os e-mails que chegam no nosso subdomínio para o alias criado acima. Possivelmente esse arquivo precisará ser criado.
@jobs.seudominio.com.br    jobsworth

5. Crie o script /usr/local/share/jobsworth/mail_script.sh que vai tratar de encaminhar o e-mail para uma chamada ao Jobsworth. A variável SECRET deve ser setada em ${TOMCAT_HOME}/context.xml e a variável URL deve conter o endereço do servidor.
#!/bin/sh
SECRET=password1234
URL=https://jobs.seudominio.com.br/emails
cat $2 | /usr/local/bin/curl -s -k --data-urlencode secret=${SECRET} --data-urlencode email@- ${URL}

6. Por segurança, a configuração padrão do Sendmail não envia e-mails. É preciso habilitá-lo para que o faça. Adicione o seguinte em /etc/mail/sendmail.mc
DAEMON_OPTIONS(`Family=inet,  Name=MTA-v4, Port=smtp, Addr=seu_ip_aqui')dnl

7. Por padrão, o Sendmail também não vem com virtusertable habilitado. Adicione o seguinte em /etc/mail/sendmail.mc
FEATURE(`virtusertable')dnl

Isso é suficiente para receber e-mails pelo Sendmail. Você pode fazer um teste com
telnet jobs.seudominio.com.br 25
Se aparecer algo parecido com
Connected to localhost.
Escape character is '^]'.
220 jobs.seudominio.com.br ESMTP Sendmail 8.12.8/8.12.8; Sun, 30 Nov 2003 13:19:45 +1300
seu servidor estará configurado corretamente.

Agora responda a um e-mail enviado pelo Jobsworth e veja se o corpo do e-mail aparece na lista de comentários da tarefa.

quinta-feira, 17 de outubro de 2013

Configurando o Apache como proxy reverso

A situação é a seguinte: eu tenho um web server Tomcat que roda na porta 8080 e quero expor a aplicação que roda lá sem que o usuário final tenha que digitar o :8080 no endereço.

A forma mais fácil e direta de fazer isso é alterando o conf/server.xml do Tomcat para que ele rode na porta 80. No entanto, a forma mais flexível e segura é configurando um proxy reverso - no nosso caso o Apache - para receber as solicitações na porta 80 e encaminhá-las para o servidor Tomcat. Para o usuário final, isso tudo fica invisível pois, para o browser, só vai existir um servidor web Apache comum na porta 80. Usar o proxy reverso permitirá inclusive criar um cluster de servidores Tomcat respondendo por um endereço só.

Como fazer isso no Ubuntu 12.04:

1. Instale o Apache e o mod_proxy
sudo apt-get install libapache2-mod-proxy-html libxml2-dev

2. Carregue o mod_proxy no Apache
a2enmod proxy_http

3. Abra o arquivo de configuração do Apache para edição
nano /etc/apache2/sites-enabled/000-default

4. Configure o endereço do Tomcat
<VirtualHost *:80>
   ServerAdmin admin@acme.com
   ServerName acme.com
   ServerAlias acme.com
   ProxyPass /nome_da_aplicacao http://servidor:8080/app
   ProxyPassReverse /nome_da_aplicacao  http://servidor:8080/app
</VirtualHost>


Em /nome_da_aplicacao você pode usar apenas / se quiser que ela apareça na raiz do Apache.

5. Reinicie o Apache
service apache2 restart

Pronto. Agora é só chamar a aplicação pelo browser.

terça-feira, 15 de outubro de 2013

Configurando o Jobsworth (ClockingIT)

O sistema de controle de projetos e chamados Jobsworth é um fork do ClockingIT. Desenvolvido em Ruby On Rails, há até bem pouco tempo se necessitava de algum conhecimento das dependências envolvidas na utilização deste framework para a instalação do pacote. A partir da versão 4.0, o Jobsworth traz a opção de usar o Tomcat como servidor web, tornando a instalação bem mais simplificada porque há disponível um arquivo com o sistema e todas as dependências que você precisará.

É neste cenário que montei um passo a passo para começar a utilizar o Jobsworth. Lá vai:

UPDATE FROM



Os usuários de SQL Server estão acostumados com o comando UPDATE FROM que não existe em outros SGBDs. Qual a alternativa ? Siga o exemplo:

Eu tenho uma tabela de produtos e outra tabela de grupos de produto. Se eu quero atualizar em 10% o preço de todos os produtos cuja grupo seja do tipo 1 eu uso o seguinte comando em SQL Server:

UPDATE PRODUTO
SET P.PRECO = P.PRECO * 1.1
FROM PRODUTO P, GRUPO G
WHERE P.ID_GRUPO = G.ID_GRUPO
AND G.TIPO = 1

No Oracle o UPDATE FROM não existe. Usa-se o seguinte:
UPDATE PRODUTO P
SET P.PRECO = P.PRECO * 1.1
WHERE EXISTS (SELECT *
FROM GRUPO G
WHERE G.ID_GRUPO = P.ID_GRUPO
AND G.TIPO = 1)