Opa,
como comentei contigo por e-mail, estou de volta pra dar mais algumas informações a respeito da sua dúvida.
Vou tentar colocar uma visão geral de como esse esquema de permissão funciona. Maiores detalhes você pode encontrar no link: http://tomcat.apache.org/tomcat-4.1-doc/realm-howto.html , que eu postei antes.
Na verdade quem vai fazer a validação e descobrir que tipo de usuário está acessando a página é o próprio container.
Você precisa ter uma tabela adicional no seu banco, relacionada (não necessariamente com chaves estrangeiras ) com a tabela de usuários. Essa tabela vai guardar as informações dos perfis de seus usuários (ROLES). Um exemplo dessa tabela é dada no exemplo da página que lhe passei:
create table users (
user_name varchar(15) not null primary key,
user_pass varchar(15) not null
);
create table user_roles (
user_name varchar(15) not null,
role_name varchar(15) not null,
primary key (user_name, role_name)
);
A tabela “user_roles” é que vai guardar a informação do perfil (ou perfis, se um usuário puder ter mais de um) de seus usuários.
Com relação às configurações:
Exemplos:
web.xml
<!-- RESTRIÇÕES DE SEGURANÇA (aqui você indica quem pode acessar o quê)-->
<security-constraint>
<web-resource-collection>
<web-resource-name>Páginas de acesso restrito a Administradores</web-resource-name>
<url-pattern>/admin/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>administrador</role-name>
</auth-constraint>
</security-constraint>
<security-constraint>
<web-resource-collection>
<web-resource-name>Páginas de acesso acesso Restrito a Educadores, Administradores e Gerentes</web-resource-name>
<url-pattern>/educ/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>administrador</role-name>
<role-name>educador</role-name>
<role-name>gerente</role-name>
</auth-constraint>
</security-constraint>
<security-constraint>
<web-resource-collection>
<web-resource-name>Páginas de Acesso Restrito a Administradores e Gerentes</web-resource-name>
<url-pattern>/manag/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>administrador</role-name>
<role-name>gerente</role-name>
</auth-constraint>
</security-constraint>
<security-constraint>
<web-resource-collection>
<web-resource-name>Paginas de Acesso Comum</web-resource-name>
<url-pattern>/common/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>administrador</role-name>
<role-name>gerente</role-name>
<role-name>consultor</role-name>
<role-name>educador</role-name>
</auth-constraint>
</security-constraint>
<!-- MÉTODO DE LOGIN PARA VALIDAÇÃO DE ACESSO (aqui você indica o método de validação. use FORM para que você possa usar um formulário criado por você mesmo, e indique as páginas desse formulário, e uma para possível erro de login)-->
<login-config>
<auth-method>FORM</auth-method>
<form-login-config>
<form-login-page>/login.jsp</form-login-page>
<form-error-page>/loginInvalido.jsp</form-error-page>
</form-login-config>
</login-config>
<!-- ROLES (esses são os possíveis perfis de usuário do seu sistema)-->
<security-role>
<role-name>administrador</role-name>
</security-role>
<security-role>
<role-name>educador</role-name>
</security-role>
<security-role>
<role-name>gerente</role-name>
</security-role>
<security-role>
<role-name>consultor</role-name>
</security-role>
<!-- Welcome files (após a validação de acesso, o container saberá para onde direcionar o usuário, através dessa relação de páginas) -->
<welcome-file-list>
<welcome-file>index.jsf</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
Na página que você indicar para o método de login (no caso do exemplo login.jsp) lembre-se de colocar as seguintes informações, que serão usadas pelo container para identificar o que é nome de usuário e senha. O action “j_security_check” é importante para que se saiba que é o container que vai efetuar a validação, o campo com nome “j_username” indica qual é o campo que contém o nome de usuário e o campo “j_password” a senha:
<form method="post" action="j_security_check">
...
<input size="20" name="j_username" class="text">
...
<input type="password" size="10" name="j_password" class="text">
...
</form>
No server.xml você define um Resource para o seu banco:
server.xml
<GlobalNamingResources>
...
<Resource auth="Container" driverClassName="org.gjt.mm.mysql.Driver"
maxActive="30" maxIdle="10" maxWait="-1" name="jdbc/nome_data_source"
password="senha_usuario_banco" type="javax.sql.DataSource"
url="jdbc:mysql://localhost:3306/nome_banco"
username="nome_usuario_banco"/>
...
</GlobalNamingResources>
e um REALM
<Realm className="org.apache.catalina.realm.DataSourceRealm"
connectionName="nome_usuario_banco" connectionPassword="senha_usuario_banco"
connectionURL="jdbc:mysql://localhost:3306/nome_banco" dataSourceName="jdbc/nome_data_source"
debug="5" driverName="org.gjt.mm.mysql.Driver"
roleNameCol="use_rolename" userCredCol="use_password" userNameCol="use_name"
userRoleTable="user" userTable="user"/>
ps: observe que o REALM faz referência ao Resource declarado anteriormente: dataSourceName=“jdbc/nome_data_source” .
O REALM possui atributos que permitem identificar as tabelas e campos necessários para identificar o usuário e seu ROLE (ou ROLES):
roleNameCol - A coluna que contém o nome do ROLE
userCredCol - A coluna que possui a senha
userNameCol - A coluna que possui o nome de usuário
userRoleTable - A tabela que possui os ROLES
userTable - A tabela de usuários
alí no exemplo que coloquei, eu usei a mesma tabela de usuário para guardar a informação de ROLE, uma vez que nesse sistema em questão um usuário tem somente um tipo de acesso.
Se for pelo exemplo de colunas que postei no início, essa configuração seria a seguinte (referente a tabelas e campos):
<Realm className="org.apache.catalina.realm.DataSourceRealm" debug="99"
dataSourceName="java:/comp/env/jdbc/authority"
userTable="users" userNameCol="user_name" userCredCol="user_pass"
userRoleTable="user_roles" roleNameCol="role_name"/>
ps: Observe que nos casos acima, o tipo de REALM utilizado é “DataSourceRealm”. Na página que te passei há explicação específica para esse tipo de REALM.
para definir o ROLE, o container busca na tabela de ROLES um ROLE que atenda ao nome de usuário informado.
Bem, espero ter esclarecido um pouco mais.
Abraços e boa sorte!