Commit edecdf07a7240dbf798361f533148eed424bea47
1 parent
ce216d26
Exists in
master
Melhoria nos filtros de autenticação
Showing
5 changed files
with
208 additions
and
134 deletions
Show diff stats
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 | } | ... | ... |