Spring Security é um porjeto do ecossistema Spring que conta com uma poderosa estrutura personalizável para implementação de autenticação e autorização em aplicações Java Spring.
O site Top 10 OWASP lista as dez prinicpais vulnerabilidades para aplicacoes web na atualidade.
- Autenticacao e Autorizacao === uma falha e verificar APENAS se o usuario esta logado, e nao verificar se tem autorizacao de acessar determinados recursos;
Retorno de erros de HTTP == 401 usuario nao logado e o 403, usuario logado mas nao tem accesso a recursos especificos.
Inserir a dependencia do Spring Security no pom.xml do projeto. Ao inicializar o projeto o prorio Spring Security já cria um password para acessar o projeto. No console de inicialização é possível localiza essa chave: Using generated security password: 12a546f2-af4f-4d9d-8aa6-b7d185354e06 . - este password modifica a cada reinicializacao do Spring.
Para acessar a aplicacao é necessario enviar o password e o usuario padrao do Spring Security (user) via Basic Auth.Primeira Forma == Usando a classe WebSecurityConfigurerAdapter --- maneira mais antiga, porem existente em varios projeto.
As configuracoes iniciais do Spring Security estao no pacore security dentro de configs.
Por padrao o Spring Security traz habilitado protecao contra CSRF, onde metodos como POST e DELETE nao conseguem autenticar somente com Basic Authentication.
E necessario desabilitar essa protecao na calsse WebSecurityConfig.Inicialmente sera feita uma autenticao em memoria na classe WebSecurityConfig.
No momento de setar a senha nao e aceito uma senha em String e sim com um passwordEnconder.
E criado um UserModel que implementa UserDetails uma interface do Spring Security que traz alguns metodos ja definidos.
O segundo passo e a criacao do repository do UserModel.
Proximo passo e a criacao do servico dentro do pacote security. Este servico implementa UserDetailsService que posseu o metodo loadUserByUserName este medoto e onde implementamos nosso logica para buscar os dados no banco.
Por fim na classe principal do Spring Security a WebSecurityConfig o metodo configure deve ser ajustado para buscar um UserDetailServiceImpl.
No método configure da classe WebSecurityConfig é adicionado o no builder os antMatechers, passando o verbo HTTp, o caminho da url que terá a regra e por fim qual Role é permitida acessar esta url.
O exemplo acima sobre quais roles podem acessar foi descontinuado (não se utiliza mais a classe WebSecurityConfigurerAdapter), porém foi visto pois é muito utilizado em projetos antigos do Spring.
Os testes irao continuar criando uma classe chamada de WebSecurityConfigV2 que usara o metodo filterChain para autenticar e autorizar as requisicoes.
Outra forma de restringir o acesso: usando a anotacao @EnableGlobalMethodSecurity(prePostEnabled = true). As configurações serão feitas no controller. Em cada endpoint deve ser usada a anotacao @PreAuthorize("hasRole('ADMIN')") com a role que deve ter permissao.