O que é Spring Security?

Postado por em   ●   46 comentários

O Spring Security tem recursos avançados e de simples configuração para lhe ajudar com a segurança da sua aplicação.

Falando nisso, e a sua aplicação web? Está segura!? Hoje vamos conversar sobre como você pode aplicar segurança profissional nela.

Veremos algumas coisas bem legais agora. Fique comigo nos próximos minutos que você irá aprender sobre:

  • O que é Spring Security
  • Como configurar o Spring Security
  • Configurar autenticação em memória
  • Como fazer autenticação via JDBC
  • Como fazer autenticação via JPA utilizando a interface UserDetailsService
  • Criar uma página de login customizada
  • A função “lembrar-me”
  • Criar a funcionalidade de logout
  • Como adicionar permissões (autorização) em nossas páginas

“Vambora”?

O que é Spring Security?

Spring Security tem o foco em tornar a parte de autenticação e autorização uma coisa simples de fazer. Ele tem uma variedade muito grande de opções e ainda é bastante extensível.

Com algumas poucas configurações já podemos ter uma autenticação via banco de dados, LDAP ou mesmo por memória. Sem falar nas várias integrações que ele já suporta e na possibilidade de criar as suas próprias.

Quanto a autorização, ele é bem flexível também. Através das permissões que atribuímos aos usuários autenticados, podemos proteger as requisições web (como as telas do nosso sistema, por exemplo), a simples invocação de um método e até a instância de um objeto.

Sem contar que, por tabela, nós já protegemos as nossas aplicações de diversos ataques como o session fixation (link em inglês) e o cross site request forgery (link em inglês).

Como configurar o Spring Security

Para começar, já estou considerando que você tem um projeto com Spring MVC configurado. Caso você não tenha, pode ficar tranquilo que irei disponibilizar o código-fonte dos exemplos desse artigo aqui.

Falando especificamente das configurações do Spring Security, para começar você vai precisar criar uma classe que estenda AbstractSecurityWebApplicationInitializer.

Ela vai servir para adicionar o filtro do Spring Security.

Agora nós vamos começar a fazer configurações mais específicas. A primeira forma de autenticação será HTTP Basic e, por ora, o sistema não exigirá permissões de acesso. Vai ser necessária somente a autenticação.

Faremos isso com a criação de uma classe qualquer que estenda SecurityWebConfigAdapter. Depois sobrescrevemos o método configure para alterarmos a instância de HttpSecurity conforme nossa necessidade.

Importante não esquecer da anotação @EnableWebSecurity. Como o próprio nome diz, é ela que habilita os recursos de segurança em nossa aplicação.

Podemos dizer que temos 50% configurado. Ainda faltam os usuários. Vamos começar buscando eles em memória.

Autenticação em memória

A configuração de usuários em memória, geralmente, não é utilizada em produção, mas pode ser muito útil no início do desenvolvimento.

Continuando a alteração na nossa classe SecurityWebConfig, agora vamos sobrescrever o método configure que recebe a instância de AuthenticationManagerBuilder. Utilizaremos esse objeto para criar nossos usuários.

Veja que agora temos dois usuário configurados: o garrincha e o zico.

Já podemos fazer um teste em nossa aplicação.

Autenticação HTTP Basic

Autenticação via JDBC

Essa já é uma boa alternativa até mesmo para o projeto em produção. Para utilizar essa opção do Spring Security vamos precisar apenas de uma fonte de dados e do SQL referente as consultas que buscam o usuário no banco.

Provavelmente, você já foi alertado de que não é seguro deixar as senhas serem gravadas limpas na base de dados. Por isso vou aproveitar também para utilizar um PasswordEncoder que irá resolver esse problema.

Dessa forma poderemos salvar nossos usuários com senhas criptografadas que a implementação de PasswordEncoder irá ajudar o Spring Security a comparar a senha submetida na hora do login.

Veja aqui como fica nosso método configure(AuthenticationManagerBuilder):

Feita a alteração acima, agora você já pode fazer  o login na aplicação via JDBC.

Para aqueles que quiserem saber como a senha deve ser salva na base de dados, eu deixei um método main na classe que vai ajudar com isso. Veja:

Com o resultado do método encode você consegue fazer um insert para um usuário de teste:

No projeto de exemplo, que irei disponibilizar no final do artigo, tem um arquivo chamado import.sql que é executado automaticamente e já faz as inserções iniciais para os nossos testes aqui.

Autenticação via JPA com a interface UserDetailsService

Como disse, a configuração via JDBC, mostrada anteriormente, já é uma boa opção para se utilizar em produção, mas muitas vezes é necessária uma configuração mais personalizada utilizando a interface UserDetailsService.

Iremos utilizá-la para poder fazer a consulta na base de dados com JPA.

Para o nosso exemplo eu criei três entidades que participarão do processo de autenticação. São elas: a entidade Usuario, Grupo e Permissao. Como o código delas é bem simples, eu não irei mostrar aqui, mas você vai poder baixar o fonte e dar uma olhada nelas depois.

Além das entidades, cheguei a criar também a classe UsuarioSistema, que é uma implementação de UserDetails. Precisamos dela para conseguir dar um retorno para o método loadUserByUsername, que vamos implementar.

A única responsabilidade desse método é buscar o usuário pelo username. Não devemos fazer a validação da senha nele, pois quem vai fazer isso é o próprio Spring Security.

Vou utilizar JPA para buscar o usuário do banco de dados, mas é importante destacar que não importa de onde ele vem – banco de dados, memória, etc – o que importa é devolver uma implementação de UserDetails. Poderíamos utilizar aqui uma consulta JDBC com queries personalizadas, se quiséssemos.

Veja agora a implementação completa:

Com o nosso UserDetailsService em mãos, podemos voltar na classe SecurityWebConfig e terminar a configuração:

Ficou simples também, não é mesmo?

Dessa forma você já pode subir a aplicação para fazer mais esse teste.

Página de login customizada

Até o momento estamos fazendo o login via HTTP Basic. Vamos mudar isso agora.

Porém, antes de criarmos uma página de login customizada por nós, gostaria de mostrar pra você a página de login que existe dentro do próprio Spring Security. Para certos tipos de caso, pode ser uma boa opção.

Para utilizarmos ela vamos precisar alterar somente uma linha. Só que agora é no método configure que recebe um objeto do tipo HttpSecurity. Veja:

Iniciando a aplicação novamente, a tela de login que você irá ver será esta:

Página de login do Spring-Security

É uma página bem simples, mas ela não foi feita para ser uma solução geral e sim para aqueles casos em que precisamos economizar tempo.

Bom… Agora vamos fazer a configuração para utilizarmos a nossa própria página de login.

Agora vamos para o HTML do formulário de login. Ele precisa estar de acordo com as configurações explicitas e implícitas acima. Veja uma versão simplificada do nosso formulário:

Temos 3 coisas a reparar nesse formulário: a ação, o nome do campo de usuário e o nome do campo de senha.

A ação é /login e  o método HTTP que será usado é o POST. Isso é porque a ação tem o mesmo path da URL que abre a página de login. Só que a requisição para página é feita com um GET para /login e a submissão do formulário é feita com um POST.

O campo “Usuário” precisa ter o nome username. Ele pode ser configurado explicitamente, mas eu preferi utilizar o padrão. Da mesma forma é o campo “Senha” de nome password.

Com as alterações acima já é possível fazer o login através da nossa página. Só que ainda temos um problema com os arquivos JS e CSS utilizados para montar o layout dela:

Pagina de login

Ela ficou bem parecida com a própria página do Spring Security, mesmo tendo alguns estilos já – aplicados pelo Bootstrap. Isso acontece porque ele restringiu o acesso aos recursos JS e CSS também. Afinal, em momento algum avisamos pra ele liberar.

Esse aviso é feito com a adição da linha:

Veja como ficou o método completo até aqui:

Agora nossa página abre como esperado:

Pagina de login customizado no Spring Security

Um detalhe que não pode escapar é que foi preciso criar uma action que fosse responsável por devolver nossa página de login.

Criei um controlador bem simples para isso, que chamei de HomeController. Veja como ficou a action para /login, que devolve a nossa página customizada:

Função “lembrar-me”

Uma função muito usada nos sistemas web e que os usuários gostam muito é a “lembrar-me”. Mais uma vez, o Spring Security vai ser uma mão na roda pra nós.

Pra que isso funcione na nossa aplicação é preciso acrescentar somente duas coisas dentro do que já temos.

Uma é o checkbox “lembrar-me” dentro do nosso formulário:

Repare que o nome do checkbox precisa ser remember-me. Como no caso do input de nome username, esse nome pode ser alterado, mas vou ficar com o padrão mesmo.

Nossa tela vai ficar assim:

Pagina de login com a funcao LEMBRAR-ME

A outra coisa que precisamos é a chamada do método rememberMe, que vai habilitar essa função pra gente:

Depois dessa configuração você já pode reiniciar o servidor e testar o formulário. Faça o login com o campo “lembrar-me” marcado, depois feche todas as instâncias do navegador e entre novamente. O sistema não deve pedir que você se autentique.

Funcionalidade de logout

Do jeito que o sistema está até aqui, a única forma de sair é fechando o navegador. Vamos melhorar isso agora acrescentando um botão para sair.

É bem simples, pois, o Spring Security já tem essa funcionalidade implementada. Basta colocar esse formulário em qualquer lugar do seu sistema:

O mais importante nele é a ação do formulário – ele está fazendo um POST para /logout. Como quase tudo no Spring Security, esse path pode ser customizado, mas estou utilizando o padrão.

Na aplicação de exemplo, deixei o botão na barra superior:

Botao de sair

Autorização – permissões para acessar URLs

Como já temos a autenticação configurada – inclusive com login customizado -, podemos pensar um pouco em autorização. Vamos colocar permissões específicas para as nossas páginas.

Na verdade, no Spring Security nós colocamos permissões nas URLs, e não nas páginas. É quase a mesma coisa, mas com essa ideia podemos incluir permissões, por exemplo, em imagens, pois uma imagem tem uma URL e o Spring Security, como eu disse, protege URLs.

Para isso vou criar mais três ações no controlador que irão devolver as páginas que terão restrições.

A página /vendas vai exigir somente a autenticação. Já as páginas /vendas/relatorios/custos/vendas/relatorios/equipe exigirão as permissões VISUALIZAR_RELATORIO_CUSTOS e VISUALIZAR_RELATORIO_EQUIPE, respectivamente.

Esse tipo de configuração nós fazemos também no método configure, que recebe uma instância de HttpSecurity.

Olha agora o que acontece quando você entrar no sistema com um usuário que não tem a permissão VISUALIZAR_RELATORIO_EQUIPE e tentar acessar a URL (ou página) /vendas/relatorios/equipe:

Erro 403

O acesso será negado, claro.

Conclusão

Como mostrei pra você agora, o Spring Security é uma solução profissional para proteção em nível de aplicação.

Mostrei como fazer a configuração do mesmo e depois trabalhamos com autenticação via memória, JDBC e JPA (com o UserDetailsService).

Utilizamos também 3 tipos de login: com HTTP Basic, com o formulário HTML do próprio Spring Security e, por último, fizemos um formulário personalizado.

No final do artigo mostrei como incluir permissões para diferentes URLs do sistema.

Espero que tenha gostado. :)

Gostaria de aprender sobre a integração de Spring Security com o Spring Boot? Então baixe agora o nosso e-book Produtividade no Desenvolvimento de Aplicações Web com Spring Boot:

FN013-CTA-Lead-Magnet--Img02

Um abraço pra você e até uma próxima!

PS: você pode baixar o código-fonte de exemplo em nosso GitHub: http://github.com/algaworks/artigo-spring-security

É graduado em Sistemas de Informação, trabalha como instrutor na AlgaWorks e está no mercado de programação Java há mais de 8 anos, principalmente no desenvolvimento de sistemas corporativos.

46 comentários sobre “O que é Spring Security?

  1. José carlos -

    Alexandre, a Algaworks já era excelente agora com seus artigos esta melhor ainda os artigos
    têm engrandecido demais o conhecimento dos leitores!
    Obrigado por mais um ótimo artigo

    1. Alexandre Afonso Autor do post-

      Obrigado José! Fico feliz que esteja sendo proveitoso.

      Forte abraço!

  2. Marcelo -

    Excelente post.

    1. Alexandre Afonso Autor do post-

      Valeu Marcelo!

  3. Alexandre Teixeira -

    Boa noite Alexandre, eu gostaria de saber se para fazer autenticação com o jdbc e o jpa é obrigatório sempre ter os grupos e as permissões ou eu posso simplesmente usar o usuário para fazer um controle de login básico?
    Parabéns pelo tutorial, algaworks como sempre, a melhor escola de java do Brasil.

  4. Alexandre Afonso Autor do post-

    Fala Xará!

    Olha… A query do método “authoritiesByUsernameQuery” você precisa informar, mas você pode colocar uma pseudoquery. :)

    Veja:

    builder
    .jdbcAuthentication()
    .dataSource(dataSource)
    .passwordEncoder(new BCryptPasswordEncoder())
    .usersByUsernameQuery(USUARIO_POR_LOGIN)
    .authoritiesByUsernameQuery(“select ?, ‘USER'”) // <<< //.groupAuthoritiesByUsername(PERMISSOES_POR_GRUPO) .rolePrefix("ROLE_"); Abraço!

  5. Douglas Andrade -

    Obrigado por compartilhar as soluções.
    Parabéns pelo trabalho Alexandre!!

  6. Alexandre Afonso Autor do post-

    Obrigado Douglas!

  7. Natal -

    Obrigado pelo excelente ‘post’. Parabéns e continue postando artigos com esta qualidade!

  8. Alexandre Afonso Autor do post-

    Valeu Natal!

  9. Lucas Bertoldo -

    Boa, Alexandre Afonso! Parabéns pelo artigo, clareou tudo aqui.

  10. Alexandre Afonso Autor do post-

    Bacana que esclareceu pra você Lucas!

  11. Raniel -

    Parabens, muito bom!

  12. Alexandre Afonso Autor do post-

    Obrigado Raniel!

  13. Ricardo Johannsen -

    Como sempre a Algaworks apresentando um conteúdo de excelente qualidade, vcs são realmente muito bons no que fazem.

    Alexandre, tenho uma duvida quanto a um aspecto de segurança em aplicações web, talvez até o Spring Security tenha alguma ferramenta para ajudar.

    Vamos supor um portal com uma url pública acessada via método Get, por exemplo a url: /fornecedor/exibe/56 onde eu carrego uma página onde trago todos os detalhes de um fornecedor do banco de dados. O problema ocorre se algum usuário mal intencionado ficar pressionando F5 rapidamente e repetidamente de forma indefinida, como a requisição é Get, a cada F5 é disparada uma requisição ao servidor e novamente são disparados vários selects ao banco de dados, situação que pode fazer fazer facilmente o servidor de aplicações ou o banco de dados cair. Como se prevenir ou pelo menos minimizar este tipo de problema? tem como ? filtros? cache? como vocês lidam com esse tipo de problema?

  14. Alexandre Afonso Autor do post-

    Ricardo, valeu!

    É possível fazer isso, mas você teria que implementar. Não sei se já existe algo pronto.

    Você até poderia criar um filtro para o Spring Security, mas toda a rega você precisaria incluir. Daí você teria que ficar checando logs ou salvar cada IP que fizer uma requisição para as URL protegidas (poderia ser em memória mesmo.).

    De qualquer forma, eu não faria isso a nível de aplicação. Eu usaria algum serviço tipo esse:

    http://www.fail2ban.org/wiki/index.php/Main_Page

    Abraço!

  15. Adriano Mazucato -

    Bom dia Alexandre, muito bom seu artigo, parabéns.
    Estou desenvolvendo uma api que no login preciso retornar um json com as informações do usuário junto com um accesstoken e todas as outras requisições preciso recuperar o usuário que pertence esse token. É possível fazer isso usando o Spring security?

  16. Alexandre Afonso Autor do post-

    Obrigado Adriano!

    Sim é possível. Você pode criar algo nesse sentido aqui:

    http://docs.spring.io/spring-security/site/docs/current/reference/htmlsingle/#multiple-httpsecurity

    No exemplo acima (da documentação do SS) são criadas duas classes que estendem WebSecurityConfigurerAdapter. E depois é criado um bean através do método “userDetailsService”.

    Só que diferente da documentação do SS você não vai criar esse bean (do método “userDetailsService”). Ao invés disso você vai criar 2 classes bem parecidas com essa aqui do artigo (SecurityWebConfig).

    Uma vai fazer a segurança do formulário e outra da API. Para a API você pode usar o HTTP Basic mesmo. Só que o usuário é senha vai ser o seu token (e não o usuário da autenticação).

    Um outro caminho seria você criar seu próprio filtro de autenticação de tokens:

    http://docs.spring.io/spring-security/site/docs/current/reference/htmlsingle/#ns-custom-filters

    Seria uma implementação até parecida com que tem no filtro do HTTP Basic (BasicAuthenticationFilter), mas você, claro, vai validar o token.

    Eu ficaria com a primeira opção que comentei. :)

    Abraço!

  17. Victor Rocha -

    Mais um vez excelente! Obrigado por compartilhar

  18. Alexandre Afonso Autor do post-

    Valeu Victor!

  19. Anderson -

    É possível proteger apenas componentes html com as permissões do spring security ?

    1. Alexandre Afonso Autor do post-

      Anderson, basta usar algo como:

      sec:authorize=”hasAnyRole(‘PERMISSAO_01’, ‘PERMISSAO_02’)”

      Baixe o projeto de exemplo, vá no arquivo layout.html que lá tem um exemplo de uso. Eu protejo os itens de menu dessa forma.

      Abraço!

  20. Anderson Calera -

    Parabéns! Excelente conteúdo.

    Estou com um dilema e não sei o que fazer a respeito, seria o seguinte.

    Estou desenvolvendo um sistema em que uma determinada página seria comum aos usuários ( dividido em Administrador, Gerencial e Operacional ), porém, determinadas ações, seriam liberadas apenas a alguns usuários ( Administrador e Gerencial ), exemplo, um botão que possibilitasse reverter um cancelamento indevido, ou a reabertura de uma ocorrência cancelada por engano.

    Com o SS eu consigo fazer esta “distinção” na tela?

    Obrigado!

    1. Alexandre Afonso Autor do post-

      Valeu Anderson!

      Sim, é possível.

      Para proteger componentes (com thymeleaf) HTML você pode utilizar:

      sec:authorize=”hasAnyRole(‘PERMISSAO_01’, ‘PERMISSAO_02’)”

      E para proteger os métodos você pode usar a anotação:

      @Secured(“PERMISSAO_01”, “PERMISSAO_02”)

      Abraços!

  21. Wandson -

    Excelente artigo, me tirou diversas dúvidas, parabéns.
    Mas eu ainda fiquei com uma dúvida, na execução do “System.out.println(new BCryptPasswordEncoder().encode(“123″));” sempre será impresso uma senha diferente, como vou saber qual senha salvar no banco de dados?

    1. Alexandre Afonso Autor do post-

      Valeu Wandson!

      Pode salvar qualquer uma. O algoritmo do BCrypt vai saber resolver isso.

      Abraço!

    1. Alexandre Afonso Autor do post-

      Beleza Gil? Onde fica essa “pasta” para qual você quer redirecionar o usuário. E fale também, em qual método você quer que isso aconteça. Assim dá para ajudar melhor.

      Abraço!

      PS: coloquei seu código no site pastbin, pois, aqui nos comentários do blog fica muito ruim de analisar.

  22. Manoel Albino Neto -

    Olá Bom dia; Você pode indicar algum material que utilize spring security com certificado digital ? No caso gostaria que a autenticação se desse por duas vias: 1º Certificado Digital. 2º Por fomulário normal mesmo. Um Exemplo seria o bankline do Banco do Brasil; que possui estas formas de autenticação. Parabéns pelo artigo; ficou muito bom !

  23. Wilson -

    Muito bom, excelente. Gostaria de um tutorial assim para jsf.

  24. Alan -

    Muito bom o seu artigo, li varios artigos relacionados com o assunto, e todos muito confusos, mas o seu ficou simples e facil.

  25. Thiago -

    Professor e o metodo do Logout? a tela foi feita mais achei o metodo do botao.

  26. Alexandre Afonso Autor do post-

    Thiago, é que o Spring Security já tem a funcionalidade implementada. Basta fazermos a requisição. Inclusive, vou alterar o artigo para dar esse aviso. Obrigado.

    Abraço!

  27. Leonardo Braz -

    Alexandre, muito bom o seu artigo, me tirou grandes dúvidas em relação aos grupos de usuários.

    Cara, eu tenho uma pergunta pra te fazer, como fazer a autenticação via REST?

    Já vi algumas coisas pela internet, de forma que enviaria um Authorization no header de uma requisição, mas como eu faço com que o Spring aceite automaticamente?

    Por exemplo, tenho uma aplicação Spring MVC rodando com SpringSecurity e tenho uma URL para os produtos do meu sistema (/produtos). Configurei um interpreter para que ele retornasse um json com meus produtos quando fosse solicitado na minha página um “/produtos.json”.

    Até ai beleza, enquanto eu autentico pelo browser (essa função tá disponível para admin e para estoquista), depois do processo de autenticação ele me trás os valores certinho.

    Mas, queria que, quando enviasse um método get para essa url, passando um atributo que seria o login e senha do meu usuário (Authorization: Basic 12ASsdgflShkb93546*YanX46asdf==), ele conseguisse me retornar o json.

    Como fazer isso?

    Valeu, sucesso!

  28. Robson -

    Olá Alexandre! muito bom material, eu finalizei um workshop de spring a poucos meses, e o mesmo não tem esta parte de segurança com este artigo vou tentar implementar, gostaria de saber no workshop usamos o spring boot com banco este aqui estas usando o H2, e observei que vc da uma carga dos registros, o H2 por ser em memória tudo ok mais usando o postgreSQL ou outro banco num tem bronca ou teria que ver se nas tabelas já existem registros? outra coisa é que pelo spring boot já temos um tomcat embarcado neste teu projeto tem um servidor embarcado? Um Abraço!

    1. Alexandre Afonso Autor do post-

      Robson,

      No caso de não usar o H2 você precisaria usar uma estratégia do tipo create-and-drop. Claro que é preciso muito cuidado para não levar essa configuração para produção.

      Sim, o projeto desse artigo gera um WAR. No nosso e-book temos um projeto Spring Boot com configuração de segurança caso queira dar uma olhada: http://cafe.algaworks.com/livro-spring-boot/

      Até!

  29. Guilherme -

    Tudo bem ?

    Baixei este projeto, para ver como funciona e tudo está nos conformes.

    Tenho um projeto inicial e preciso implementar políticas de segurança com spring security.

    Pelo seu projeto e por este artigo, tentei fazer funcionar, mas não consegui.

    Pode me dar um help ?

    1. Alexandre Afonso Autor do post-

      Tudo bem Guilherme e você?

      Ao invés de implementar a segurança no seu projeto, pegue as coisas do seu projeto e jogue no projeto do artigo. Faça isso, pelo menos a título de teste.

      Tem também essa aula aqui: https://www.youtube.com/watch?v=FOX0r52_hwE&t=470s … que pode te ajudar.

      Abraço!

  30. Marcos Ribeiro -

    Quando faço o logout não aparece a mensagem “Até Logo!”, quando tento logar novamente ele apresenta a mensagem e não loga na aplicação, aí eu tenho que logar novamente para enfim entrar na aplicação…
    O que pode ser Alexandre?
    Um abraço!

    1. Alexandre Afonso Autor do post-

      Marcos, beleza?

      Quando fazemos logout, por padrão, é enviar para a página de login com o parâmetro “logout”. O que pode ter acontecido é você ter customizado alguma coisa e o parâmetro pode não estar sendo enviado.

      Abraço!

  31. Raphael Aguiar -

    Boa tarde,

    Como eu faria para pegar o id do usuário logado e colocar num campo hidden do form para ser enviado ao Controller?

    1. Alexandre Afonso Autor do post-

      Boa noite Raphael!

      Tente algo como “${#autorization.principal.id}”. Lembrando que o seu tipo UserDetails precisa ter a propriedade ID.

      Até!

  32. Ruan Felisky -

    Olá Alexandre, primeiramente parabéns pelo excelente artigo!

    Eu fiz o curso on-line de “Sistemas Comerciais Java EE com CDI, JPA e PrimeFaces”, onde também ensina na prática como usar o Spring Security. Excelente curso também!

    No meu projeto pessoal eu preciso controlar as permissões de uma maneira um pouco diferente, e gostaria de ver contigo se você consegue me ajudar, ficaria muito agradecido!

    A estrutura que eu tenho é a mesma do curso, tenho a tabela “usuario”, a tabela “grupo”, e uma terceira tabela “usuario_grupo” que faz o vínculo entre os dois.

    Só que eu preciso permitir que o próprio usuário cadastre os grupos conforme a necessidade dele, e além disso, também é ele quem define quais formulários/telas cada grupo terá acesso, então teriam mais duas tabelas: uma interna onde eu populo com os formulários que o sistema possui, e outra que fará o vínculo entre o grupo e os formulários que cada grupo pode acessar, tornando essa parte de permissões mais flexível para o usuário. Até aí tranquilo…

    O problema é que dessa forma eu não posso mais setar as permissões de maneira fixa no método “configure” (exemplo: .antMatchers(“/clientes/**”).hasAnyRole(“ADMINISTRADOR”, “CADASTROS”)), pois neste momento eu ainda não sei quais são os grupos cadastrados e nem as permissões de cada um, pois esse método é executado antes da conexão com o banco e consequentemente antes do usuário fazer login. Além disso meu projeto trabalha com Multitenancy onde de acordo com o domínio (e-mail) do usuário eu conecto na base “A”, ou na “B”, ou na “C”…

    Saberias me dizer se existe alguma forma de fazer isso usando o Spring Security?

    Obs: Meu projeto usa JSF e JPA com Hibernate, igual no curso.

    Abraço!

    1. Alexandre Afonso Autor do post-

      Olá Ruan!

      Já que você é aluno do curso, entre em contato pelo e-mail contato@algaworks.com usando ou informando qual o seu e-mail de acesso ao portal de aulas da AlgaWorks que nós iremos passar o link de uma aula extra pra você onde isso é feito em detalhes.

      Abraço!

Deixe um comentário