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 17 # or write to the Free Software Foundation, Inc., 51 Franklin Street,
18 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 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 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 34 # 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA.
35 35  
36 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 46 taking-off=O Demoiselle ${project.version} decolou
47 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 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 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 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 75 custom-context-was-activated=O contexto {0} foi ativado para o escopo {1}
76 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 81 error-creating-new-instance-for=Error creating a new instance for "{0}"
82 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 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 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 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 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 110 management-abstract-class-defined=O controlador de gerenciamento [{0}] precisa ser uma classe concreta
111 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 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 119 management-debug-acessing-property=Acessando propriedade {0} da classe gerenciada {1}
120 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 122 management-debug-starting-custom-context=Levantando contexto {0} para executar comando na classe gerenciada {1}
123 123 management-debug-stoping-custom-context=Desligando contexto {0} para classe gerenciada {1}
124 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 36 */
37 37 package br.gov.frameworkdemoiselle.security;
38 38  
  39 +import static java.util.regex.Pattern.CASE_INSENSITIVE;
39 40 import static javax.servlet.http.HttpServletResponse.SC_UNAUTHORIZED;
40 41  
41 42 import java.io.IOException;
  43 +import java.util.Enumeration;
42 44 import java.util.regex.Matcher;
43 45 import java.util.regex.Pattern;
44 46  
... ... @@ -67,18 +69,52 @@ public abstract class AbstractHTTPAuthorizationFilter implements Filter {
67 69 @Override
68 70 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
69 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 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 116 } catch (InvalidCredentialsException cause) {
81   - setUnauthorizedStatus((HttpServletResponse) response, cause);
  117 + setUnauthorizedStatus(response, cause);
82 118 }
83 119  
84 120 } else {
... ... @@ -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 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 172 if (Beans.getReference(SecurityContext.class).isLoggedIn()) {
109   - prepareForLogout();
110 173 Beans.getReference(SecurityContext.class).logout();
111 174 }
112 175 }
... ... @@ -116,20 +179,4 @@ public abstract class AbstractHTTPAuthorizationFilter implements Filter {
116 179 response.setContentType("text/plain");
117 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 36 */
37 37 package br.gov.frameworkdemoiselle.security;
38 38  
  39 +import javax.servlet.http.HttpServletRequest;
  40 +import javax.servlet.http.HttpServletResponse;
  41 +
39 42 import org.apache.commons.codec.binary.Base64;
40 43  
41 44 import br.gov.frameworkdemoiselle.util.Beans;
42   -import br.gov.frameworkdemoiselle.util.Strings;
43 45  
44 46 public class BasicAuthFilter extends AbstractHTTPAuthorizationFilter {
45 47  
46 48 private String credentials;
47 49  
48 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 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 60 @Override
60   - protected void prepareForLogin() {
  61 + protected void performLogin(HttpServletRequest httpRequest, HttpServletResponse httpResponse) {
61 62 String[] basicCredentials = getCredentials(credentials);
62 63  
63 64 Credentials credentials = Beans.getReference(Credentials.class);
64 65 credentials.setUsername(basicCredentials[0]);
65 66 credentials.setPassword(basicCredentials[1]);
66   - }
67 67  
68   - @Override
69   - protected void prepareForLogout() {
  68 + super.performLogin(httpRequest, httpResponse);
70 69 }
71 70  
72 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 2  
3 3 import javax.enterprise.context.RequestScoped;
4 4  
5   -import br.gov.frameworkdemoiselle.util.Strings;
6   -
7 5 @RequestScoped
8 6 public class Token {
9 7  
... ... @@ -16,8 +14,12 @@ public class Token {
16 14 public void setValue(String value) {
17 15 this.value = value;
18 16 }
19   -
  17 +
20 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 36 */
37 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 46 import br.gov.frameworkdemoiselle.util.Beans;
40   -import br.gov.frameworkdemoiselle.util.Strings;
41 47  
42 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 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 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 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 }
... ...