Como fazer autenticacoes. Declarativa (Realms) ou Programática

Boa tarde.
Estava pesquisando sobre como fazer autenticação e permissões do usuario dentro de um sistema e achei 3 formas de se trabalhar:

1)Usando realms aonde vc basicamente declara as regras de acesso no web.xml e deixa o container servlet fazer o processo de autenticação.

2)Usando filtros aonde toda requisição de uma pagina jsp ira passar por um javax.servlet.Filter e fazer o processo de autenticção

3)Usando custonTags aonde vc adiciona tags no começo do JSP bloqueando e redicionando para uma pagina de login caso o usuario nao tenha acesso a pagina.

Dessas formas quais vcs tem usado? Eu implementei as 3 opções e tive mais problemas com a primeira opção pois fica um pouco limitado devido a configurações do container, esse metodo segue uma JSR e parece ser aconselhado.

A opção 2 e 3 são semelhantes e nao vi vantagens sobre uma e outra.

O mentaframework parece implementar a opção 3, por favor me corrijam se estiver errado

Obs. Os termos podem estar errado mas espero que eu tenha consigo passar o a ideia do problema.
Desde já muito obrigado.