Fórum projeto site do advogado #948
01/12/2008
Nome do projeto: SITE DO ADVOGADO
Resp: Wagner Siqueira.
Data início: 01/12/2008
Tecnologia utilizada: asp.net c# , mssql 2005, visual studio 2008
----
Estamos começando a desenvolver um sistema online denominado SITEDOADVOGADO, que funcionará da seguinte maneira:
area administrativa do sistema
- cadastro de processos
- clientes
- servicos
- financeiro
- GED
- funcionarios
area do cliente do advogado
- visualizacao dos processos
-visualização de movimentação
Na area administrativa do sistema o advogado responsavel podera cadastrar clientes e funcionarios.
esses funcionarios poderao ter permissao de visualização de telas, alteração e exclusao de registros.
A duvida é:
Qual seria a melhor maneira de projetar o sistema para ter esse controle por telas, menus e por acesso a botoes em telas para que o administrador do sistema possa dar acesso a usuarios e grupos de usuários. Como eu faria esse controle de telas e botoes não permitindo que outros usuarios visualizem telas e/ou botoes no qual nao tem direito.
lembrando que o sistema é online utilizando webforms asp.net com linguagem de programção c#.
Posts
Olá Valter,
A primeira coisa a fazer é modelar seu sistema de tal forma que seja possível desenvolver um nível de permissão para usuário bem específico. Sendo assim, uma maneira simples e que vai suprir suas necessidades é criando acessos para GRUPOS, onde cada grupo terá acesso a determinadas telas e determinados botões, e seus usuários serão inseridos nestes grupos.
Assim que o usuário logar no sistema, você deverá instanciar uma Session que recupera o GRUPO que o mesmo pertence cadastro no seu banco de dados.
Para cada grupo você deverá fazer o cadastro das telas e botões que o mesmo terá acesso, sendo que você também pode definir o tipo de acesso: Escrita, leitura ou nenhum.
De posse destas informações, que não vou entrar nos méritos de cadastro de usuários e como instanciar um GRUPO para os usuários, a primeira coisa a fazer é cadastrar o que eu vou chamar de SESSÕES de acesso, você deve criar uma tabela para tal:
Ex:
Tabela SESSAO:
Cod_sessao int;
Nom_Sessao varchar(255);
Montar a tela de cadastro:
INSERT INTO SESSAO VALUES (1, ADMINISTRADOR);
INSERT INTO SESSAO VALUES (2, ADVOGADO);
INSERT INTO SESSAO VALUES (3, ESTAGIARIO);
Então, um usuário fará parte de um grupo e este grupo terá diferentes tipos de combinação de acessos.
Estou desenvolvendo um exemplo pratico e te envio em breve.
Att,
Luiz Maia
Olá Valter,
Dando continuado ao desenvolvimento, segue a modelagem da parte de Perfil:
Seguindo o raciocínio:
Cada usuário terá um ID que identifica qual Perfil o mesmo pertence;
Na tabela SESSAO estarão todas as sessões (telas, botões e ECT);
Na tabela GRUPO_SESSAO, você terá as associações, por exemplo:
1. O Perfil de Advogado terá os seguintes acessos:
· Na Sessão NOM_SESSAO = ‘Cadastros Basicos’ onde seu COD_SESSAO = 1, o Perfil de ‘ADVOGADO’ terá acesso de escrita, ou seja IND_PERMISSAO = ‘E’
· Na Sessão NOM_SESSAO = ‘Relatorios’ onde seu COD_SESSAO = 2, o Perfil de ‘ADVOGADO’ terá acesso de leitura, ou seja IND_PERMISSAO = ‘L’
· Na Sessão NOM_SESSAO = ‘Cadastro de Usuario’ onde seu COD_SESSAO = 3, o Perfil de ‘ADVOGADO’ terá acesso negado, ou seja IND_PERMISSAO = ‘N’
Desde modo, você poderá customizar ao máximo seus webforms aspx da seguinte maneira:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
ConferePerfil();
}
}
protected void ConferePerfil()
{
// Nome da url da pagina
string dscPagina = "admin/cadastro1";
int codUsuario = Sessao.Usuario.IdUsuario;
char indPermissao = BusinessLogicLayerComponent.Perfil.Permissao(codUsuario, dscPagina);
switch (indPermissao)
{
case N: // Sem permissão na tela
btnExcluir.Enabled = false;
btnExcluir.ToolTip = "Sem permissão para esta ação.";
btnSalvar.Enabled = false;
btnSalvar.ToolTip = "Sem permissão para esta ação.";
Response.Redirect("../AcessoNegado.aspx");
break;
case L: // Permissão de somente leitura
btnExcluir.Enabled = false;
btnExcluir.ToolTip = "Sem permissão para esta ação.";
btnSalvar.Enabled = false;
btnSalvar.ToolTip = "Sem permissão para esta ação.";
break;
case S: // Permissão de salvar e editar
btnExcluir.Enabled = false;
btnExcluir.ToolTip = "Sem permissão para esta ação.";
btnSalvar.Enabled = true;
btnSalvar.ToolTip = "Salvar";
break;
case E: // Permissao de exclusao
btnExcluir.Enabled = true;
btnExcluir.ToolTip = "Excluir";
btnSalvar.Enabled = false;
btnSalvar.ToolTip = "Sem permissão para esta ação.";
break;
case T: // Permissão total
btnExcluir.Enabled = true;
btnExcluir.ToolTip = "Excluir";
btnSalvar.Enabled = true;
btnSalvar.ToolTip = "Salvar.";
break;
default:
btnExcluir.Enabled = false;
btnExcluir.ToolTip = "Sem permissão para esta ação.";
btnSalvar.Enabled = false;
btnSalvar.ToolTip = "Sem permissão para esta ação.";
break;
}
}
Método que busca o tipo de permissão na camada lógica:
public static char Permissao(int codUsuario, string dscPagina)
{
return DALC.Perfil.Permissao(codUsuario, dscPagina);
}
Método que busca o tipo de permissão na camada de dados:
public static char Permissao(int codUsuario, string dscPagina)
{
string codSessao = "";
codSessao = RetornaCodigoSessao(dscPagina);
Entity.DataClassesDataContext dataClass = new Entity.DataClassesDataContext();
var pa = from gs in dataClass.GRUPO_SESSAOs
join pf in dataClass.Perfils on gs.PER_SEQ equals pf.Id
join us in dataClass.Usuarios on gs.PER_SEQ equals us.IdPerfil
join ss in dataClass.SESSAOs on gs.COD_SESSAO equals ss.COD_SESSAO
where
(us.Id.Equals(codUsuario)) &&
(ss.COD_SESSAO.Equals(codSessao))
select new
{
IndPermissao = gs.IND_PERMISSAO
};
try
{
return pa.First().IndPermissao;
}
catch
{
return N;
}
}
Método que retorna o código da Sessão usado acima para trazer em qual sessão a página acessada se encontra:
// Este método deve OBRIGATORIAMENTE ser sincronizado com a base de dados
// Tabela: "dbo".sessao
private static string RetornaCodigoSessao(string PaginaAtual)
{
string codSessao = "";
if (PaginaAtual != null)
{
//Cadastros: Atividade
else if (PaginaAtual.ToLower().IndexOf("atividade/cadastraratividade") != -1) codSessao = "01";
else if (PaginaAtual.ToLower().IndexOf("atividade/pesquisaratividade") != -1) codSessao = "01";
//Cadastros: Cargo
else if (PaginaAtual.ToLower().IndexOf("cargo/cadastrarcargo") != -1) codSessao = "02";
else if (PaginaAtual.ToLower().IndexOf("cargo/pesquisarcargo") != -1) codSessao = "02";
//Cadastros: Estado
else if (PaginaAtual.ToLower().IndexOf("estado/cadastrarestado") != -1) codSessao = "03";
else if (PaginaAtual.ToLower().IndexOf("estado/pesquisarestado") != -1) codSessao = "03";
//Cadastros: Municipio
else if (PaginaAtual.ToLower().IndexOf("municipio/cadastrarmunicipio") != -1) codSessao = "04";
else if (PaginaAtual.ToLower().IndexOf("municipio/pesquisarmunicipio") != -1) codSessao = "04";
//Cadastros: Perfil
else if (PaginaAtual.ToLower().IndexOf("perfil/cadastrarperfil") != -1) codSessao = "05";
else if (PaginaAtual.ToLower().IndexOf("perfil/pesquisarperfil") != -1) codSessao = "05";
else if (PaginaAtual.ToLower().IndexOf("perfil/cadastrarpermissoes") != -1) codSessao = "05";
//Cadastros: Projeto
else if (PaginaAtual.ToLower().IndexOf("projeto/cadastrarprojeto") != -1) codSessao = "06";
else if (PaginaAtual.ToLower().IndexOf("projeto/pesquisarprojeto") != -1) codSessao = "06";
else if (PaginaAtual.ToLower().IndexOf("projeto/cadastraratividade") != -1) codSessao = "06";
else if (PaginaAtual.ToLower().IndexOf("projeto/pesquisaratividade") != -1) codSessao = "06";
}
return codSessao;
}
Agora é so montar uma tela onde o ADMINISTRADOR fará as associações para os Perfis/Telas, como sugestão segue a estrutura:
Onde:
lbPerfil = Perfil a ser editado
Salvar = botão que salva as configurações
Grid[Código] = Código da sessão na base de dados (tabela SESSAO)
Grid[Sessão] = Nome da sessão na base de dados (tabela SESSAO)
Grid[Permissões] = Dropdownlist com opções de acesso (Escrita, leitura, nenhuma, total e etc)
Todo o código será disponibilizado para você numa área de FTP.
Sei que pode parecer um pouco complicado agora, mas assim que iniciar o desenvolvimento vai perceber os macetes para codificação.
Estou usando o MS Linq nos exemplos, sugiro que uso o mesmo no seu projeto, qualquer dúvida existem vários videos e artigos no site sobre o mesmo.
Aguardo seu retorno e estou a disposição para qualquer dúvida.
Abraços
Luiz Maia
Olá Valter,
Segue o link com o código fonte do qual mencionei no post anterior.
http://video.devmedia.com.br/naoexclusivo/LuizMaia/Consultoria/Chamado948-LuizMaia.zip
Aguardo seu retorno.
Abraços
Att,
Luiz Maia
Olá Valter,
Considerando que não obtivemos retorno, estamos considerando o chamado encerrado.
De qualquer forma continuamos a sua disposição para eventuais dúvidas.
Abraços
Att,
Luiz Maia
05/12/2008
Valter Ferreira
desculpe a demora pela resposta. estava viajando.
Obrigado, vou testar aqui, qualquer duvida abro outro chamado.
Blz Valter,
Estamos a disposição.
Abraços
Att,
Luiz Maia
Valter,
Espero que tenha resolvido seu problema.
De qualquer forma, continuamos a sua disposição para qualquer dúvida.
Abraços
Att,
Luiz Maia