Autenticação/Controle de acesso java web

Caros usuários,

estou desenvolvimento o famoso aplicativo web para compras…

A autenticação é feita desta forma :

    protected void doLogin(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        HttpSession session = request.getSession();

        Client aClient = null;
        ClientDAO aClientDAO = new ClientDAO();
        aClient = aClientDAO.read(username, password);

        if (aClient != null) {                        
            aClient.setSessionID(session.getId());
            listClients.add(aClient);
            session.setAttribute("username", username);
            startOrder(aClient.getUsername(), session.getId());
            
            RequestDispatcher rd = request.getRequestDispatcher("/addItem.jsp");
            rd.forward(request, response);
        } else {
            response.sendRedirect("index.jsp");
        }
    }
{

Para controlar o acesso a páginas, verifico se usuário está autenticado pela presença do atributo username

        HttpSession session = request.getSession();
        if (session.getAttribute("username")!=null && !session.getAttribute("username").toString().isEmpty()) {  

Um usuário mais experiente e mal intencionado seria capaz de criar, sem passar pelo servlet, um atributo username para ter acesso às paginas, correto?
Pensei, como solução, em uma validação do atributo username e também deste username no banco de dados ou na lista de clientes

listClients.add(aClient); 

Há uma maneira, sem a utilização de frameworks, mais elegante/segurança de fazer este controle?
Obrigado!

Você pode fazer utilizando Filter: Autenticação de Usuários (Filter/Servlet).
Você pode fazer utilizando JAAS (Um exemplo com JBoss): Aplicação Web Completa JSF EJB JPA JAAS

O JAAS não é um framework de terceiros, faz parte da especificação J2EE.

Cara eu utilizaria um framework como o Spring Security que você pode fazer o controle baseado na URL.
Eu utilizo aqui pra fazer autenticação no Active Directory da Microsoft, dai os usuários da empresa usam o mesmo usuário e senha no computador para logar no windows e também na aplicação.
Mas o Spring faz bem mais que isso… da pra autenticar usando certificados digitais, banco de dados, LDAP… entre outros… é só dar uma olhada na net que tem bastante coisa.

Acredito que o JBoss Seam também tem uma parte para segurança mas eu não conheço.

Com o JAAS eu já fiz autenticação LDAP e em banco de dados utilizando o Glassfish, mas não consegui direcionar o usuário para uma página específica por exemplo (pode ser que dê certo mas eu não consegui fazer) … além de ficar preso em servidores de aplicação mais pesados como JBoss e Glassfish.

Se for usar um servidor desses só para fazer a autenticação acredito que seja melhor usar um Spring da vida e ficar no tomcat mesmo.

Espero ter ajudado

O projeto é pequeno e se limita a no máximo 128 logins…

Como, de certa forma, tenho tempo, optei por desenvolver uma estratégia própria e não utilizar um framework pronto pelo aprendizado durante o desenvolvimento.

A opção do Filter parece interessante e vou testa-la em breve.
Fico, ainda, na dúvida se a validação do atributo username e também desta username no banco de dados ou na lista de clientes logados seria suficiente para evitar o acesso a certas páginas?

Bom dia pessoal,

Trabalho desenvolvendo um sistema que utiliza Jboss, Spring Security, Hibernate, JSF, PrimeFaces…
Controlamos o acesso de usuários com o Spring Security através de permissões de acesso (ROLE_ADMINISTRADOR, ROLE_USUARIO e etc), porém percebemos que o sistema não necessita desses perfis, mas sim de um controle dinâmico de acesso.
Por exemplo:

  • Usuario1 pode acessar a opção 1, 2 e 3 no menu do sistema;
  • Usuario2 pode acessar a opção 2 e 3;
  • Usuario3 pode acessar apenas 1.

Futuramente se houver necessidade do Usuario3 acessar outra opção, adicionar a permissão. Ou se o Usuario1 não puder mais acessar a opção 2, retirar a permissão.

Nosso sistema limita o acesso às páginas apenas com o tipo de permissão do usuário que colocamos no menu:

<sec:ifAnyGranted roles="ROLE_ADMINISTRADOR, ROLE_GESTOR"> <p:submenu label="Gestão"> <p:submenu label="Consultas"> <p:menuitem value="Exemplo" url="/restrito/exemplo/pagina.jsf" /> </p:submenu> </p:submenu> </sec:ifAnyGranted>

Às vezes um usuário com o perfil ROLE_USUARIO precisa acessar essa página (um caso específico) porém não podemos adicionar essa permissão no menu da aplicação, já que não são todos os ROLE_USUARIO que podem acessar.

Gostaria que vocês indicassem formas de fazer esse controle de uma forma elegante e que funcione corretamente para esses casos.
Já pesquisei a respeito do VRaptor e do Spring Security, mas não achei um material que dissesse se é possível esse controle.

Sugestões?
Obrigada :smiley:

E ai Ju, tudo bem?

Então estava vendo algumas coisas sobre um tal de JAAS (Java Authentication and Authorization Service) que é nativo do J2EE, estou vendo o q dá pra fazer pois aqui no FEISS (ex-Mammon) estamos tendo problemas com login/acesso. Se vc conseguir alguma coisa pelo JAAS seria o canal.

Marcio

[quote=julynhaprado]Bom dia pessoal,

Trabalho desenvolvendo um sistema que utiliza Jboss, Spring Security, Hibernate, JSF, PrimeFaces…
Controlamos o acesso de usuários com o Spring Security através de permissões de acesso (ROLE_ADMINISTRADOR, ROLE_USUARIO e etc), porém percebemos que o sistema não necessita desses perfis, mas sim de um controle dinâmico de acesso.
Por exemplo:

  • Usuario1 pode acessar a opção 1, 2 e 3 no menu do sistema;
  • Usuario2 pode acessar a opção 2 e 3;
  • Usuario3 pode acessar apenas 1.

Futuramente se houver necessidade do Usuario3 acessar outra opção, adicionar a permissão. Ou se o Usuario1 não puder mais acessar a opção 2, retirar a permissão…

[/quote]

E ai Blz!!!

Bom! a dois meses desenvolvi um sistema exatamente igual ao que vc descreveu, e com relação ao controle de permissão, vc pode adicionar a mesma tag sec:ifAnyGranted para fazer também o controle dos p:menuitem e não apenas do submenu por inteiro, desta forma se consegue um controle das diferentes opções do submenu para diferentes usuários, porém e necessário definir um pradrão para cada tipo de ROLE_USUARIO, e utilizando seu exemplo vc terá ROLE_USUARIO1, ROLE_USUARIO3, ROLE_USUARIO3 no codigo ficaria assim

[code]<p:submenu label=“Cadastros” icon=“ui-icon ui-icon-folder-open”>
<sec:ifAnyGranted roles=“ROLE_USUARIO1”>//somente o usuário 1 pode acessar o item Nota Fiscal
<p:menuitem value=“Nota Fiscal” url=“f” icon=“ui-icon ui-icon-image” />
</sec:ifAnyGranted>

        <sec:ifAnyGranted roles="ROLE_USUARIO1, ROLE_USUARIO2">//somente os usuário 1 e 2 podem acessar os itens Contas a Pagar e Balanço.
        <p:menuitem value="Contas a Pagar" url="f" icon="ui-icon ui-icon-folder-open" />
        <p:menuitem value="Balanço" url="" icon="ui-icon ui-icon-refresh" />
        </sec:ifAnyGranted>

        <sec:ifAnyGranted roles="ROLE_USUARIO2, ROLE_USUARIO3">//somente os usuário 2 e 3 podem acessar os itens Despesas e Relatórios Gerenciais.
        <p:menuitem value="Despesas" url="" />
        <p:menuitem value="Relatórios Gerenciais" url="" />
        </sec:ifAnyGranted>
        
         <sec:ifAnyGranted roles="ROLE_USUARIO1, ROLE_USUARIO2, ROLE_USUARIO3">//Todos os usuários terão acesso a opção Serviços Internos.
        <p:menuitem value="Serviços Internos" url="" />
        </sec:ifAnyGranted>

</p:submenu>[/code]
Desta forma o Menu continuaria a aparecer para todos os usuários, porem com opções diferenciadas.
Na Empresa funciona sem problemas!!!