Commit edecdf07a7240dbf798361f533148eed424bea47

Authored by Cleverson Sacramento
1 parent ce216d26
Exists in master

Melhoria nos filtros de autenticação

impl/core/src/main/resources/demoiselle-core-bundle.properties
@@ -17,112 +17,112 @@ @@ -17,112 +17,112 @@
17 # or write to the Free Software Foundation, Inc., 51 Franklin Street, 17 # or write to the Free Software Foundation, Inc., 51 Franklin Street,
18 # Fifth Floor, Boston, MA 02110-1301, USA. 18 # Fifth Floor, Boston, MA 02110-1301, USA.
19 # ---------------------------------------------------------------------------- 19 # ----------------------------------------------------------------------------
20 -# Este arquivo é parte do Framework Demoiselle. 20 +# Este arquivo \ufffd parte do Framework Demoiselle.
21 # 21 #
22 -# O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou  
23 -# modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação 22 +# O Framework Demoiselle \ufffd um software livre; voc\ufffd pode redistribu\ufffd-lo e/ou
  23 +# modific\ufffd-lo dentro dos termos da GNU LGPL vers\ufffdo 3 como publicada pela Funda\ufffd\ufffdo
24 # do Software Livre (FSF). 24 # do Software Livre (FSF).
25 # 25 #
26 -# Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA  
27 -# GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou  
28 -# APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português 26 +# Este programa \ufffd distribu\ufffddo na esperan\ufffda que possa ser \ufffdtil, mas SEM NENHUMA
  27 +# GARANTIA; sem uma garantia impl\ufffdcita de ADEQUA\ufffd\ufffdO a qualquer MERCADO ou
  28 +# APLICA\ufffd\ufffdO EM PARTICULAR. Veja a Licen\ufffda P\ufffdblica Geral GNU/LGPL em portugu\ufffds
29 # para maiores detalhes. 29 # para maiores detalhes.
30 # 30 #
31 -# Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título  
32 -# "LICENCA.txt", junto com esse programa. Se não, acesse <http://www.gnu.org/licenses/>  
33 -# ou escreva para a Fundação do Software Livre (FSF) Inc., 31 +# Voc\ufffd deve ter recebido uma c\ufffdpia da GNU LGPL vers\ufffdo 3, sob o t\ufffdtulo
  32 +# "LICENCA.txt", junto com esse programa. Se n\ufffdo, acesse <http://www.gnu.org/licenses/>
  33 +# ou escreva para a Funda\ufffd\ufffdo do Software Livre (FSF) Inc.,
34 # 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. 34 # 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA.
35 35
36 version=${project.version} 36 version=${project.version}
37 -engine-on=Iniciando o Demoiselle Framework ${project.version}  
38 -resource-not-found=Arquivo {0} n\u00E3o foi encontrado  
39 -key-not-found=A chave {0} n\u00E3o foi encontrada  
40 -ambiguous-strategy-resolution=Foi detectada ambiguidade da interface {0} com as seguintes implementa\u00E7\u00F5es\: {1}. Para resolver o conflito, defina explicitamente a implementa\u00E7\u00E3o no demoiselle.properties.  
41 -ambiguous-bean-resolution=Falha ao obter {0} pois foi detectada ambiguidade nas seguintes implementa\u00E7\u00F5es\: {1}  
42 -bean-not-found=Voc\u00EA est\u00E1 tentando obter um objeto n\u00E3o reconhecido pelo CDI via Beans.getReference({0})  
43 -store-not-found=O objeto do tipo [{0}] n\u00E3o pode ser armazenado no escopo indicado\: {1}  
44 -more-than-one-exceptionhandler-defined-for-same-class=Foi definido mais de um m\u00E9todo na classe {0} para tratar a exce\u00E7\u00E3o {1}  
45 -handling-exception=Tratando a exce\u00E7\u00E3o {0} 37 +engine-on=Iniciando o Demoiselle Framework ${project.version} (Malkovich)
  38 +resource-not-found=Arquivo {0} n\u00e3o foi encontrado
  39 +key-not-found=A chave {0} n\u00e3o foi encontrada
  40 +ambiguous-strategy-resolution=Foi detectada ambiguidade da interface {0} com as seguintes implementa\u00e7\u00f5es\: {1}. Para resolver o conflito, defina explicitamente a implementa\u00e7\u00e3o no demoiselle.properties.
  41 +ambiguous-bean-resolution=Falha ao obter {0} pois foi detectada ambiguidade nas seguintes implementa\u00e7\u00f5es\: {1}
  42 +bean-not-found=Voc\u00ea est\u00e1 tentando obter um objeto n\u00e3o reconhecido pelo CDI via Beans.getReference({0})
  43 +store-not-found=O objeto do tipo [{0}] n\u00e3o pode ser armazenado no escopo indicado\: {1}
  44 +more-than-one-exceptionhandler-defined-for-same-class=Foi definido mais de um m\u00e9todo na classe {0} para tratar a exce\u00e7\u00e3o {1}
  45 +handling-exception=Tratando a exce\u00e7\u00e3o {0}
46 taking-off=O Demoiselle ${project.version} decolou 46 taking-off=O Demoiselle ${project.version} decolou
47 engine-off=Desligando os motores do Demoiselle ${project.version} 47 engine-off=Desligando os motores do Demoiselle ${project.version}
48 -setting-up-bean-manager=BeanManager dispon\u00EDvel atrav\u00E9s do utilit\u00E1rio {0} 48 +setting-up-bean-manager=BeanManager dispon\u00edvel atrav\u00e9s do utilit\u00e1rio {0}
49 49
50 -user-transaction-lookup-fail=N\u00E3o foi encontrada nenhuma transa\u00E7\u00E3o com o nome {0} no contexto JNDI  
51 -transactional-execution=Execu\u00E7\u00E3o transacional de {0}  
52 -begin-transaction=Transa\u00E7\u00E3o iniciada  
53 -transaction-marked-rollback=Transa\u00E7\u00E3o marcada para rollback [{0}]  
54 -transaction-already-finalized=A transa\u00E7\u00E3o j\u00E1 havia sido finalizada  
55 -transaction-commited=Transa\u00E7\u00E3o finalizada com sucesso  
56 -transaction-rolledback=Transa\u00E7\u00E3o finalizada com rollback 50 +user-transaction-lookup-fail=N\u00e3o foi encontrada nenhuma transa\u00e7\u00e3o com o nome {0} no contexto JNDI
  51 +transactional-execution=Execu\u00e7\u00e3o transacional de {0}
  52 +begin-transaction=Transa\u00e7\u00e3o iniciada
  53 +transaction-marked-rollback=Transa\u00e7\u00e3o marcada para rollback [{0}]
  54 +transaction-already-finalized=A transa\u00e7\u00e3o j\u00e1 havia sido finalizada
  55 +transaction-commited=Transa\u00e7\u00e3o finalizada com sucesso
  56 +transaction-rolledback=Transa\u00e7\u00e3o finalizada com rollback
57 57
58 bootstrap.configuration.processing=Processando {0} 58 bootstrap.configuration.processing=Processando {0}
59 -bootstrap-context-already-managed=O contexto {0} para o escopo {1} j\u00E1 foi adicionado 59 +bootstrap-context-already-managed=O contexto {0} para o escopo {1} j\u00e1 foi adicionado
60 bootstrap-context-added=Adicionando o contexto {0} para o escopo {1} 60 bootstrap-context-added=Adicionando o contexto {0} para o escopo {1}
61 61
62 -loading-configuration-class=Carregando a classe de configura\u00E7\u00E3o {0} 62 +loading-configuration-class=Carregando a classe de configura\u00e7\u00e3o {0}
63 configuration-field-loaded={0}: {2} 63 configuration-field-loaded={0}: {2}
64 -configuration-attribute-is-mandatory=A configura\u00E7\u00E3o {0} \u00E9 obrigat\u00F3ria, mas n\u00E3o foi encontrada em {1}  
65 -configuration-name-attribute-cant-be-empty=A nota\u00E7\u00E3o @Name n\u00E3o pode estar em branco  
66 -configuration-generic-extraction-error=Ocorreu um erro durante a extra\u00E7\u00E3o do tipo {0} com o extrator {1}  
67 -configuration-dot-after-prefix=N\u00E3o \u00E9 necess\u00E1rio adicionar o ponto ap\u00F3s o prefixo para uma classe de configura\u00E7\u00E3o. \u00C9 recomendado que sejam retirados, pois poder\u00E3o causar erros em vers\u00F5es futuras do Framework.  
68 -configuration-key-not-found={0}\: [n\u00E3o encontrada]  
69 -configuration-extractor-not-found=N\u00E3o foi poss\u00EDvel encontrar a classe extratora para o atributo {0}. Implemente a interface {1} para criar sua classe extratora.  
70 -configuration-not-conversion=N\u00E3o \u00E9 poss\u00EDvel converter o valor {0} para o tipo {1} 64 +configuration-attribute-is-mandatory=A configura\u00e7\u00e3o {0} \u00e9 obrigat\u00f3ria, mas n\u00e3o foi encontrada em {1}
  65 +configuration-name-attribute-cant-be-empty=A nota\u00e7\u00e3o @Name n\u00e3o pode estar em branco
  66 +configuration-generic-extraction-error=Ocorreu um erro durante a extra\u00e7\u00e3o do tipo {0} com o extrator {1}
  67 +configuration-dot-after-prefix=N\u00e3o \u00e9 necess\u00e1rio adicionar o ponto ap\u00f3s o prefixo para uma classe de configura\u00e7\u00e3o. \u00c9 recomendado que sejam retirados, pois poder\u00e3o causar erros em vers\u00f5es futuras do Framework.
  68 +configuration-key-not-found={0}\: [n\u00e3o encontrada]
  69 +configuration-extractor-not-found=N\u00e3o foi poss\u00edvel encontrar a classe extratora para o atributo {0}. Implemente a interface {1} para criar sua classe extratora.
  70 +configuration-not-conversion=N\u00e3o \u00e9 poss\u00edvel converter o valor {0} para o tipo {1}
71 71
72 -transaction-not-defined=Nenhuma transa\u00E7\u00E3o foi definida. Para utilizar @{0} \u00E9 preciso definir a propriedade frameworkdemoiselle.transaction.class com a estrat\u00E9gia de transa\u00E7\u00E3o desejada no arquivo demoiselle.properties  
73 -executing-all=Executando m\u00E9todos anotados com @{0}  
74 -custom-context-selected=Produzindo inst\u00E2ncia do contexto {0} 72 +transaction-not-defined=Nenhuma transa\u00e7\u00e3o foi definida. Para utilizar @{0} \u00e9 preciso definir a propriedade frameworkdemoiselle.transaction.class com a estrat\u00e9gia de transa\u00e7\u00e3o desejada no arquivo demoiselle.properties
  73 +executing-all=Executando m\u00e9todos anotados com @{0}
  74 +custom-context-selected=Produzindo inst\u00e2ncia do contexto {0}
75 custom-context-was-activated=O contexto {0} foi ativado para o escopo {1} 75 custom-context-was-activated=O contexto {0} foi ativado para o escopo {1}
76 custom-context-was-deactivated=O contexto {0} foi desativado para o escopo {1} 76 custom-context-was-deactivated=O contexto {0} foi desativado para o escopo {1}
77 -custom-context-already-activated=N\u00E3o foi poss\u00EDvel ativar o contexto {0}, o escopo {1} j\u00E1 est\u00E1 ativo no contexto {2}  
78 -custom-context-not-found=N\u00E3o foi encontrado um contexto gerenciado do tipo [{0}] para o escopo [{1}]  
79 -custom-context-manager-not-initialized=ContextManager n\u00E3o foi inicializado. Chame [initialize] ao capturar o evento [AfterBeanDiscovery] em uma extens\u00E3o CDI 77 +custom-context-already-activated=N\u00e3o foi poss\u00edvel ativar o contexto {0}, o escopo {1} j\u00e1 est\u00e1 ativo no contexto {2}
  78 +custom-context-not-found=N\u00e3o foi encontrado um contexto gerenciado do tipo [{0}] para o escopo [{1}]
  79 +custom-context-manager-not-initialized=ContextManager n\u00e3o foi inicializado. Chame [initialize] ao capturar o evento [AfterBeanDiscovery] em uma extens\u00e3o CDI
80 80
81 error-creating-new-instance-for=Error creating a new instance for "{0}" 81 error-creating-new-instance-for=Error creating a new instance for "{0}"
82 executed-successfully={0} execultado com sucesso 82 executed-successfully={0} execultado com sucesso
83 -must-declare-one-single-parameter=Voc\u00EA deve declarar um par\u00E2metro \u00FAnico em {0}  
84 -loading-default-transaction-manager=Carregando o gerenciador de transa\u00E7\u00E3o padr\u00E3o {0}  
85 -results-count-greater-page-size=Quantidade de resultados {0} \u00E9 maior que o tamanho da p\u00E1gina {1}  
86 -page-result=Resultado paginado [p\u00E1gina\={0}, total de resultados\={1}]  
87 -page=P\u00E1gina [n\u00FAmero\={0}, tamanho\={1}] 83 +must-declare-one-single-parameter=Voc\u00ea deve declarar um par\u00e2metro \u00fanico em {0}
  84 +loading-default-transaction-manager=Carregando o gerenciador de transa\u00e7\u00e3o padr\u00e3o {0}
  85 +results-count-greater-page-size=Quantidade de resultados {0} \u00e9 maior que o tamanho da p\u00e1gina {1}
  86 +page-result=Resultado paginado [p\u00e1gina\={0}, total de resultados\={1}]
  87 +page=P\u00e1gina [n\u00famero\={0}, tamanho\={1}]
88 processing=Processando\: {0} 88 processing=Processando\: {0}
89 -processing-fail=Falha no processamento devido a uma exce\u00E7\u00E3o lan\u00E7ada pela aplica\u00E7\u00E3o 89 +processing-fail=Falha no processamento devido a uma exce\u00e7\u00e3o lan\u00e7ada pela aplica\u00e7\u00e3o
90 for= \ para\: 90 for= \ para\:
91 -file-not-found=O arquivo {0} n\u00E3o foi encontrado 91 +file-not-found=O arquivo {0} n\u00e3o foi encontrado
92 92
93 adding-message-to-context=Adicionando uma mensagem no contexto: [{0}] 93 adding-message-to-context=Adicionando uma mensagem no contexto: [{0}]
94 -access-checking=Verificando permiss\u00E3o do usu\u00E1rio {0} para executar a a\u00E7\u00E3o {1} no recurso {2}  
95 -access-allowed=O usu\u00E1rio {0} acessou o recurso {2} com a a\u00E7\u00E3o {1}  
96 -access-denied=O usu\u00E1rio {0} n\u00E3o possui permiss\u00E3o para executar a a\u00E7\u00E3o {1} no recurso {2}  
97 -access-denied-ui=Voc\u00EA n\u00E3o est\u00E1 autorizado a executar a a\u00E7\u00E3o {1} no recurso {0}  
98 -authorizer-not-defined=Nenhuma regra de resolu\u00E7\u00E3o de permiss\u00F5es foi definida. Para utilizar @{0} \u00E9 preciso definir a propriedade frameworkdemoiselle.security.authorizer.class como regra de resolu\u00E7\u00E3o de permiss\u00F5es desejada no arquivo demoiselle.properties.  
99 -user-not-authenticated=Usu\u00E1rio n\u00E3o autenticado  
100 -invalid-credentials=Usu\u00E1rio ou senha inv\u00E1lidos  
101 -has-role-verification=Verificando se o usu\u00E1rio {0} possui a(s) role(s)\: {1}  
102 -does-not-have-role=Usu\u00E1rio {0} n\u00E3o possui a(s) role(s)\: {1}  
103 -does-not-have-role-ui=Para acessar este recurso \u00E9 necess\u00E1rio ser {0}  
104 -user-has-role=Usu\u00E1rio {0} possui a(s) role(s)\: {1} 94 +access-checking=Verificando permiss\u00e3o do usu\u00e1rio {0} para executar a a\u00e7\u00e3o {1} no recurso {2}
  95 +access-allowed=O usu\u00e1rio {0} acessou o recurso {2} com a a\u00e7\u00e3o {1}
  96 +access-denied=O usu\u00e1rio {0} n\u00e3o possui permiss\u00e3o para executar a a\u00e7\u00e3o {1} no recurso {2}
  97 +access-denied-ui=Voc\u00ea n\u00e3o est\u00e1 autorizado a executar a a\u00e7\u00e3o {1} no recurso {0}
  98 +authorizer-not-defined=Nenhuma regra de resolu\u00e7\u00e3o de permiss\u00f5es foi definida. Para utilizar @{0} \u00e9 preciso definir a propriedade frameworkdemoiselle.security.authorizer.class como regra de resolu\u00e7\u00e3o de permiss\u00f5es desejada no arquivo demoiselle.properties.
  99 +user-not-authenticated=Usu\u00e1rio n\u00e3o autenticado
  100 +invalid-credentials=Usu\u00e1rio ou senha inv\u00e1lidos
  101 +has-role-verification=Verificando se o usu\u00e1rio {0} possui a(s) role(s)\: {1}
  102 +does-not-have-role=Usu\u00e1rio {0} n\u00e3o possui a(s) role(s)\: {1}
  103 +does-not-have-role-ui=Para acessar este recurso \u00e9 necess\u00e1rio ser {0}
  104 +user-has-role=Usu\u00e1rio {0} possui a(s) role(s)\: {1}
105 105
106 -authenticator-not-defined=Nenhum mecanismo de autentica\u00E7\u00E3o foi definido. Para utilizar {0} \u00E9 preciso definir a propriedade frameworkdemoiselle.security.authenticator.class como mecanismo de autentica\u00E7\u00E3o desejado no arquivo demoiselle.properties. 106 +authenticator-not-defined=Nenhum mecanismo de autentica\u00e7\u00e3o foi definido. Para utilizar {0} \u00e9 preciso definir a propriedade frameworkdemoiselle.security.authenticator.class como mecanismo de autentica\u00e7\u00e3o desejado no arquivo demoiselle.properties.
107 107
108 management-notification-attribute-changed=O atributo [{0}] da classe gerenciada [{1}] foi alterado 108 management-notification-attribute-changed=O atributo [{0}] da classe gerenciada [{1}] foi alterado
109 -management-null-class-defined=O controlador de gerenciamento informado n\u00E3o pode ser [null] 109 +management-null-class-defined=O controlador de gerenciamento informado n\u00e3o pode ser [null]
110 management-abstract-class-defined=O controlador de gerenciamento [{0}] precisa ser uma classe concreta 110 management-abstract-class-defined=O controlador de gerenciamento [{0}] precisa ser uma classe concreta
111 management-no-annotation-found=Classe {0} precisa ser anotada com @ManagementController 111 management-no-annotation-found=Classe {0} precisa ser anotada com @ManagementController
112 -management-invalid-property-no-getter-setter=Falha ao inicializar classe gerenciada {0}, n\u00E3o foi encontrado um m\u00E9todo get ou m\u00E9todo set para a propriedade {1}  
113 -management-invalid-property-as-operation=Falha ao inicializar classe gerenciada {0}, n\u00E3o \u00E9 poss\u00EDvel declarar uma propriedade cujo m\u00E9todo get ou set \u00E9 uma opera\u00E7\u00E3o 112 +management-invalid-property-no-getter-setter=Falha ao inicializar classe gerenciada {0}, n\u00e3o foi encontrado um m\u00e9todo get ou m\u00e9todo set para a propriedade {1}
  113 +management-invalid-property-as-operation=Falha ao inicializar classe gerenciada {0}, n\u00e3o \u00e9 poss\u00edvel declarar uma propriedade cujo m\u00e9todo get ou set \u00e9 uma opera\u00e7\u00e3o
114 management-introspection-error=Erro ao ler atributos da classe gerenciada {0} 114 management-introspection-error=Erro ao ler atributos da classe gerenciada {0}
115 -management-type-not-found=A classe gerenciada informada n\u00E3o existe\: {0}  
116 -management-invoke-error=Erro ao tentar invocar a opera\u00E7\u00E3o "{0}" da classe gerenciada, a opera\u00E7\u00E3o n\u00E3o foi encontrada  
117 -management-write-value-error=N\u00E3o foi poss\u00EDvel definir um valor para a propriedade {0}  
118 -management-read-value-error=N\u00E3o foi poss\u00EDvel ler o valor da propriedade {0} 115 +management-type-not-found=A classe gerenciada informada n\u00e3o existe\: {0}
  116 +management-invoke-error=Erro ao tentar invocar a opera\u00e7\u00e3o "{0}" da classe gerenciada, a opera\u00e7\u00e3o n\u00e3o foi encontrada
  117 +management-write-value-error=N\u00e3o foi poss\u00edvel definir um valor para a propriedade {0}
  118 +management-read-value-error=N\u00e3o foi poss\u00edvel ler o valor da propriedade {0}
119 management-debug-acessing-property=Acessando propriedade {0} da classe gerenciada {1} 119 management-debug-acessing-property=Acessando propriedade {0} da classe gerenciada {1}
120 management-debug-setting-property=Definindo novo valor para propriedade {0} da classe gerenciada {1} 120 management-debug-setting-property=Definindo novo valor para propriedade {0} da classe gerenciada {1}
121 -management-debug-invoking-operation=Invocando opera\u00E7\u00E3o {0} da classe gerenciada {1} 121 +management-debug-invoking-operation=Invocando opera\u00e7\u00e3o {0} da classe gerenciada {1}
122 management-debug-starting-custom-context=Levantando contexto {0} para executar comando na classe gerenciada {1} 122 management-debug-starting-custom-context=Levantando contexto {0} para executar comando na classe gerenciada {1}
123 management-debug-stoping-custom-context=Desligando contexto {0} para classe gerenciada {1} 123 management-debug-stoping-custom-context=Desligando contexto {0} para classe gerenciada {1}
124 management-debug-registering-managed-type=Registrando classe gerenciada [{0}] 124 management-debug-registering-managed-type=Registrando classe gerenciada [{0}]
125 -management-debug-processing-management-extension=Processando extens\u00E3o de gerenciamento [{0}]  
126 -management-debug-removing-management-extension=Desativando extens\u00E3o de gerenciamento [{0}]  
127 -management-validation-constraint-violation=Ocorreu um erro de valida\u00E7\u00E3o na classe [{0}] ao definir um valor para a propriedade [{1}]\: [{2}]  
128 -management-validation-validator-not-found=Nenhum provedor de valida\u00E7\u00E3o de beans encontrado, as anota\u00E7\u00F5es de valida\u00E7\u00E3o n\u00E3o ser\u00E3o processadas 125 +management-debug-processing-management-extension=Processando extens\u00e3o de gerenciamento [{0}]
  126 +management-debug-removing-management-extension=Desativando extens\u00e3o de gerenciamento [{0}]
  127 +management-validation-constraint-violation=Ocorreu um erro de valida\u00e7\u00e3o na classe [{0}] ao definir um valor para a propriedade [{1}]\: [{2}]
  128 +management-validation-validator-not-found=Nenhum provedor de valida\u00e7\u00e3o de beans encontrado, as anota\u00e7\u00f5es de valida\u00e7\u00e3o n\u00e3o ser\u00e3o processadas
impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/security/AbstractHTTPAuthorizationFilter.java
@@ -36,9 +36,11 @@ @@ -36,9 +36,11 @@
36 */ 36 */
37 package br.gov.frameworkdemoiselle.security; 37 package br.gov.frameworkdemoiselle.security;
38 38
  39 +import static java.util.regex.Pattern.CASE_INSENSITIVE;
39 import static javax.servlet.http.HttpServletResponse.SC_UNAUTHORIZED; 40 import static javax.servlet.http.HttpServletResponse.SC_UNAUTHORIZED;
40 41
41 import java.io.IOException; 42 import java.io.IOException;
  43 +import java.util.Enumeration;
42 import java.util.regex.Matcher; 44 import java.util.regex.Matcher;
43 import java.util.regex.Pattern; 45 import java.util.regex.Pattern;
44 46
@@ -67,18 +69,52 @@ public abstract class AbstractHTTPAuthorizationFilter implements Filter { @@ -67,18 +69,52 @@ public abstract class AbstractHTTPAuthorizationFilter implements Filter {
67 @Override 69 @Override
68 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, 70 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
69 ServletException { 71 ServletException {
70 -  
71 - RESTSecurityConfig config = Beans.getReference(RESTSecurityConfig.class);  
72 -  
73 - if (request instanceof HttpServletRequest && isActive(config)  
74 - && isSupported(getAuthHeader((HttpServletRequest) request))) { 72 +
  73 + if (request instanceof HttpServletRequest && response instanceof HttpServletResponse) {
  74 + doFilter((HttpServletRequest) request, (HttpServletResponse) response, chain);
  75 + } else {
  76 + chain.doFilter(request, response);
  77 + }
  78 +
  79 + // boolean processed = false;
  80 + //
  81 + // if (request instanceof HttpServletRequest) {
  82 + // HttpServletRequest httpRequest = (HttpServletRequest) request;
  83 + // HttpServletResponse httpResponse = (HttpServletResponse) response;
  84 + //
  85 + // String authHeader = getAuthHeader(httpRequest);
  86 + // String httpCredentials = extractCredentials(authHeader);
  87 + //
  88 + // RESTSecurityConfig config = Beans.getReference(RESTSecurityConfig.class);
  89 + // if (isActive(config) && isSupported(httpCredentials)) {
  90 + // processed = true;
  91 + //
  92 + // try {
  93 + // performLogin(httpCredentials, httpRequest, httpResponse);
  94 + // chain.doFilter(httpRequest, httpResponse);
  95 + // performLogout(httpCredentials, httpRequest, httpResponse);
  96 + //
  97 + // } catch (InvalidCredentialsException cause) {
  98 + // setUnauthorizedStatus(httpResponse, cause);
  99 + // }
  100 + // }
  101 + // }
  102 + //
  103 + // if (!processed) {
  104 + // chain.doFilter(request, response);
  105 + // }
  106 + }
  107 +
  108 + protected void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
  109 + throws IOException, ServletException {
  110 + if (isActive() && isSupported(request)) {
75 try { 111 try {
76 - performLogin((HttpServletRequest) request);  
77 - chain.doFilter((HttpServletRequest) request, (HttpServletResponse) response);  
78 - performLogout(); 112 + performLogin(request, response);
  113 + chain.doFilter(request, response);
  114 + performLogout(request, response);
79 115
80 } catch (InvalidCredentialsException cause) { 116 } catch (InvalidCredentialsException cause) {
81 - setUnauthorizedStatus((HttpServletResponse) response, cause); 117 + setUnauthorizedStatus(response, cause);
82 } 118 }
83 119
84 } else { 120 } else {
@@ -86,27 +122,54 @@ public abstract class AbstractHTTPAuthorizationFilter implements Filter { @@ -86,27 +122,54 @@ public abstract class AbstractHTTPAuthorizationFilter implements Filter {
86 } 122 }
87 } 123 }
88 124
89 - private String getAuthHeader(HttpServletRequest request) {  
90 - String result = request.getHeader("Authorization");  
91 - return (result == null ? request.getHeader("authorization") : result); 125 + protected String getAuthHeader(HttpServletRequest request) {
  126 + String value = null;
  127 +
  128 + for (final Enumeration<String> names = request.getHeaderNames(); names.hasMoreElements();) {
  129 + String name = names.nextElement();
  130 +
  131 + if ("authorization".equalsIgnoreCase(name)) {
  132 + value = request.getHeader(name);
  133 + break;
  134 + }
  135 + }
  136 +
  137 + return value;
  138 + }
  139 +
  140 + protected String getAuthData(HttpServletRequest request) throws InvalidCredentialsException {
  141 + String authData = null;
  142 + String authHeader = getAuthHeader(request);
  143 + String type = getType();
  144 +
  145 + if (!Strings.isEmpty(type) && !Strings.isEmpty(authHeader)) {
  146 + String regexp = "^" + type + "[ \\n]+(.+)$";
  147 + Pattern pattern = Pattern.compile(regexp, CASE_INSENSITIVE);
  148 + Matcher matcher = pattern.matcher(authHeader);
  149 +
  150 + if (matcher.matches()) {
  151 + authData = matcher.group(1);
  152 + }
  153 + }
  154 +
  155 + return authData;
92 } 156 }
93 157
94 - protected abstract boolean isSupported(String authHeader); 158 + protected boolean isSupported(HttpServletRequest request) {
  159 + String data = getAuthData(request);
  160 + return !Strings.isEmpty(data);
  161 + }
95 162
96 - protected abstract boolean isActive(RESTSecurityConfig config); 163 + protected abstract boolean isActive();
97 164
98 - protected abstract void prepareForLogin(); 165 + protected abstract String getType();
99 166
100 - private void performLogin(HttpServletRequest request) {  
101 - prepareForLogin(); 167 + protected void performLogin(HttpServletRequest request, HttpServletResponse response) {
102 Beans.getReference(SecurityContext.class).login(); 168 Beans.getReference(SecurityContext.class).login();
103 } 169 }
104 170
105 - protected abstract void prepareForLogout();  
106 -  
107 - private void performLogout() { 171 + protected void performLogout(HttpServletRequest request, HttpServletResponse response) {
108 if (Beans.getReference(SecurityContext.class).isLoggedIn()) { 172 if (Beans.getReference(SecurityContext.class).isLoggedIn()) {
109 - prepareForLogout();  
110 Beans.getReference(SecurityContext.class).logout(); 173 Beans.getReference(SecurityContext.class).logout();
111 } 174 }
112 } 175 }
@@ -116,20 +179,4 @@ public abstract class AbstractHTTPAuthorizationFilter implements Filter { @@ -116,20 +179,4 @@ public abstract class AbstractHTTPAuthorizationFilter implements Filter {
116 response.setContentType("text/plain"); 179 response.setContentType("text/plain");
117 response.getWriter().write(cause.getMessage()); 180 response.getWriter().write(cause.getMessage());
118 } 181 }
119 -  
120 - protected static String extractCredentials(String type, String authHeader) throws InvalidCredentialsException {  
121 - String result = null;  
122 -  
123 - if (!Strings.isEmpty(type) && !Strings.isEmpty(authHeader)) {  
124 - String regexp = "^" + type + "[ \\n]+(.+)$";  
125 - Pattern pattern = Pattern.compile(regexp);  
126 - Matcher matcher = pattern.matcher(authHeader);  
127 -  
128 - if (matcher.matches()) {  
129 - result = matcher.group(1);  
130 - }  
131 - }  
132 -  
133 - return result;  
134 - }  
135 } 182 }
impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/security/BasicAuthFilter.java
@@ -36,37 +36,36 @@ @@ -36,37 +36,36 @@
36 */ 36 */
37 package br.gov.frameworkdemoiselle.security; 37 package br.gov.frameworkdemoiselle.security;
38 38
  39 +import javax.servlet.http.HttpServletRequest;
  40 +import javax.servlet.http.HttpServletResponse;
  41 +
39 import org.apache.commons.codec.binary.Base64; 42 import org.apache.commons.codec.binary.Base64;
40 43
41 import br.gov.frameworkdemoiselle.util.Beans; 44 import br.gov.frameworkdemoiselle.util.Beans;
42 -import br.gov.frameworkdemoiselle.util.Strings;  
43 45
44 public class BasicAuthFilter extends AbstractHTTPAuthorizationFilter { 46 public class BasicAuthFilter extends AbstractHTTPAuthorizationFilter {
45 47
46 private String credentials; 48 private String credentials;
47 49
48 @Override 50 @Override
49 - protected boolean isSupported(String authHeader) {  
50 - credentials = extractCredentials("Basic", authHeader);  
51 - return !Strings.isEmpty(credentials); 51 + protected String getType() {
  52 + return "Basic";
52 } 53 }
53 54
54 @Override 55 @Override
55 - protected boolean isActive(RESTSecurityConfig config) {  
56 - return config.isBasicFilterActive(); 56 + protected boolean isActive() {
  57 + return Beans.getReference(RESTSecurityConfig.class).isBasicFilterActive();
57 } 58 }
58 59
59 @Override 60 @Override
60 - protected void prepareForLogin() { 61 + protected void performLogin(HttpServletRequest httpRequest, HttpServletResponse httpResponse) {
61 String[] basicCredentials = getCredentials(credentials); 62 String[] basicCredentials = getCredentials(credentials);
62 63
63 Credentials credentials = Beans.getReference(Credentials.class); 64 Credentials credentials = Beans.getReference(Credentials.class);
64 credentials.setUsername(basicCredentials[0]); 65 credentials.setUsername(basicCredentials[0]);
65 credentials.setPassword(basicCredentials[1]); 66 credentials.setPassword(basicCredentials[1]);
66 - }  
67 67
68 - @Override  
69 - protected void prepareForLogout() { 68 + super.performLogin(httpRequest, httpResponse);
70 } 69 }
71 70
72 private static String[] getCredentials(String header) throws InvalidCredentialsException { 71 private static String[] getCredentials(String header) throws InvalidCredentialsException {
impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/security/Token.java
@@ -2,8 +2,6 @@ package br.gov.frameworkdemoiselle.security; @@ -2,8 +2,6 @@ package br.gov.frameworkdemoiselle.security;
2 2
3 import javax.enterprise.context.RequestScoped; 3 import javax.enterprise.context.RequestScoped;
4 4
5 -import br.gov.frameworkdemoiselle.util.Strings;  
6 -  
7 @RequestScoped 5 @RequestScoped
8 public class Token { 6 public class Token {
9 7
@@ -16,8 +14,12 @@ public class Token { @@ -16,8 +14,12 @@ public class Token {
16 public void setValue(String value) { 14 public void setValue(String value) {
17 this.value = value; 15 this.value = value;
18 } 16 }
19 - 17 +
20 public boolean isEmpty() { 18 public boolean isEmpty() {
21 - return Strings.isEmpty(value); 19 + return this.value == null;
  20 + }
  21 +
  22 + public void clear() {
  23 + this.value = null;
22 } 24 }
23 } 25 }
impl/extension/rest/src/main/java/br/gov/frameworkdemoiselle/security/TokenAuthFilter.java
@@ -36,29 +36,55 @@ @@ -36,29 +36,55 @@
36 */ 36 */
37 package br.gov.frameworkdemoiselle.security; 37 package br.gov.frameworkdemoiselle.security;
38 38
  39 +import java.io.IOException;
  40 +
  41 +import javax.servlet.FilterChain;
  42 +import javax.servlet.ServletException;
  43 +import javax.servlet.http.HttpServletRequest;
  44 +import javax.servlet.http.HttpServletResponse;
  45 +
39 import br.gov.frameworkdemoiselle.util.Beans; 46 import br.gov.frameworkdemoiselle.util.Beans;
40 -import br.gov.frameworkdemoiselle.util.Strings;  
41 47
42 public class TokenAuthFilter extends AbstractHTTPAuthorizationFilter { 48 public class TokenAuthFilter extends AbstractHTTPAuthorizationFilter {
43 49
44 - private String token;  
45 -  
46 - protected boolean isSupported(String authHeader) {  
47 - token = extractCredentials("Token", authHeader);  
48 - return !Strings.isEmpty(token); 50 + @Override
  51 + protected String getType() {
  52 + return "Token";
49 } 53 }
50 54
51 @Override 55 @Override
52 - protected boolean isActive(RESTSecurityConfig config) {  
53 - return config.isTokenFilterActive(); 56 + protected void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
  57 + throws IOException, ServletException {
  58 + String authData = getAuthData(request);
  59 +
  60 + super.doFilter(request, response, chain);
  61 +
  62 + String value = Beans.getReference(Token.class).getValue();
  63 + if (value != null && !value.equals(authData)) {
  64 + response.setHeader("Set-Token", value);
  65 + }
54 } 66 }
55 67
56 @Override 68 @Override
57 - protected void prepareForLogin() {  
58 - Beans.getReference(Token.class).setValue(token); 69 + protected boolean isActive() {
  70 + return Beans.getReference(RESTSecurityConfig.class).isTokenFilterActive();
59 } 71 }
60 72
61 @Override 73 @Override
62 - protected void prepareForLogout() { 74 + protected void performLogin(HttpServletRequest request, HttpServletResponse response) {
  75 + Token token = Beans.getReference(Token.class);
  76 + String authData = getAuthData(request);
  77 + token.setValue(authData);
  78 +
  79 + super.performLogin(request, response);
63 } 80 }
  81 +
  82 + // public void setHeader(@Observes AfterLoginSuccessful event) {
  83 + // Token token = Beans.getReference(Token.class);
  84 + //
  85 + // if (!token.isEmpty()) {
  86 + // HttpServletResponse response = Beans.getReference(HttpServletResponse.class);
  87 + // response.setHeader("Set-Token", token.getValue());
  88 + // }
  89 + // }
64 } 90 }