@Column(name = "codigo") private Integer codigo; @Size(max = 45) @Column(name = "descricao") private String descricao; @Size(max = 45) @Column(name = "regra") private String regra; // Getters e Setters}Classe Usuario.java:@Entity@Table(name = "usuario")public class Usuario implements Serializable { @Id @Basic(optional = false) @NotNull @Column(name = "codigo") private Integer codigo; @Size(max = 45) @Column(name = "login") private String login; @Size(max = 45) @Column(name = "senha") private String senha; @JoinColumn(name = "empresa_codigo", referencedColumnName = "codigo") @ManyToOne(optional = false, fetch = FetchType.LAZY) private Empresa empresa; // Getters e Setters}No pacote javasemcafe.dao, temos a classe EmpresaDAO.java:@Statelesspublic class EmpresaDAO { @PersistenceContext(unitName = "LoginCustomizadoPU") private EntityManager em; public List<Empresa> listar() { List<Empresa> empresas = null; try { Query query = em.createQuery("Select e from Empresa e order by e.descricao"); empresas = query.getResultList(); } catch (Exception e) { e.printStackTrace(); } return empresas; }}Nesta classe, apenas temos um metodo que retorna uma lista de empresas que sera utilizada com o EmpresaBean.java para popular o combo de empresas na pagina de login.Classe EmpresaBean.java:@ManagedBean@ViewScopedpublic class EmpresaBean implements Serializable { @EJB private EmpresaDAO empresaDAO; private List<Empresa> empresas; public List<Empresa> getEmpresas() { empresas = empresaDAO.listar(); return empresas; } public void setEmpresas(List<Empresa> empresas) { this.empresas = empresas; }}Neste caso apenas preenche uma Collection que aqui e o List.Voltando ao pacote javasemcafe.dao, temos praticamente a classe mais importante:AutenticacaoFilter.java, e nela que fazemos a verificacao de login, senha e se o usuario pertence ou nao a empresa selecionada no login, abaixo explico os detalhes dela:public class AutenticacaoFilter extends UsernamePasswordAuthenticationFilter { private EntityManagerFactory factory = Persistence.createEntityManagerFactory("LoginCustomizadoPU"); private EntityManager em; private String mensagem; public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException, BadCredentialsException { String login = request.getParameter("j_login"); String senha = request.getParameter("j_senha"); Integer codigoEmpresa = Integer.parseInt(request.getParameter("j_empresa")); try { Usuario usuario = buscarUsuario(login, senha); if (usuario != null) { if (usuario.getEmpresa().getCodigo().equals(codigoEmpresa)) { Collection<GrantedAuthority> regras = new ArrayList<GrantedAuthority>(); regras.add(new SimpleGrantedAuthority(usuario.getEmpresa().getRegra())); request.getSession().setAttribute("usuarioLogado", usuario); mensagem = "Bem vindo: " + usuario.getLogin(); return new UsernamePasswordAuthenticationToken(usuario.getLogin(), usuario.getSenha(), regras); } else { mensagem = "Acesso negado a empresa selecionada!"; throw new BadCredentialsException(mensagem); } } else { mensagem = "Dados Incorretos"; throw new BadCredentialsException(mensagem); } } catch (Exception e) { throw new BadCredentialsException(e.getMessage()); } } protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, Authentication authResult) throws IOException, ServletException { SecurityContextHolder.getContext().setAuthentication(authResult); request.getSession().setAttribute("msg", mensagem); response.sendRedirect("index.jsf"); } protected void unsuccessfulAuthentication(HttpServletRequest request, HttpServletResponse response, AuthenticationException failed) throws IOException, ServletException { request.getSession().setAttribute("msg", mensagem); response.sendRedirect("login.jsf"); } /** * Metodos de acesso ao BD * */ public Usuario buscarUsuario(String login, String senha) { em = factory.createEntityManager(); Usuario usuario = null; try { Query query = em.createQuery("SELECT u FROM Usuario u WHERE u.login = :login AND u.senha = :senha"); query.setParameter("login", login); query.setParameter("senha", senha); usuario = (Usuario) query.getSingleResult(); } catch (NoResultException e) { System.out.println("DAO: Nao foi encontrado resultado!"); } catch (Exception e) { e.printStackTrace(); } finally { em.close(); } return usuario; }}Vamos entender o que acontece nessa classe: os metodos attemptAuthentication. successfulAuthentication e unsuccessfulAuthentication sao metodos criados automaticamente quando se utiliza o extends UsernamePasswordAuthenticationFilter. O primeiro metodo e onde ocorre a verificacao do usuario, e o comando executado quando o usuario clica no botao de "Acessar" (conforme tela no inicio da postagem), nesse metodo tem um detalhe importante, que e a linha