javando, o JAAS faz tudo isso que você quer. Só que você precisa entender melhor o conceito.
Você pode usar tanto basic como digest. Ambas aparecem aquele dialog para digitar user/senha. Porém o basic é senha plana, já o digest trafega a senha criptografada. Você pode usar o form também da mesma forma que o basic e digest, basta alterar no web.xml para form e definir os jsps de login e erro de login.
Quando ao acesso a banco, o JAAS permite acesso no banco de dados com ou sem critografica, além de acesso a senhas em arquivos, ldap... e alguns mais. Tudo muito configurável.
Abaixo um exemplo do meu formulário de login via JAAS. Comentei para você entender.
web.xml
<login-config>
<auth-method>FORM</auth-method> <!-- usa formulario -->
<realm-name>esim-jaas-realm</realm-name>
<form-login-config>
<form-login-page>/WEB-INF/jspx/form-login.jspx</form-login-page> <!-- pagina de login -->
<form-error-page>/WEB-INF/jspx/form-login.jspx?error=true</form-error-page> <!-- quando der erro vem para cá -->
</form-login-config>
</login-config>
<security-constraint>
<web-resource-collection>
<url-pattern>/*</url-pattern> <!-- todos links são seguros -->
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint> <!-- minhas roles -->
<role-name>ROLE_ADMIN</role-name>
<role-name>ROLE_SINGLEUSER</role-name>
<role-name>ROLE_OPERATOR</role-name>
</auth-constraint>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee> <!-- acesso somente via HTTPS -->
</user-data-constraint>
</security-constraint>
form-login.jspx
<form method="post" action="j_security_check">
Username <input type="text" name="j_username" /> <br />
Password <input type="password" name="j_password" /><br />
<input type="submit" />
</form>
Arquivo de configuração do JAAS no glassfish
<auth-realm classname="com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm" name="esim-jaas-realm">
<property name="user-name-column" value="userid"/>
<property name="digest-algorithm" value="md5"/> <!-- criptografia de senha md5 -->
<property name="password-column" value="password"/>
<property name="group-name-column" value="groupid"/>
<property name="datasource-jndi" value="jdbc/esimOracleDS"/><!-- meu datasource -->
<property name="user-table" value="jaas_usertable"/>
<property name="group-table" value="jaas_grouptable"/>
<property name="jaas-context" value="jdbcRealm"/>
</auth-realm>
Ou seja, autenticação via JAAS pelo método form, com página personalizada, senhas criptografadas, e ainda mantenho integração entre meu módulo web e meu módulo EJB. Quando a session do usuário morre, o JAAS intercepta a requisição, mostra a tela de login, e após login ok, volta para a tela que o usuário estava.
Creio que meu exemplo pode te ajudar, e como você está usando tomcat, você terá apenas que adaptar o XML do auth-realm.
Quaisquer dúvidas, pergunte. Abraços :thumbup: