Você está certo, proteger uma página e proteger elementos é diferente.
Na minha opinião e na prática, acho que vincular qualquer código a uma função ou usuário é realmente a abordagem errada. Em vez disso, vincule permissões a elementos e páginas - depois vincule funções a essas permissões. E, claro, os usuários têm funções atribuídas.
É importante ter os três:
- Usuários
- Funções
- Permissões <-- é isso que você está perdendo
Permissões são elementos e páginas seguros, não funções ou usuários Seu código não deve ter ideia (porque não precisa) de quais usuários ou funções existem - apenas nomes de permissões.
Quando um usuário faz login, eu pego sua(s) função(ões). Então eu pego todas as permissões que são atribuídas a essas funções (simplesmente uma lista de valores de string).
Por exemplo, em uma página eu poderia ter:
- Adicionar item
- Ver item
- Excluir item
Quando codifico essa página, na verdade protejo cada um desses elementos com strings de permissão com nomes semelhantes ( addItem, viewItem, deleteItem).
<cfif listContainsNoCase( session.permissions, 'addItem' )>
<!--- code to add item --->
</cfif>
(Nota:eu recomendo usar uma tag ou função personalizada para isso, mas para fins de exemplo, o acima funciona bem).
Se você fizer dessa maneira, fornecerá máxima flexibilidade e abstração. Se você protege elementos com base em funções, você se limita a:
- Adicionar novas funções exigirá muitas alterações de código!
- Alterar permissões entre funções requer muitas alterações de código!
Se você fizer como mencionado acima, nunca precisará alterar seu código de segurança dentro da base de código, pois a permissão "addItem" deve estar sempre na lógica "add item", certo? :)
Agora, se você precisar criar uma função do tipo "gerente", que tenha todas as funções de usuário e alguns direitos de administrador selecionados, basta criar essa função e atribuir as permissões corretas (talvez addItem e editItem, mas não deleteItem) . Bam! Agora tenho uma função de gerente para atribuir aos usuários sem nenhuma alteração de código !
Se eu tivesse polvilhado meu código com o tipo de coisa "é usuário esta função" - eu teria que editar meu código em todos os lugares para permitir minha nova função "gerente" - eca!
Faz sentido?
=)