Fórum Controle de Acesso por classes #496444

02/10/2014

0

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

Responder

Posts

02/10/2014

Ronaldo Lanhellas

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.
Responder

Gostei + 0

02/10/2014

John Lima

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.
Responder

Gostei + 0

02/10/2014

John Lima

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.
Responder

Gostei + 0

03/10/2014

Ronaldo Lanhellas

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.
Responder

Gostei + 0

03/10/2014

John Lima

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
Responder

Gostei + 0

03/10/2014

Ronaldo Lanhellas

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.
Responder

Gostei + 0

03/10/2014

John Lima

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)
Responder

Gostei + 0

06/10/2014

Ronaldo Lanhellas

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

Gostei + 0

06/10/2014

John Lima

@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;
}
Responder

Gostei + 0

07/10/2014

Ronaldo Lanhellas

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;
Responder

Gostei + 0

07/10/2014

John Lima

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
Responder

Gostei + 0

07/10/2014

Ronaldo Lanhellas

Você tentou adicionar junto com o @XmlElementWrapper ? Ambas as anotações ?
Responder

Gostei + 0

08/10/2014

John Lima

não removi e adicione a que você sugeriu e também tentei com as duas
Responder

Gostei + 0

08/10/2014

Ronaldo Lanhellas

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

Gostei + 0

08/10/2014

John Lima

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

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar