É uma questão complicada essa.
Aqui faço tudo baseado em opções do menu, e cada um tem seu nome.
A configuração de acessos tem a cópia do menu pra escolher entre sim/não, por usuário.
Qualquer dia adiciono opção de grupos, pra configurar acesso de um grupo, e cadastrar usuários em determinados grupos.
Há pouco tempo acrescentei a opção do usuário *.*, que define opções de acesso geral.
A checagem é simples: if TemAcesso("nomeopcao")
Código: Selecionar todos
FUNCTION TemAcesso( cNomeOpcao )
LOCAL lTemAcesso := .T.
IF .NOT. Encontra( AppUserName() + cNomeOpcao, "senhas" )
IF .NOT. Encontra( "*.*" + cNomeOpcao, "senhas" )
lValue := .F.
ENDIF
ENDIF
RETURN lTemAcesso
Tenho uma opção especial no menu, aonde acrescento opções não visíveis, só pra usar a mesma rotina de configuração.
Por exemplo, se pode confirmar pedido sem saldo em estoque, idem com cliente devendo, etc.
Então na configuração é escolher o usuário, e nas opções do menu escolher entre sim/não.
Nessa mesma configuração dá pra fazer o contrário: a partir de uma opção ver/configurar usuários que podem acessar.
Para o que falei sobre grupo, faltaria eu criar a opção de criar grupos e usuários de cada grupo.
A checagem do grupo substituiria o "*.*" , sendo que "*.*" seria o grupo geral.
A checagem não é o problema, mas sim a configuração ficar fácil pro usuário.
Por eu usar uma cópia no estilo do menu, acaba sendo no estilo que estão acostumados.
Como meu menu é um array, a rotina de configuração apenas usa o array do menu pra permitir configurar.
Tenho lá:
- meu usuário - ele é nível máximo, e não depende de configuração
- usuário administrador - a única diferença é ter acesso ao módulo de configurar usuários, e acaba tendo acesso a algo mais
- usuário comum - só tem acesso ao que liberarem pra ele
- *.* - equivale a "qualquer um". liberou pra este liberou pra todos
E o menu... se o usuário não tiver acesso a determinada opção, ela nem aparece.
Não é dos melhores, mas tá funcionando e não requer nenhuma mudança ao criar novas opções.