diff --git a/basic/src/main/java/org/demoiselle/jee/security/basic/impl/SecurityContextImpl.java b/basic/src/main/java/org/demoiselle/jee/security/basic/impl/SecurityContextImpl.java index f7ebc9a..3a94b9c 100644 --- a/basic/src/main/java/org/demoiselle/jee/security/basic/impl/SecurityContextImpl.java +++ b/basic/src/main/java/org/demoiselle/jee/security/basic/impl/SecurityContextImpl.java @@ -1,14 +1,13 @@ package org.demoiselle.jee.security.basic.impl; +import org.demoiselle.jee.security.Token; import javax.enterprise.context.Dependent; -import java.io.Serializable; import java.security.Principal; import java.util.Map; import java.util.Set; import javax.inject.Inject; import org.demoiselle.jee.core.util.ResourceBundle; -import org.demoiselle.jee.security.SecurityContext; -import org.demoiselle.jee.security.TokensManager; +import org.demoiselle.jee.security.interfaces.SecurityContext; import org.demoiselle.jee.security.exception.NotLoggedInException; /** @@ -23,14 +22,13 @@ public class SecurityContextImpl implements SecurityContext { private static final long serialVersionUID = 1L; - private String token; - - private Principal user; - @Inject private TokensManager tm; @Inject + private Token token; + + @Inject private ResourceBundle bundle; /** @@ -67,7 +65,10 @@ public class SecurityContextImpl implements SecurityContext { */ @Override public Principal getUser() { - return this.user; + if (token.getKey() != null && !token.getKey().isEmpty()) { + return tm.getUser(token.getKey()); + } + return token.getPrincipal(); } public void checkLoggedIn() throws NotLoggedInException { @@ -98,20 +99,25 @@ public class SecurityContextImpl implements SecurityContext { @Override public void setUser(Principal principal) { - this.token = tm.create(principal); - this.user = principal; + token.setKey(tm.getToken(principal)); + token.setPrincipal(principal); } @Override public String getToken() { - return token; + if (token.getKey() != null && token.getKey().isEmpty()) { + token.setKey(tm.getToken(token.getPrincipal())); + } + return token.getKey(); } @Override - public void setToken(String token) { - this.user = tm.getUser(token); - this.token = token; + public void setToken(String chave) { + token.setPrincipal(tm.getUser(chave)); + if (token.getPrincipal() == null) { + throw new NotLoggedInException(bundle.getString("user-not-authenticated")); + } + token.setKey(chave); } - } diff --git a/basic/src/main/java/org/demoiselle/jee/security/basic/impl/TokensManager.java b/basic/src/main/java/org/demoiselle/jee/security/basic/impl/TokensManager.java new file mode 100644 index 0000000..1beee91 --- /dev/null +++ b/basic/src/main/java/org/demoiselle/jee/security/basic/impl/TokensManager.java @@ -0,0 +1,56 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.demoiselle.jee.security.basic.impl; + +import java.security.Principal; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; +import java.util.logging.Logger; +import javax.enterprise.context.ApplicationScoped; +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; + +/** + * + * @author 70744416353 + */ +@ApplicationScoped +public class TokensManager { + + private static ConcurrentHashMap repo = new ConcurrentHashMap<>(); + + @Inject + private Logger logger; + + public Principal getUser(String token) { + return repo.get(token); + } + + public String getToken(Principal user) { + String value = null; + if (!repo.containsValue(user)) { + value = UUID.randomUUID().toString(); + repo.put(value, user); + } else { + for (Map.Entry entry : repo.entrySet()) { + if (entry.getValue().equals(user)) { + return entry.getKey(); + } + } + } + return value; + } + + public void remove(String token) { + repo.remove(token); + } + + public boolean validate(String token) { + return repo.containsKey(token); + } + +} diff --git a/basic/src/main/java/org/demoiselle/jee/security/basic/impl/TokensManagerImpl.java b/basic/src/main/java/org/demoiselle/jee/security/basic/impl/TokensManagerImpl.java deleted file mode 100644 index 708d945..0000000 --- a/basic/src/main/java/org/demoiselle/jee/security/basic/impl/TokensManagerImpl.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package org.demoiselle.jee.security.basic.impl; - -import java.security.Principal; -import java.util.UUID; -import java.util.concurrent.ConcurrentHashMap; -import javax.enterprise.context.Dependent; -import org.demoiselle.jee.security.TokensManager; - -/** - * - * @author 70744416353 - */ -@Dependent -public class TokensManagerImpl implements TokensManager { - - private static ConcurrentHashMap repo = new ConcurrentHashMap<>(); - - @Override - public Principal getUser(String token) { - return repo.get(token); - } - - @Override - public String create(Principal user) { - String value = null; - if (!repo.containsValue(user)) { - value = UUID.randomUUID().toString(); - repo.put(value, user); - } - return value; - } - - @Override - public void remove(String token) { - repo.remove(token); - } - - @Override - public boolean validate(String token) { - return repo.containsKey(token); - } - -} diff --git a/basic/src/main/resources/demoiselle.properties b/basic/src/main/resources/demoiselle.properties index e69de29..4f777af 100644 --- a/basic/src/main/resources/demoiselle.properties +++ b/basic/src/main/resources/demoiselle.properties @@ -0,0 +1 @@ +user-not-authenticated \ No newline at end of file diff --git a/basic/src/main/resources/messages.properties b/basic/src/main/resources/messages.properties new file mode 100644 index 0000000..65893da --- /dev/null +++ b/basic/src/main/resources/messages.properties @@ -0,0 +1 @@ +tipo-seguranca=basic \ No newline at end of file diff --git a/core/src/main/resources/demoiselle-core-bundle.properties b/core/src/main/resources/demoiselle-core-bundle.properties deleted file mode 100644 index eb15108..0000000 --- a/core/src/main/resources/demoiselle-core-bundle.properties +++ /dev/null @@ -1,130 +0,0 @@ -# Demoiselle Framework -# Copyright (C) 2010 SERPRO -# ---------------------------------------------------------------------------- -# This file is part of Demoiselle Framework. -# -# Demoiselle Framework is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public License version 3 -# as published by the Free Software Foundation. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License version 3 -# along with this program; if not, see -# or write to the Free Software Foundation, Inc., 51 Franklin Street, -# Fifth Floor, Boston, MA 02110-1301, USA. -# ---------------------------------------------------------------------------- -# Este arquivo \u00E9 parte do Framework Demoiselle. -# -# O Framework Demoiselle \u00E9 um software livre; voc\u00EA pode redistribu\u00ED-lo e/ou -# modific\u00E1-lo dentro dos termos da GNU LGPL vers\u00E3o 3 como publicada pela Funda\u00E7\u00E3o -# do Software Livre (FSF). -# -# Este programa \u00E9 distribu\u00EDdo na esperan\u00E7a que possa ser \u00FAtil, mas SEM NENHUMA -# GARANTIA; sem uma garantia impl\u00EDcita de ADEQUA\u00C7\u00C3O a qualquer MERCADO ou -# APLICA\u00C7\u00C3O EM PARTICULAR. Veja a Licen\u00E7a P\u00FAblica Geral GNU/LGPL em portugu\u00EAs -# para maiores detalhes. -# -# Voc\u00EA deve ter recebido uma c\u00F3pia da GNU LGPL vers\u00E3o 3, sob o t\u00EDtulo -# "LICENCA.txt", junto com esse programa. Se n\u00E3o, acesse -# ou escreva para a Funda\u00E7\u00E3o do Software Livre (FSF) Inc., -# 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. - -version=${project.version} -engine-on=Iniciando o Demoiselle Framework ${project.version} (Neo) -resource-not-found=Arquivo {0} n\u00E3o foi encontrado -key-not-found=A chave {0} n\u00E3o foi encontrada -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. -ambiguous-bean-resolution=Falha ao obter {0} pois foi detectada ambiguidade nas seguintes implementa\u00E7\u00F5es\: {1} -bean-not-found=Voc\u00EA est\u00E1 tentando obter um objeto n\u00E3o reconhecido pelo CDI via Beans.getReference({0}) -store-not-found=O objeto do tipo [{0}] n\u00E3o pode ser armazenado no escopo indicado\: {1} -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} -handling-exception=Tratando a exce\u00E7\u00E3o {0} -taking-off=O Demoiselle ${project.version} decolou -engine-off=Desligando os motores do Demoiselle ${project.version} -setting-up-bean-manager=BeanManager dispon\u00EDvel atrav\u00E9s do utilit\u00E1rio {0} - -user-transaction-lookup-fail=N\u00E3o foi encontrada nenhuma transa\u00E7\u00E3o com o nome {0} no contexto JNDI -transactional-execution=Execu\u00E7\u00E3o transacional de {0} -begin-transaction=Transa\u00E7\u00E3o iniciada -transaction-marked-rollback=Transa\u00E7\u00E3o marcada para rollback [{0}] -transaction-already-finalized=A transa\u00E7\u00E3o j\u00E1 havia sido finalizada -transaction-commited=Transa\u00E7\u00E3o finalizada com sucesso -transaction-rolledback=Transa\u00E7\u00E3o finalizada com rollback - -bootstrap.configuration.processing=Processando {0} -bootstrap-context-already-managed=O contexto {0} para o escopo {1} j\u00E1 foi adicionado -bootstrap-context-added=Adicionando o contexto {0} para o escopo {1} - -loading-configuration-class=Carregando a classe de configura\u00E7\u00E3o {0} -configuration-field-loaded={0}: {2} -configuration-attribute-is-mandatory=A configura\u00E7\u00E3o {0} \u00E9 obrigat\u00F3ria, mas n\u00E3o foi encontrada em {1} -configuration-name-attribute-cant-be-empty=A nota\u00E7\u00E3o @Name n\u00E3o pode estar em branco -configuration-generic-extraction-error=Ocorreu um erro durante a extra\u00E7\u00E3o do tipo {0} com o extrator {1} -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. -configuration-key-not-found={0}\: [n\u00E3o encontrada] -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. -configuration-not-conversion=N\u00E3o \u00E9 poss\u00EDvel converter o valor {0} para o tipo {1} - -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 -executing-all=Executando m\u00E9todos anotados com @{0} -custom-context-selected=Produzindo inst\u00E2ncia do contexto {0} -custom-context-was-activated=O contexto {0} foi ativado para o escopo {1} -custom-context-was-deactivated=O contexto {0} foi desativado para o escopo {1} -custom-context-already-activated=N\u00E3o foi poss\u00EDvel ativar o contexto {0}, o escopo {1} j\u00E1 est\u00E1 ativo no contexto {2} -custom-context-not-found=N\u00E3o foi encontrado um contexto gerenciado do tipo [{0}] para o escopo [{1}] -custom-context-manager-not-initialized=ContextManager n\u00E3o foi inicializado. Chame [initialize] ao capturar o evento [AfterBeanDiscovery] em uma extens\u00E3o CDI - -error-creating-new-instance-for=Error creating a new instance for "{0}" -executed-successfully={0} execultado com sucesso -must-declare-one-single-parameter=Voc\u00EA deve declarar um par\u00E2metro \u00FAnico em {0} -loading-default-transaction-manager=Carregando o gerenciador de transa\u00E7\u00E3o padr\u00E3o {0} -results-count-greater-page-size=Quantidade de resultados {0} \u00E9 maior que o tamanho da p\u00E1gina {1} -page-result=Resultado paginado [p\u00E1gina\={0}, total de resultados\={1}] -pagination-not-initialized=Pagina\u00E7\u00E3o n\u00E3o inicializada. Inicialize o sistema de pagina\u00E7\u00E3o definindo a p\u00E1gina atual ou o total de resultados ao menos uma vez na requisi\u00E7\u00E3o. -pagination-invalid-value=Valor inv\u00E1lido para paginador: [{0}]. -page=P\u00E1gina [n\u00FAmero\={0}, tamanho\={1}] -processing=Processando\: {0} -processing-fail=Falha no processamento devido a uma exce\u00E7\u00E3o lan\u00E7ada pela aplica\u00E7\u00E3o -for= \ para\: -file-not-found=O arquivo {0} n\u00E3o foi encontrado - -adding-message-to-context=Adicionando uma mensagem no contexto: [{0}] -access-checking=Verificando permiss\u00E3o do usu\u00E1rio {0} para executar a a\u00E7\u00E3o {1} no recurso {2} -access-allowed=O usu\u00E1rio {0} acessou o recurso {2} com a a\u00E7\u00E3o {1} -access-denied=O usu\u00E1rio {0} n\u00E3o possui permiss\u00E3o para executar a a\u00E7\u00E3o {1} no recurso {2} -access-denied-ui=Voc\u00EA n\u00E3o est\u00E1 autorizado a executar a a\u00E7\u00E3o {1} no recurso {0} -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. -user-not-authenticated=Usu\u00E1rio n\u00E3o autenticado -invalid-credentials=Usu\u00E1rio ou senha inv\u00E1lidos -has-role-verification=Verificando se o usu\u00E1rio {0} possui a(s) role(s)\: {1} -does-not-have-role=Usu\u00E1rio {0} n\u00E3o possui a(s) role(s)\: {1} -does-not-have-role-ui=Para acessar este recurso \u00E9 necess\u00E1rio ser {0} -user-has-role=Usu\u00E1rio {0} possui a(s) role(s)\: {1} - -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. - -management-notification-attribute-changed=O atributo [{0}] da classe gerenciada [{1}] foi alterado -management-null-class-defined=O controlador de gerenciamento informado n\u00E3o pode ser [null] -management-abstract-class-defined=O controlador de gerenciamento [{0}] precisa ser uma classe concreta -management-no-annotation-found=Classe {0} precisa ser anotada com @ManagementController -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} -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 -management-introspection-error=Erro ao ler atributos da classe gerenciada {0} -management-type-not-found=A classe gerenciada informada n\u00E3o existe\: {0} -management-invoke-error=Erro ao tentar invocar a opera\u00E7\u00E3o "{0}" da classe gerenciada, a opera\u00E7\u00E3o n\u00E3o foi encontrada -management-write-value-error=N\u00E3o foi poss\u00EDvel definir um valor para a propriedade {0} -management-read-value-error=N\u00E3o foi poss\u00EDvel ler o valor da propriedade {0} -management-debug-acessing-property=Acessando propriedade {0} da classe gerenciada {1} -management-debug-setting-property=Definindo novo valor para propriedade {0} da classe gerenciada {1} -management-debug-invoking-operation=Invocando opera\u00E7\u00E3o {0} da classe gerenciada {1} -management-debug-starting-custom-context=Levantando contexto {0} para executar comando na classe gerenciada {1} -management-debug-stoping-custom-context=Desligando contexto {0} para classe gerenciada {1} -management-debug-registering-managed-type=Registrando classe gerenciada [{0}] -management-debug-processing-management-extension=Processando extens\u00E3o de gerenciamento [{0}] -management-debug-removing-management-extension=Desativando extens\u00E3o de gerenciamento [{0}] -management-validation-constraint-violation=Ocorreu um erro de valida\u00E7\u00E3o na classe [{0}] ao definir um valor para a propriedade [{1}]\: [{2}] -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 diff --git a/core/src/main/resources/messages.properties b/core/src/main/resources/messages.properties new file mode 100644 index 0000000..62cae56 --- /dev/null +++ b/core/src/main/resources/messages.properties @@ -0,0 +1,81 @@ + +version=${project.version} +engine-on=Iniciando o Demoiselle Framework ${project.version} (Neo) +resource-not-found=Arquivo {0} n\u00e3o foi encontrado +key-not-found=A chave {0} n\u00e3o foi encontrada +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. +ambiguous-bean-resolution=Falha ao obter {0} pois foi detectada ambiguidade nas seguintes implementa\u00e7\u00f5es\: {1} +bean-not-found=Voc\u00ea est\u00e1 tentando obter um objeto n\u00e3o reconhecido pelo CDI via Beans.getReference({0}) +store-not-found=O objeto do tipo [{0}] n\u00e3o pode ser armazenado no escopo indicado\: {1} +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} +handling-exception=Tratando a exce\u00e7\u00e3o {0} +taking-off=O Demoiselle ${project.version} decolou +engine-off=Desligando os motores do Demoiselle ${project.version} +setting-up-bean-manager=BeanManager dispon\u00edvel atrav\u00e9s do utilit\u00e1rio {0} + +user-transaction-lookup-fail=N\u00e3o foi encontrada nenhuma transa\u00e7\u00e3o com o nome {0} no contexto JNDI +transactional-execution=Execu\u00e7\u00e3o transacional de {0} +begin-transaction=Transa\u00e7\u00e3o iniciada +transaction-marked-rollback=Transa\u00e7\u00e3o marcada para rollback [{0}] +transaction-already-finalized=A transa\u00e7\u00e3o j\u00e1 havia sido finalizada +transaction-commited=Transa\u00e7\u00e3o finalizada com sucesso +transaction-rolledback=Transa\u00e7\u00e3o finalizada com rollback + +bootstrap.configuration.processing=Processando {0} +bootstrap-context-already-managed=O contexto {0} para o escopo {1} j\u00e1 foi adicionado +bootstrap-context-added=Adicionando o contexto {0} para o escopo {1} + +loading-configuration-class=Carregando a classe de configura\u00e7\u00e3o {0} +configuration-field-loaded={0}: {2} +configuration-attribute-is-mandatory=A configura\u00e7\u00e3o {0} \u00e9 obrigat\u00f3ria, mas n\u00e3o foi encontrada em {1} +configuration-name-attribute-cant-be-empty=A nota\u00e7\u00e3o @Name n\u00e3o pode estar em branco +configuration-generic-extraction-error=Ocorreu um erro durante a extra\u00e7\u00e3o do tipo {0} com o extrator {1} +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. +configuration-key-not-found={0}\: [n\u00e3o encontrada] +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. +configuration-not-conversion=N\u00e3o \u00e9 poss\u00edvel converter o valor {0} para o tipo {1} + +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 +executing-all=Executando m\u00e9todos anotados com @{0} +custom-context-selected=Produzindo inst\u00e2ncia do contexto {0} +custom-context-was-activated=O contexto {0} foi ativado para o escopo {1} +custom-context-was-deactivated=O contexto {0} foi desativado para o escopo {1} +custom-context-already-activated=N\u00e3o foi poss\u00edvel ativar o contexto {0}, o escopo {1} j\u00e1 est\u00e1 ativo no contexto {2} +custom-context-not-found=N\u00e3o foi encontrado um contexto gerenciado do tipo [{0}] para o escopo [{1}] +custom-context-manager-not-initialized=ContextManager n\u00e3o foi inicializado. Chame [initialize] ao capturar o evento [AfterBeanDiscovery] em uma extens\u00e3o CDI + +error-creating-new-instance-for=Error creating a new instance for "{0}" +executed-successfully={0} execultado com sucesso +must-declare-one-single-parameter=Voc\u00ea deve declarar um par\u00e2metro \u00fanico em {0} +loading-default-transaction-manager=Carregando o gerenciador de transa\u00e7\u00e3o padr\u00e3o {0} +results-count-greater-page-size=Quantidade de resultados {0} \u00e9 maior que o tamanho da p\u00e1gina {1} +page-result=Resultado paginado [p\u00e1gina\={0}, total de resultados\={1}] +pagination-not-initialized=Pagina\u00e7\u00e3o n\u00e3o inicializada. Inicialize o sistema de pagina\u00e7\u00e3o definindo a p\u00e1gina atual ou o total de resultados ao menos uma vez na requisi\u00e7\u00e3o. +pagination-invalid-value=Valor inv\u00e1lido para paginador: [{0}]. +page=P\u00e1gina [n\u00famero\={0}, tamanho\={1}] +processing=Processando\: {0} +processing-fail=Falha no processamento devido a uma exce\u00e7\u00e3o lan\u00e7ada pela aplica\u00e7\u00e3o +for= \ para\: +file-not-found=O arquivo {0} n\u00e3o foi encontrado + +management-notification-attribute-changed=O atributo [{0}] da classe gerenciada [{1}] foi alterado +management-null-class-defined=O controlador de gerenciamento informado n\u00e3o pode ser [null] +management-abstract-class-defined=O controlador de gerenciamento [{0}] precisa ser uma classe concreta +management-no-annotation-found=Classe {0} precisa ser anotada com @ManagementController +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} +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 +management-introspection-error=Erro ao ler atributos da classe gerenciada {0} +management-type-not-found=A classe gerenciada informada n\u00e3o existe\: {0} +management-invoke-error=Erro ao tentar invocar a opera\u00e7\u00e3o "{0}" da classe gerenciada, a opera\u00e7\u00e3o n\u00e3o foi encontrada +management-write-value-error=N\u00e3o foi poss\u00edvel definir um valor para a propriedade {0} +management-read-value-error=N\u00e3o foi poss\u00edvel ler o valor da propriedade {0} +management-debug-acessing-property=Acessando propriedade {0} da classe gerenciada {1} +management-debug-setting-property=Definindo novo valor para propriedade {0} da classe gerenciada {1} +management-debug-invoking-operation=Invocando opera\u00e7\u00e3o {0} da classe gerenciada {1} +management-debug-starting-custom-context=Levantando contexto {0} para executar comando na classe gerenciada {1} +management-debug-stoping-custom-context=Desligando contexto {0} para classe gerenciada {1} +management-debug-registering-managed-type=Registrando classe gerenciada [{0}] +management-debug-processing-management-extension=Processando extens\u00e3o de gerenciamento [{0}] +management-debug-removing-management-extension=Desativando extens\u00e3o de gerenciamento [{0}] +management-validation-constraint-violation=Ocorreu um erro de valida\u00e7\u00e3o na classe [{0}] ao definir um valor para a propriedade [{1}]\: [{2}] +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 diff --git a/security/src/main/java/org/demoiselle/jee/security/JaxRsFilter.java b/security/src/main/java/org/demoiselle/jee/security/JaxRsFilter.java index 22e86c5..9d3353e 100644 --- a/security/src/main/java/org/demoiselle/jee/security/JaxRsFilter.java +++ b/security/src/main/java/org/demoiselle/jee/security/JaxRsFilter.java @@ -5,6 +5,8 @@ */ package org.demoiselle.jee.security; +import java.io.IOException; +import org.demoiselle.jee.security.interfaces.SecurityContext; import java.util.logging.Logger; import javax.annotation.PostConstruct; import javax.inject.Inject; @@ -33,29 +35,41 @@ public class JaxRsFilter implements ClientRequestFilter, ClientResponseFilter, C @Inject private SecurityContext securityContext; - @Override - public void filter(ClientRequestContext requestContext) { - String token = requestContext.getHeaders().get("Authorization").toString(); - if (!token.isEmpty()) { - securityContext.setToken(token); - } + @PostConstruct + public void init() { + LOG.info("Demoiselle Module - Security"); } @Override - public void filter(ClientRequestContext requestContext, ClientResponseContext responseContext) { + public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) { + responseContext.getHeaders().putSingle("Authorization", "enabled"); + responseContext.getHeaders().putSingle("x-content-type-options", "nosniff"); + responseContext.getHeaders().putSingle("x-frame-options", "SAMEORIGIN"); + responseContext.getHeaders().putSingle("x-xss-protection", "1; mode=block"); } @Override - public void filter(ContainerRequestContext requestContext) { + public void filter(ContainerRequestContext requestContext) throws IOException { + try { + if (requestContext.getHeaders().containsKey("Authorization")) { + String token = requestContext.getHeaders().get("Authorization").toString().replace("[", "").replace("]", ""); + if (!token.isEmpty()) { + securityContext.setToken(token); + } + } + } catch (Exception e) { + } + } @Override - public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) { - responseContext.getHeaders().putSingle("Authorization", "Basic"); + public void filter(ClientRequestContext requestContext) throws IOException { + } - @PostConstruct - public void init() { - LOG.info("Demoiselle Module - Security"); + @Override + public void filter(ClientRequestContext requestContext, ClientResponseContext responseContext) throws IOException { + } + } diff --git a/security/src/main/java/org/demoiselle/jee/security/LoggedIn.java b/security/src/main/java/org/demoiselle/jee/security/LoggedIn.java deleted file mode 100644 index c0c1517..0000000 --- a/security/src/main/java/org/demoiselle/jee/security/LoggedIn.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Demoiselle Framework - * Copyright (C) 2010 SERPRO - * ---------------------------------------------------------------------------- - * This file is part of Demoiselle Framework. - * - * Demoiselle Framework is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public License version 3 - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License version 3 - * along with this program; if not, see - * or write to the Free Software Foundation, Inc., 51 Franklin Street, - * Fifth Floor, Boston, MA 02110-1301, USA. - * ---------------------------------------------------------------------------- - * Este arquivo é parte do Framework Demoiselle. - * - * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou - * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação - * do Software Livre (FSF). - * - * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA - * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou - * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português - * para maiores detalhes. - * - * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título - * "LICENCA.txt", junto com esse programa. Se não, acesse - * ou escreva para a Fundação do Software Livre (FSF) Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. - */ - -package org.demoiselle.jee.security; - -import javax.interceptor.InterceptorBinding; -import java.lang.annotation.Inherited; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.TYPE; -import static java.lang.annotation.RetentionPolicy.RUNTIME; - -/** - *

- * Indicates that a specific permission is required in order to invocate the annotated method or class. - *

- * - * @author SERPRO - */ - -@Inherited -@InterceptorBinding -@Target({ METHOD, TYPE }) -@Retention(RUNTIME) -public @interface LoggedIn { -} diff --git a/security/src/main/java/org/demoiselle/jee/security/RequiredPermission.java b/security/src/main/java/org/demoiselle/jee/security/RequiredPermission.java deleted file mode 100644 index a36b292..0000000 --- a/security/src/main/java/org/demoiselle/jee/security/RequiredPermission.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Demoiselle Framework - * Copyright (C) 2010 SERPRO - * ---------------------------------------------------------------------------- - * This file is part of Demoiselle Framework. - * - * Demoiselle Framework is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public License version 3 - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License version 3 - * along with this program; if not, see - * or write to the Free Software Foundation, Inc., 51 Franklin Street, - * Fifth Floor, Boston, MA 02110-1301, USA. - * ---------------------------------------------------------------------------- - * Este arquivo é parte do Framework Demoiselle. - * - * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou - * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação - * do Software Livre (FSF). - * - * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA - * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou - * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português - * para maiores detalhes. - * - * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título - * "LICENCA.txt", junto com esse programa. Se não, acesse - * ou escreva para a Fundação do Software Livre (FSF) Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. - */ -package org.demoiselle.jee.security; - -import javax.enterprise.util.Nonbinding; -import javax.interceptor.InterceptorBinding; -import java.lang.annotation.Inherited; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.TYPE; -import static java.lang.annotation.RetentionPolicy.RUNTIME; - -/** - * Indicates that a specific permission is required in order to invocate the annotated method or class. - * - * @author SERPRO - */ -@Inherited -@InterceptorBinding -@Target({ METHOD, TYPE }) -@Retention(RUNTIME) -public @interface RequiredPermission { - - @Nonbinding - String resource() default ""; - - @Nonbinding - String operation() default ""; -} diff --git a/security/src/main/java/org/demoiselle/jee/security/RequiredRole.java b/security/src/main/java/org/demoiselle/jee/security/RequiredRole.java deleted file mode 100644 index 798cf06..0000000 --- a/security/src/main/java/org/demoiselle/jee/security/RequiredRole.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Demoiselle Framework - * Copyright (C) 2010 SERPRO - * ---------------------------------------------------------------------------- - * This file is part of Demoiselle Framework. - * - * Demoiselle Framework is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public License version 3 - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License version 3 - * along with this program; if not, see - * or write to the Free Software Foundation, Inc., 51 Franklin Street, - * Fifth Floor, Boston, MA 02110-1301, USA. - * ---------------------------------------------------------------------------- - * Este arquivo é parte do Framework Demoiselle. - * - * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou - * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação - * do Software Livre (FSF). - * - * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA - * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou - * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português - * para maiores detalhes. - * - * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título - * "LICENCA.txt", junto com esse programa. Se não, acesse - * ou escreva para a Fundação do Software Livre (FSF) Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. - */ -package org.demoiselle.jee.security; - -import javax.enterprise.util.Nonbinding; -import javax.interceptor.InterceptorBinding; -import java.lang.annotation.Inherited; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.TYPE; -import static java.lang.annotation.RetentionPolicy.RUNTIME; - -/** - *

- * Indicates that the annotated method or class requires the user to have one or more roles associated in order to be - * invocated. - *

- * - * @author SERPRO - */ -@Inherited -@InterceptorBinding -@Target({ METHOD, TYPE }) -@Retention(RUNTIME) -public @interface RequiredRole { - - @Nonbinding - String[] value(); -} diff --git a/security/src/main/java/org/demoiselle/jee/security/SecurityContext.java b/security/src/main/java/org/demoiselle/jee/security/SecurityContext.java deleted file mode 100644 index 29e3760..0000000 --- a/security/src/main/java/org/demoiselle/jee/security/SecurityContext.java +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Demoiselle Framework - * Copyright (C) 2010 SERPRO - * ---------------------------------------------------------------------------- - * This file is part of Demoiselle Framework. - * - * Demoiselle Framework is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public License version 3 - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License version 3 - * along with this program; if not, see - * or write to the Free Software Foundation, Inc., 51 Franklin Street, - * Fifth Floor, Boston, MA 02110-1301, USA. - * ---------------------------------------------------------------------------- - * Este arquivo é parte do Framework Demoiselle. - * - * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou - * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação - * do Software Livre (FSF). - * - * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA - * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou - * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português - * para maiores detalhes. - * - * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título - * "LICENCA.txt", junto com esse programa. Se não, acesse - * ou escreva para a Fundação do Software Livre (FSF) Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. - */ -package org.demoiselle.jee.security; - -import java.io.Serializable; -import java.security.Principal; -import java.util.Map; -import java.util.Set; -import org.demoiselle.jee.security.exception.AuthorizationException; -import org.demoiselle.jee.security.exception.NotLoggedInException; - -/** - *

- * Structure used to handle both authentication and authorizations mechanisms. - *

- * - * @author SERPRO - */ -public interface SecurityContext extends Serializable { - - /** - * Checks if a specific user is logged in. - * - * @return {@code true} if the user is logged in - */ - boolean isLoggedIn(); - - /** - * @throws NotLoggedInException if there is no user logged in a specific - * session - */ - void checkLoggedIn(); - - /** - * Checks if the logged user has permission to execute an specific operation - * on a specific resource. - * - * @param resource resource to be checked - * @param operation operation to be checked - * @return {@code true} if the user has the permission - * @throws AuthorizationException When the permission checking fails, this - * exception is thrown. - * @throws NotLoggedInException if there is no user logged in a specific - * session. - */ - boolean hasPermission(String resource, String operation); - - /** - * Checks if the logged user has an specific role - * - * @param role role to be checked - * @return {@code true} if the user has the role - * @throws AuthorizationException When the permission checking fails, this - * exception is thrown. - * @throws NotLoggedInException if there is no user logged in a specific - * session. - */ - boolean hasRole(String role); - - /** - * Return the user logged in the session. - * - * @return the user logged in a specific authenticated session. If there is - * no active session {@code null} is returned. - */ - Principal getUser(); - - void setUser(Principal principal); - - String getToken(); - - void setToken(String token); - - void setRoles(Set roles); - - void setPermission(Map permissions); - - Set getResources(String operation); - - Set getOperations(String resources); - -} diff --git a/security/src/main/java/org/demoiselle/jee/security/Token.java b/security/src/main/java/org/demoiselle/jee/security/Token.java new file mode 100644 index 0000000..bb74006 --- /dev/null +++ b/security/src/main/java/org/demoiselle/jee/security/Token.java @@ -0,0 +1,37 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.demoiselle.jee.security; + +import java.security.Principal; +import javax.enterprise.context.RequestScoped; + +/** + * + * @author 70744416353 + */ +@RequestScoped +public class Token { + + private Principal principal; + private String key; + + public Principal getPrincipal() { + return principal; + } + + public void setPrincipal(Principal principal) { + this.principal = principal; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + +} diff --git a/security/src/main/java/org/demoiselle/jee/security/TokensManager.java b/security/src/main/java/org/demoiselle/jee/security/TokensManager.java deleted file mode 100644 index 27e7e6c..0000000 --- a/security/src/main/java/org/demoiselle/jee/security/TokensManager.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Demoiselle Framework - * Copyright (C) 2010 SERPRO - * ---------------------------------------------------------------------------- - * This file is part of Demoiselle Framework. - * - * Demoiselle Framework is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public License version 3 - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License version 3 - * along with this program; if not, see - * or write to the Free Software Foundation, Inc., 51 Franklin Street, - * Fifth Floor, Boston, MA 02110-1301, USA. - * ---------------------------------------------------------------------------- - * Este arquivo é parte do Framework Demoiselle. - * - * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou - * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação - * do Software Livre (FSF). - * - * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA - * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou - * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português - * para maiores detalhes. - * - * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título - * "LICENCA.txt", junto com esse programa. Se não, acesse - * ou escreva para a Fundação do Software Livre (FSF) Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. - */ -package org.demoiselle.jee.security; - -import java.io.Serializable; -import java.security.Principal; -import java.util.Map; -import java.util.Set; -import org.demoiselle.jee.security.exception.AuthorizationException; -import org.demoiselle.jee.security.exception.NotLoggedInException; - -/** - *

- * Structure used to handle both authentication and authorizations mechanisms. - *

- * - * @author SERPRO - */ -public interface TokensManager extends Serializable { - - Principal getUser(String token); - - String create(Principal user); - - void remove(String token); - - boolean validate(String token); - -} diff --git a/security/src/main/java/org/demoiselle/jee/security/annotations/LoggedIn.java b/security/src/main/java/org/demoiselle/jee/security/annotations/LoggedIn.java new file mode 100644 index 0000000..f8380f6 --- /dev/null +++ b/security/src/main/java/org/demoiselle/jee/security/annotations/LoggedIn.java @@ -0,0 +1,62 @@ +/* + * Demoiselle Framework + * Copyright (C) 2010 SERPRO + * ---------------------------------------------------------------------------- + * This file is part of Demoiselle Framework. + * + * Demoiselle Framework is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License version 3 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License version 3 + * along with this program; if not, see + * or write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + * ---------------------------------------------------------------------------- + * Este arquivo é parte do Framework Demoiselle. + * + * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou + * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação + * do Software Livre (FSF). + * + * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA + * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou + * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português + * para maiores detalhes. + * + * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título + * "LICENCA.txt", junto com esse programa. Se não, acesse + * ou escreva para a Fundação do Software Livre (FSF) Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. + */ + +package org.demoiselle.jee.security.annotations; + +import javax.interceptor.InterceptorBinding; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.ElementType.TYPE; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +/** + *

+ * Indicates that a specific permission is required in order to invocate the annotated method or class. + *

+ * + * @author SERPRO + */ + +@Inherited +@InterceptorBinding +@Target({ METHOD, TYPE }) +@Retention(RUNTIME) +public @interface LoggedIn { +} diff --git a/security/src/main/java/org/demoiselle/jee/security/annotations/RequiredPermission.java b/security/src/main/java/org/demoiselle/jee/security/annotations/RequiredPermission.java new file mode 100644 index 0000000..8642348 --- /dev/null +++ b/security/src/main/java/org/demoiselle/jee/security/annotations/RequiredPermission.java @@ -0,0 +1,65 @@ +/* + * Demoiselle Framework + * Copyright (C) 2010 SERPRO + * ---------------------------------------------------------------------------- + * This file is part of Demoiselle Framework. + * + * Demoiselle Framework is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License version 3 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License version 3 + * along with this program; if not, see + * or write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + * ---------------------------------------------------------------------------- + * Este arquivo é parte do Framework Demoiselle. + * + * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou + * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação + * do Software Livre (FSF). + * + * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA + * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou + * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português + * para maiores detalhes. + * + * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título + * "LICENCA.txt", junto com esse programa. Se não, acesse + * ou escreva para a Fundação do Software Livre (FSF) Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. + */ +package org.demoiselle.jee.security.annotations; + +import javax.enterprise.util.Nonbinding; +import javax.interceptor.InterceptorBinding; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.ElementType.TYPE; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +/** + * Indicates that a specific permission is required in order to invocate the annotated method or class. + * + * @author SERPRO + */ +@Inherited +@InterceptorBinding +@Target({ METHOD, TYPE }) +@Retention(RUNTIME) +public @interface RequiredPermission { + + @Nonbinding + String resource() default ""; + + @Nonbinding + String operation() default ""; +} diff --git a/security/src/main/java/org/demoiselle/jee/security/annotations/RequiredRole.java b/security/src/main/java/org/demoiselle/jee/security/annotations/RequiredRole.java new file mode 100644 index 0000000..7847dc0 --- /dev/null +++ b/security/src/main/java/org/demoiselle/jee/security/annotations/RequiredRole.java @@ -0,0 +1,65 @@ +/* + * Demoiselle Framework + * Copyright (C) 2010 SERPRO + * ---------------------------------------------------------------------------- + * This file is part of Demoiselle Framework. + * + * Demoiselle Framework is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License version 3 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License version 3 + * along with this program; if not, see + * or write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + * ---------------------------------------------------------------------------- + * Este arquivo é parte do Framework Demoiselle. + * + * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou + * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação + * do Software Livre (FSF). + * + * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA + * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou + * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português + * para maiores detalhes. + * + * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título + * "LICENCA.txt", junto com esse programa. Se não, acesse + * ou escreva para a Fundação do Software Livre (FSF) Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. + */ +package org.demoiselle.jee.security.annotations; + +import javax.enterprise.util.Nonbinding; +import javax.interceptor.InterceptorBinding; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.ElementType.TYPE; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +/** + *

+ * Indicates that the annotated method or class requires the user to have one or more roles associated in order to be + * invocated. + *

+ * + * @author SERPRO + */ +@Inherited +@InterceptorBinding +@Target({ METHOD, TYPE }) +@Retention(RUNTIME) +public @interface RequiredRole { + + @Nonbinding + String[] value(); +} diff --git a/security/src/main/java/org/demoiselle/jee/security/interceptor/LoggedInInterceptor.java b/security/src/main/java/org/demoiselle/jee/security/interceptor/LoggedInInterceptor.java index f812900..723f529 100644 --- a/security/src/main/java/org/demoiselle/jee/security/interceptor/LoggedInInterceptor.java +++ b/security/src/main/java/org/demoiselle/jee/security/interceptor/LoggedInInterceptor.java @@ -42,8 +42,8 @@ import javax.interceptor.AroundInvoke; import javax.interceptor.Interceptor; import javax.interceptor.InvocationContext; import java.io.Serializable; -import org.demoiselle.jee.security.LoggedIn; -import org.demoiselle.jee.security.SecurityContext; +import org.demoiselle.jee.security.annotations.LoggedIn; +import org.demoiselle.jee.security.interfaces.SecurityContext; /** *

diff --git a/security/src/main/java/org/demoiselle/jee/security/interceptor/RequiredPermissionInterceptor.java b/security/src/main/java/org/demoiselle/jee/security/interceptor/RequiredPermissionInterceptor.java index 6d33ecd..15e9009 100644 --- a/security/src/main/java/org/demoiselle/jee/security/interceptor/RequiredPermissionInterceptor.java +++ b/security/src/main/java/org/demoiselle/jee/security/interceptor/RequiredPermissionInterceptor.java @@ -14,8 +14,8 @@ import static javax.sql.rowset.spi.SyncFactory.getLogger; import org.demoiselle.jee.core.annotation.Name; import org.demoiselle.jee.core.util.ResourceBundle; import org.demoiselle.jee.core.util.Strings; -import org.demoiselle.jee.security.RequiredPermission; -import org.demoiselle.jee.security.SecurityContext; +import org.demoiselle.jee.security.annotations.RequiredPermission; +import org.demoiselle.jee.security.interfaces.SecurityContext; /** *

diff --git a/security/src/main/java/org/demoiselle/jee/security/interceptor/RequiredRoleInterceptor.java b/security/src/main/java/org/demoiselle/jee/security/interceptor/RequiredRoleInterceptor.java index 4a07df6..8706173 100644 --- a/security/src/main/java/org/demoiselle/jee/security/interceptor/RequiredRoleInterceptor.java +++ b/security/src/main/java/org/demoiselle/jee/security/interceptor/RequiredRoleInterceptor.java @@ -15,8 +15,8 @@ import java.util.List; import java.util.logging.Logger; import javax.inject.Inject; import org.demoiselle.jee.core.util.ResourceBundle; -import org.demoiselle.jee.security.RequiredRole; -import org.demoiselle.jee.security.SecurityContext; +import org.demoiselle.jee.security.annotations.RequiredRole; +import org.demoiselle.jee.security.interfaces.SecurityContext; /** *

diff --git a/security/src/main/java/org/demoiselle/jee/security/interfaces/SecurityContext.java b/security/src/main/java/org/demoiselle/jee/security/interfaces/SecurityContext.java new file mode 100644 index 0000000..f90ce8e --- /dev/null +++ b/security/src/main/java/org/demoiselle/jee/security/interfaces/SecurityContext.java @@ -0,0 +1,116 @@ +/* + * Demoiselle Framework + * Copyright (C) 2010 SERPRO + * ---------------------------------------------------------------------------- + * This file is part of Demoiselle Framework. + * + * Demoiselle Framework is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License version 3 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License version 3 + * along with this program; if not, see + * or write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + * ---------------------------------------------------------------------------- + * Este arquivo é parte do Framework Demoiselle. + * + * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou + * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação + * do Software Livre (FSF). + * + * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA + * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou + * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português + * para maiores detalhes. + * + * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título + * "LICENCA.txt", junto com esse programa. Se não, acesse + * ou escreva para a Fundação do Software Livre (FSF) Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. + */ +package org.demoiselle.jee.security.interfaces; + +import java.io.Serializable; +import java.security.Principal; +import java.util.Map; +import java.util.Set; +import org.demoiselle.jee.security.exception.AuthorizationException; +import org.demoiselle.jee.security.exception.NotLoggedInException; + +/** + *

+ * Structure used to handle both authentication and authorizations mechanisms. + *

+ * + * @author SERPRO + */ +public interface SecurityContext extends Serializable { + + /** + * Checks if a specific user is logged in. + * + * @return {@code true} if the user is logged in + */ + boolean isLoggedIn(); + + /** + * @throws NotLoggedInException if there is no user logged in a specific + * session + */ + void checkLoggedIn(); + + /** + * Checks if the logged user has permission to execute an specific operation + * on a specific resource. + * + * @param resource resource to be checked + * @param operation operation to be checked + * @return {@code true} if the user has the permission + * @throws AuthorizationException When the permission checking fails, this + * exception is thrown. + * @throws NotLoggedInException if there is no user logged in a specific + * session. + */ + boolean hasPermission(String resource, String operation); + + /** + * Checks if the logged user has an specific role + * + * @param role role to be checked + * @return {@code true} if the user has the role + * @throws AuthorizationException When the permission checking fails, this + * exception is thrown. + * @throws NotLoggedInException if there is no user logged in a specific + * session. + */ + boolean hasRole(String role); + + /** + * Return the user logged in the session. + * + * @return the user logged in a specific authenticated session. If there is + * no active session {@code null} is returned. + */ + Principal getUser(); + + void setUser(Principal principal); + + String getToken(); + + void setToken(String token); + + void setRoles(Set roles); + + void setPermission(Map permissions); + + Set getResources(String operation); + + Set getOperations(String resources); + +} diff --git a/security/src/main/resources/demoiselle-security-bundle.properties b/security/src/main/resources/demoiselle-security-bundle.properties deleted file mode 100644 index eb15108..0000000 --- a/security/src/main/resources/demoiselle-security-bundle.properties +++ /dev/null @@ -1,130 +0,0 @@ -# Demoiselle Framework -# Copyright (C) 2010 SERPRO -# ---------------------------------------------------------------------------- -# This file is part of Demoiselle Framework. -# -# Demoiselle Framework is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public License version 3 -# as published by the Free Software Foundation. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License version 3 -# along with this program; if not, see -# or write to the Free Software Foundation, Inc., 51 Franklin Street, -# Fifth Floor, Boston, MA 02110-1301, USA. -# ---------------------------------------------------------------------------- -# Este arquivo \u00E9 parte do Framework Demoiselle. -# -# O Framework Demoiselle \u00E9 um software livre; voc\u00EA pode redistribu\u00ED-lo e/ou -# modific\u00E1-lo dentro dos termos da GNU LGPL vers\u00E3o 3 como publicada pela Funda\u00E7\u00E3o -# do Software Livre (FSF). -# -# Este programa \u00E9 distribu\u00EDdo na esperan\u00E7a que possa ser \u00FAtil, mas SEM NENHUMA -# GARANTIA; sem uma garantia impl\u00EDcita de ADEQUA\u00C7\u00C3O a qualquer MERCADO ou -# APLICA\u00C7\u00C3O EM PARTICULAR. Veja a Licen\u00E7a P\u00FAblica Geral GNU/LGPL em portugu\u00EAs -# para maiores detalhes. -# -# Voc\u00EA deve ter recebido uma c\u00F3pia da GNU LGPL vers\u00E3o 3, sob o t\u00EDtulo -# "LICENCA.txt", junto com esse programa. Se n\u00E3o, acesse -# ou escreva para a Funda\u00E7\u00E3o do Software Livre (FSF) Inc., -# 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. - -version=${project.version} -engine-on=Iniciando o Demoiselle Framework ${project.version} (Neo) -resource-not-found=Arquivo {0} n\u00E3o foi encontrado -key-not-found=A chave {0} n\u00E3o foi encontrada -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. -ambiguous-bean-resolution=Falha ao obter {0} pois foi detectada ambiguidade nas seguintes implementa\u00E7\u00F5es\: {1} -bean-not-found=Voc\u00EA est\u00E1 tentando obter um objeto n\u00E3o reconhecido pelo CDI via Beans.getReference({0}) -store-not-found=O objeto do tipo [{0}] n\u00E3o pode ser armazenado no escopo indicado\: {1} -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} -handling-exception=Tratando a exce\u00E7\u00E3o {0} -taking-off=O Demoiselle ${project.version} decolou -engine-off=Desligando os motores do Demoiselle ${project.version} -setting-up-bean-manager=BeanManager dispon\u00EDvel atrav\u00E9s do utilit\u00E1rio {0} - -user-transaction-lookup-fail=N\u00E3o foi encontrada nenhuma transa\u00E7\u00E3o com o nome {0} no contexto JNDI -transactional-execution=Execu\u00E7\u00E3o transacional de {0} -begin-transaction=Transa\u00E7\u00E3o iniciada -transaction-marked-rollback=Transa\u00E7\u00E3o marcada para rollback [{0}] -transaction-already-finalized=A transa\u00E7\u00E3o j\u00E1 havia sido finalizada -transaction-commited=Transa\u00E7\u00E3o finalizada com sucesso -transaction-rolledback=Transa\u00E7\u00E3o finalizada com rollback - -bootstrap.configuration.processing=Processando {0} -bootstrap-context-already-managed=O contexto {0} para o escopo {1} j\u00E1 foi adicionado -bootstrap-context-added=Adicionando o contexto {0} para o escopo {1} - -loading-configuration-class=Carregando a classe de configura\u00E7\u00E3o {0} -configuration-field-loaded={0}: {2} -configuration-attribute-is-mandatory=A configura\u00E7\u00E3o {0} \u00E9 obrigat\u00F3ria, mas n\u00E3o foi encontrada em {1} -configuration-name-attribute-cant-be-empty=A nota\u00E7\u00E3o @Name n\u00E3o pode estar em branco -configuration-generic-extraction-error=Ocorreu um erro durante a extra\u00E7\u00E3o do tipo {0} com o extrator {1} -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. -configuration-key-not-found={0}\: [n\u00E3o encontrada] -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. -configuration-not-conversion=N\u00E3o \u00E9 poss\u00EDvel converter o valor {0} para o tipo {1} - -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 -executing-all=Executando m\u00E9todos anotados com @{0} -custom-context-selected=Produzindo inst\u00E2ncia do contexto {0} -custom-context-was-activated=O contexto {0} foi ativado para o escopo {1} -custom-context-was-deactivated=O contexto {0} foi desativado para o escopo {1} -custom-context-already-activated=N\u00E3o foi poss\u00EDvel ativar o contexto {0}, o escopo {1} j\u00E1 est\u00E1 ativo no contexto {2} -custom-context-not-found=N\u00E3o foi encontrado um contexto gerenciado do tipo [{0}] para o escopo [{1}] -custom-context-manager-not-initialized=ContextManager n\u00E3o foi inicializado. Chame [initialize] ao capturar o evento [AfterBeanDiscovery] em uma extens\u00E3o CDI - -error-creating-new-instance-for=Error creating a new instance for "{0}" -executed-successfully={0} execultado com sucesso -must-declare-one-single-parameter=Voc\u00EA deve declarar um par\u00E2metro \u00FAnico em {0} -loading-default-transaction-manager=Carregando o gerenciador de transa\u00E7\u00E3o padr\u00E3o {0} -results-count-greater-page-size=Quantidade de resultados {0} \u00E9 maior que o tamanho da p\u00E1gina {1} -page-result=Resultado paginado [p\u00E1gina\={0}, total de resultados\={1}] -pagination-not-initialized=Pagina\u00E7\u00E3o n\u00E3o inicializada. Inicialize o sistema de pagina\u00E7\u00E3o definindo a p\u00E1gina atual ou o total de resultados ao menos uma vez na requisi\u00E7\u00E3o. -pagination-invalid-value=Valor inv\u00E1lido para paginador: [{0}]. -page=P\u00E1gina [n\u00FAmero\={0}, tamanho\={1}] -processing=Processando\: {0} -processing-fail=Falha no processamento devido a uma exce\u00E7\u00E3o lan\u00E7ada pela aplica\u00E7\u00E3o -for= \ para\: -file-not-found=O arquivo {0} n\u00E3o foi encontrado - -adding-message-to-context=Adicionando uma mensagem no contexto: [{0}] -access-checking=Verificando permiss\u00E3o do usu\u00E1rio {0} para executar a a\u00E7\u00E3o {1} no recurso {2} -access-allowed=O usu\u00E1rio {0} acessou o recurso {2} com a a\u00E7\u00E3o {1} -access-denied=O usu\u00E1rio {0} n\u00E3o possui permiss\u00E3o para executar a a\u00E7\u00E3o {1} no recurso {2} -access-denied-ui=Voc\u00EA n\u00E3o est\u00E1 autorizado a executar a a\u00E7\u00E3o {1} no recurso {0} -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. -user-not-authenticated=Usu\u00E1rio n\u00E3o autenticado -invalid-credentials=Usu\u00E1rio ou senha inv\u00E1lidos -has-role-verification=Verificando se o usu\u00E1rio {0} possui a(s) role(s)\: {1} -does-not-have-role=Usu\u00E1rio {0} n\u00E3o possui a(s) role(s)\: {1} -does-not-have-role-ui=Para acessar este recurso \u00E9 necess\u00E1rio ser {0} -user-has-role=Usu\u00E1rio {0} possui a(s) role(s)\: {1} - -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. - -management-notification-attribute-changed=O atributo [{0}] da classe gerenciada [{1}] foi alterado -management-null-class-defined=O controlador de gerenciamento informado n\u00E3o pode ser [null] -management-abstract-class-defined=O controlador de gerenciamento [{0}] precisa ser uma classe concreta -management-no-annotation-found=Classe {0} precisa ser anotada com @ManagementController -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} -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 -management-introspection-error=Erro ao ler atributos da classe gerenciada {0} -management-type-not-found=A classe gerenciada informada n\u00E3o existe\: {0} -management-invoke-error=Erro ao tentar invocar a opera\u00E7\u00E3o "{0}" da classe gerenciada, a opera\u00E7\u00E3o n\u00E3o foi encontrada -management-write-value-error=N\u00E3o foi poss\u00EDvel definir um valor para a propriedade {0} -management-read-value-error=N\u00E3o foi poss\u00EDvel ler o valor da propriedade {0} -management-debug-acessing-property=Acessando propriedade {0} da classe gerenciada {1} -management-debug-setting-property=Definindo novo valor para propriedade {0} da classe gerenciada {1} -management-debug-invoking-operation=Invocando opera\u00E7\u00E3o {0} da classe gerenciada {1} -management-debug-starting-custom-context=Levantando contexto {0} para executar comando na classe gerenciada {1} -management-debug-stoping-custom-context=Desligando contexto {0} para classe gerenciada {1} -management-debug-registering-managed-type=Registrando classe gerenciada [{0}] -management-debug-processing-management-extension=Processando extens\u00E3o de gerenciamento [{0}] -management-debug-removing-management-extension=Desativando extens\u00E3o de gerenciamento [{0}] -management-validation-constraint-violation=Ocorreu um erro de valida\u00E7\u00E3o na classe [{0}] ao definir um valor para a propriedade [{1}]\: [{2}] -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 diff --git a/security/src/main/resources/demoiselle.properties b/security/src/main/resources/demoiselle.properties deleted file mode 100644 index e69de29..0000000 --- a/security/src/main/resources/demoiselle.properties +++ /dev/null diff --git a/security/src/main/resources/messages.properties b/security/src/main/resources/messages.properties new file mode 100644 index 0000000..fc646ec --- /dev/null +++ b/security/src/main/resources/messages.properties @@ -0,0 +1,12 @@ +adding-message-to-context=Adicionando uma mensagem no contexto: [{0}] +access-checking=Verificando permiss\u00e3o do usu\u00e1rio {0} para executar a a\u00e7\u00e3o {1} no recurso {2} +access-allowed=O usu\u00e1rio {0} acessou o recurso {2} com a a\u00e7\u00e3o {1} +access-denied=O usu\u00e1rio {0} n\u00e3o possui permiss\u00e3o para executar a a\u00e7\u00e3o {1} no recurso {2} +access-denied-ui=Voc\u00ea n\u00e3o est\u00e1 autorizado a executar a a\u00e7\u00e3o {1} no recurso {0} +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. +user-not-authenticated=Usu\u00e1rio n\u00e3o autenticado +invalid-credentials=Usu\u00e1rio ou senha inv\u00e1lidos +has-role-verification=Verificando se o usu\u00e1rio {0} possui a(s) role(s)\: {1} +does-not-have-role=Usu\u00e1rio {0} n\u00e3o possui a(s) role(s)\: {1} +does-not-have-role-ui=Para acessar este recurso \u00e9 necess\u00e1rio ser {0} +user-has-role=Usu\u00e1rio {0} possui a(s) role(s)\: {1} \ No newline at end of file diff --git a/ws/src/main/java/org/demoiselle/jee/ws/JaxRsFilter.java b/ws/src/main/java/org/demoiselle/jee/ws/JaxRsFilter.java index 951561a..e1b350d 100644 --- a/ws/src/main/java/org/demoiselle/jee/ws/JaxRsFilter.java +++ b/ws/src/main/java/org/demoiselle/jee/ws/JaxRsFilter.java @@ -44,6 +44,7 @@ public class JaxRsFilter implements ClientRequestFilter, ClientResponseFilter, C @Override public void filter(ContainerRequestContext requestContext, ContainerResponseContext response) { + response.getHeaders().putSingle("Demoiselle", "3.0.0"); response.getHeaders().putSingle("Access-Control-Allow-Origin", "*"); response.getHeaders().putSingle("Access-Control-Allow-Methods", "OPTIONS, GET, POST, PUT, DELETE"); response.getHeaders().putSingle("Access-Control-Allow-Headers", "Content-Type"); -- libgit2 0.21.2