Controle de Acesso por classes

Java

02/10/2014

Como as tabelas do banco sãp definidas atraves das entidades criadas gostaria de saber como eu fari pra determina o que cada usuário pode fazer com cada Entidade(tabela banco)
John Lima

John Lima

Curtidas 0

Respostas

Ronaldo Lanhellas

Ronaldo Lanhellas

02/10/2014

Como as tabelas do banco sãp definidas atraves das entidades criadas gostaria de saber como eu fari pra determina o que cada usuário pode fazer com cada Entidade(tabela banco)


Bom, existem 1 milhão de formas de fazer isso. Você pode fazer controle de acesso por Menu, por ação, por método, por Entidade (como você sugeriu). E para cada um desses tipos existem mais 1 milhão de formas de construir o controle de acesso. O ideal é que você poste sua ideia para que possamos lhe ajudar a evoluir.
GOSTEI 0
John Lima

John Lima

02/10/2014

Obviamente eu teria uma entidade Usuario onde eu teria um atributo List<PermissaoUsuario> permissoes, onde a entidade Permissao Usuario teria os atributos

id;
sistema (Tabela do banco,ou a Entidade)
codigo(codigo da tabela);
visualização booleano
inclusao booleano
alteracao booleano
todos booleano

Então quando eu fosse abri a tela para cadastro o sistema iria fazer uma busca,do código da tabela.
GOSTEI 0
John Lima

John Lima

02/10/2014

Obviamente eu teria uma entidade Usuario onde eu teria um atributo List<PermissaoUsuario> permissoes, onde a entidade Permissao Usuario teria os atributos

id;
sistema (Tabela do banco,ou a Entidade)
codigo(codigo da tabela);
visualização booleano
inclusao booleano
alteracao booleano
todos booleano

Então quando eu fosse abri a tela para cadastro o sistema iria fazer uma busca,do código da tabela.
GOSTEI 0
Ronaldo Lanhellas

Ronaldo Lanhellas

02/10/2014

Então acho que a melhor opção seria cadastrar por "formulário" e não por entidade. Imagine a entidade: "Pessoa", você não precisa mapear na permissão. Você poderia criar um algoritmo para "varrer" todo o formulário existente no seu projeto e você permitir ou não o uso deles por determinado grupo de usuário, ou criar um arquivo ".xml" que contenha o nome de todos os formulários e os atributos necessários.
GOSTEI 0
John Lima

John Lima

02/10/2014

acho que com o arquivo xml seria mais legal, porem não tem ideia de como fazer até porque antes eu controlava por perfil de usuário o que deixa bem limitado as permissões
GOSTEI 0
Ronaldo Lanhellas

Ronaldo Lanhellas

02/10/2014

Bom, se você quiser fazer por XML (deixando mais organizado) pode começar com:

1 - Estudando a estrutura do XML : http://www.oficinadanet.com.br/artigo/402/estrutura_de_um_arquivo_xml
2 - Depois de entender a estrutura e criar um XML que contenha todos os seus formulários, você precisa saber como ler esses dados em Java, então: https://www.devmedia.com.br/manipulando-arquivos-xml-em-java/3245
3 - Por fim, basta você trabalhar com os dados que você obteve da leitura do passo 2 e aplicar a perfis de usuário.
GOSTEI 0
John Lima

John Lima

02/10/2014

diante desse artigo optei por usar o Xstream, assim tenho a opçao de gera o xml dinamicamente através de uma classe, obtive esse resultado

<telas>
<tela>
<id>2</id>
<descricao>banco</descricao>
<permisoes>
<permisao>INSERIR</permisao>
<permisao>ALTERAR</permisao>
<permisao>REMOVER</permisao>
<permisao>PESQUISAR</permisao>
<permisao>TODOS</permisao>
</permisoes>
</tela>
<tela>
<id>1</id>
<descricao>usuario</descricao>
<permisoes reference="../../tela/permisoes"/>
</tela>
</telas>

porem quando eu uso o método a baixo para o arquivo é gerado uma exceção :


public static void lerXML() {
try {
XStream xStream = new XStream(new Dom4JDriver());
xStream.alias("telas", ArrayList.class);
xStream.processAnnotations(Tela.class);

BufferedReader input = new BufferedReader(new FileReader("src/Permissao.xml"));
ArrayList<Tela> telas = (ArrayList) xStream.fromXML(input);
input.close();

for (Tela tela : telas) {
System.out.println("Codigo" + tela.getId()+ " - " +tela.getTela());
}

} catch (IOException ex) {
ex.printStackTrace();
}
}

Exception in thread "main" com.thoughtworks.xstream.converters.ConversionException: tela : tela : tela : tela
---- Debugging information ----
message : tela : tela
cause-exception : com.thoughtworks.xstream.mapper.CannotResolveClassException
cause-message : tela : tela
class : java.util.ArrayList
required-type : java.util.ArrayList
path : /telas/tela
xpath : /telas/tela
-------------------------------
at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:89)
at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:63)
at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:76)
at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:60)
at com.thoughtworks.xstream.core.TreeUnmarshaller.start(TreeUnmarshaller.java:137)
at com.thoughtworks.xstream.core.AbstractTreeMarshallingStrategy.unmarshal(AbstractTreeMarshallingStrategy.java:33)
at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:923)
at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:909)
at com.thoughtworks.xstream.XStream.fromXML(XStream.java:853)
at com.br.emobeli.util.MetodosDiversos.lerXML(MetodosDiversos.java:29)
at com.br.emobeli.util.MetodosDiversos.main(MetodosDiversos.java:41)
Caused by: com.thoughtworks.xstream.mapper.CannotResolveClassException: tela : tela
at com.thoughtworks.xstream.mapper.DefaultMapper.realClass(DefaultMapper.java:68)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
at com.thoughtworks.xstream.mapper.DynamicProxyMapper.realClass(DynamicProxyMapper.java:71)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
at com.thoughtworks.xstream.mapper.PackageAliasingMapper.realClass(PackageAliasingMapper.java:88)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
at com.thoughtworks.xstream.mapper.ClassAliasingMapper.realClass(ClassAliasingMapper.java:86)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
at com.thoughtworks.xstream.mapper.ArrayMapper.realClass(ArrayMapper.java:96)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
at com.thoughtworks.xstream.mapper.CachingMapper.realClass(CachingMapper.java:52)
at com.thoughtworks.xstream.core.util.HierarchicalStreams.readClassType(HierarchicalStreams.java:29)
at com.thoughtworks.xstream.converters.collections.AbstractCollectionConverter.readItem(AbstractCollectionConverter.java:70)
at com.thoughtworks.xstream.converters.collections.CollectionConverter.populateCollection(CollectionConverter.java:68)
at com.thoughtworks.xstream.converters.collections.CollectionConverter.unmarshal(CollectionConverter.java:61)
at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:82)
GOSTEI 0
Ronaldo Lanhellas

Ronaldo Lanhellas

02/10/2014

Imagino que tenha usado anotação para mapear uma classe para o XML, poste aqui como sua classe ficou anotada.
GOSTEI 0
John Lima

John Lima

02/10/2014

@XStreamAlias("telas")
@XmlRootElement
public class Tela implements Serializable {

@XmlAttribute
private Integer id;
@XmlElement
private String descricao;
@XmlElementWrapper
private List<Permissao> permisoes;

public Tela() {
}

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public String getDescricao() {
return descricao;
}

public void setDescricao(String descricao) {
this.descricao = descricao;
}

@XmlTransient
public List<Permissao> getPermisoes() {
return permisoes;
}

public void setPermisoes(List<Permissao> permisoes) {
this.permisoes = permisoes;
}
GOSTEI 0
Ronaldo Lanhellas

Ronaldo Lanhellas

02/10/2014

No seu atributo List adicione a anotação @XStreamImplicit(itemFieldName = "permissoes"). assim:

@XStreamAlias("telas")
@XmlRootElement
public class Tela implements Serializable {

@XmlAttribute
private Integer id;
@XmlElement
private String descricao;
@XStreamImplicit(itemFieldName = "permissoes")
private List<Permissao> permisoes;
GOSTEI 0
John Lima

John Lima

02/10/2014

ainda permanece o mesmo erro, eu vi uma matéria aqui no portal que quando eu estou lendo um arquivo xml ele retorna um objeto, assim seria necessário o uso de um conversor
GOSTEI 0
Ronaldo Lanhellas

Ronaldo Lanhellas

02/10/2014

Você tentou adicionar junto com o @XmlElementWrapper ? Ambas as anotações ?
GOSTEI 0
John Lima

John Lima

02/10/2014

não removi e adicione a que você sugeriu e também tentei com as duas
GOSTEI 0
Ronaldo Lanhellas

Ronaldo Lanhellas

02/10/2014

Sendo assim, creio que nesse caso você terá que criar seu próprio conversor. Veja: http://xstream.codehaus.org/converter-tutorial.html
GOSTEI 0
John Lima

John Lima

02/10/2014

você aconselharia uma outra maneira de controla as restrição de acesso ?
GOSTEI 0
Ronaldo Lanhellas

Ronaldo Lanhellas

02/10/2014

você aconselharia uma outra maneira de controla as restrição de acesso ?


Se você está trabalhando com WEB, pode usar o controle por URL. Cadastra as URL's como componentes e controla o acesso a elas.
GOSTEI 0
John Lima

John Lima

02/10/2014

è aplicação desktop, eu ate tentei usar um converte mais da erro de cast
GOSTEI 0
John Lima

John Lima

02/10/2014

è aplicação desktop, eu ate tentei usar um converte mais da erro de cast
GOSTEI 0
Ronaldo Lanhellas

Ronaldo Lanhellas

02/10/2014

è aplicação desktop, eu ate tentei usar um converte mais da erro de cast


Bom, você pode tentar fazer uso do Java Reflection, varrendo todas as suas classes e buscando as que herdam de um JFrame, por exemplo. Quando encontrar, você adiciona esta classe a uma lista de componentes. Veja um exemplo: http://code.google.com/p/reflections/
GOSTEI 0
John Lima

John Lima

02/10/2014

poderia demonstra algum exemplo? essas aulas da devmedia ajudaria a enteder mais o conceito https://www.devmedia.com.br/curso/java-reflection-api/362
GOSTEI 0
Ronaldo Lanhellas

Ronaldo Lanhellas

02/10/2014

poderia demonstra algum exemplo? essas aulas da devmedia ajudaria a enteder mais o conceito https://www.devmedia.com.br/curso/java-reflection-api/362


No link que lhe mandei tem exemplos de como usar e neste curso da devmedia também está bem explicado. Como é um assunto abrangente, não da para explicar em detalhes aqui pelo fórum.
GOSTEI 0
John Lima

John Lima

02/10/2014

vou estudar o material da Devmedia e ver o que consigo fazer. Ronaldo dentro desse tópico posso tira uma duvida sobre Hibernate? o
é o seguinte eu tenho a seguinte query:

select distinct c.subGrupo.subGrupo,(select sum(cp.valor)from ContaPagar cp where cp.subGrupo.subGrupo=c.subGrupo.subGrupo) from ContaPagar c ");

diante dessa query o Hibernate não me traz um objeto do tipo ContaPagar mais sim apenas um objeto, como eu faria para acessa esses valores dentro de laço já que eu não posso usar um for(ContaPagar: contas){

}
GOSTEI 0
Ronaldo Lanhellas

Ronaldo Lanhellas

02/10/2014

vou estudar o material da Devmedia e ver o que consigo fazer. Ronaldo dentro desse tópico posso tira uma duvida sobre Hibernate? o
é o seguinte eu tenho a seguinte query:

select distinct c.subGrupo.subGrupo,(select sum(cp.valor)from ContaPagar cp where cp.subGrupo.subGrupo=c.subGrupo.subGrupo) from ContaPagar c ");

diante dessa query o Hibernate não me traz um objeto do tipo ContaPagar mais sim apenas um objeto, como eu faria para acessa esses valores dentro de laço já que eu não posso usar um for(ContaPagar: contas){

}


Entendo que sua query está retornando um objeto do tipo SubGrupo, mas não entendi qual a necessidade do seu laço FOR. Explique melhor por gentileza.
GOSTEI 0
John Lima

John Lima

02/10/2014

acho que ele não retorna um objeto do tipo subgrupo mesmo porque no meu método eu definir para retorna um contas a pagar :

public List<ContaPagar> getBySubGrupoTotal() {
return getList(ContaPagar.class,"select distinct c.subGrupo.subGrupo,(select sum(cp.valor)from ContaPagar cp where cp.subGrupo.subGrupo=c.subGrupo.subGrupo) from ContaPagar c ");
}
eu fiz essa mesma consulta direto no banco, e eu recebo apenas 2 colunas.

subgrupo valor
alimentaçao 1.000
compras 10.000

quero esses valores para gera um grafico
GOSTEI 0
Ronaldo Lanhellas

Ronaldo Lanhellas

02/10/2014

Da forma que você ta fazendo não há como retornar para um ContaPagar.class, por dois motivos:

1 - Você está retornando um atributo da classe ContaPagar;
2 - Você está criando uma nova coluna com o sum(cp.valor);

Você precisar usar um Map para fazer este tipo de retorno ou retornar apenas o objeto ContaPagar.

return getList(ContaPagar.class,"select distinct c from ContaPagar cp where cp.subGrupo.subGrupo=c.subGrupo.subGrupo) from ContaPagar c ");
GOSTEI 0
John Lima

John Lima

02/10/2014

e como ficara o uso de map par esse caso ?
GOSTEI 0
Ronaldo Lanhellas

Ronaldo Lanhellas

02/10/2014

e como ficara o uso de map par esse caso ?


Tente assim:

return getList(Map.class,"select new Map(distinct c.subGrupo.subGrupo as subgrupo, ,(select sum(cp.valor)from ContaPagar cp where cp.subGrupo.subGrupo=c.subGrupo.subGrupo) as soma ) from ContaPagar c ");
GOSTEI 0
John Lima

John Lima

02/10/2014

Realmente ele retorna uma lista de Map, porem ainda não consigo acessar seus valores
GOSTEI 0
John Lima

John Lima

02/10/2014

Ja tentei de todas as maneiras que eu conheço para acessar os valores tanto do Map agora ou de um array de objetos e tenho um erro ao fazer um cast
GOSTEI 0
John Lima

John Lima

02/10/2014

Ronaldo conseguir obter os valores não sei se seria um método elegante, porem estou conseguindo

List<Object> sub = controle.getBySubGrupoTotal();
        //Object obj[] = sub.toArray();

        List<ValoresSubgrupo> lista = new LinkedList<>();
        Iterator itr = sub.iterator();
        while (itr.hasNext()) {
            Object[] obj = (Object[]) itr.next();
            //now you have one array of Object for each row
            String sub= String.valueOf(obj[0]);
            double valor = Double.parseDouble(String.valueOf(obj[1]));
            ValoresSubgrupo v = new ValoresSubgrupo();
            v.setSubgrupo(sub);
            v.setValor(valor);
            lista.add(v);
        }

GOSTEI 0
Ronaldo Lanhellas

Ronaldo Lanhellas

02/10/2014

O melhor seria você mudar o tipo de retorno do seu método para:

public Map getBySubGrupoTotal() {


E depois você recupera assim:

Map retornoMap = getBySubGrupoTotal();
Subgrupo sub = retornoMap.get("subgrupo");
double soma = retornoMap.get("soma");
GOSTEI 0
Ronaldo Lanhellas

Ronaldo Lanhellas

02/10/2014

O melhor seria você mudar o tipo de retorno do seu método para:

public Map getBySubGrupoTotal() {


E depois você recupera assim:

Map retornoMap = getBySubGrupoTotal();
Subgrupo sub = retornoMap.get("subgrupo");
double soma = retornoMap.get("soma");
GOSTEI 0
Ronaldo Lanhellas

Ronaldo Lanhellas

02/10/2014

O melhor seria você mudar o tipo de retorno do seu método para:

public Map getBySubGrupoTotal() {


E depois você recupera assim:

Map retornoMap = getBySubGrupoTotal();
Subgrupo sub = retornoMap.get("subgrupo");
double soma = retornoMap.get("soma");
GOSTEI 0
John Lima

John Lima

02/10/2014

Entendo no caso uma lista já que sao mais de um valor
GOSTEI 0
Ronaldo Lanhellas

Ronaldo Lanhellas

02/10/2014

Entendo no caso uma lista já que sao mais de um valor


isso, acabei esquecendo o List. Nesse caso retorne um "List<Map>"
GOSTEI 0
John Lima

John Lima

02/10/2014

Ronaldo muito obrigado pela ajuda. tem tópico que criei sobre o arquivo de persistência se puder me ajudar ficaria muito grato.
GOSTEI 0
Ronaldo Lanhellas

Ronaldo Lanhellas

02/10/2014

Ronaldo muito obrigado pela ajuda. tem tópico que criei sobre o arquivo de persistência se puder me ajudar ficaria muito grato.


Qual o link do tópico ?
GOSTEI 0
POSTAR