Spring-Security

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.

Riscos e vulnerabilidades em aplicacoes web

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.

Iniciando o Spring Security

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.

Protecao contra CSRF

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.

Customizar autenticao em memoria

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.

Customizar autenticao com banco de dados e JPA

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.

Controle de acesso

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.