Preparando-se para a certificação profissional da Spring. Segurança de primavera

Este artigo é uma tradução do artigo Spring Professional Certification Prep .


Ele abordará o tópico Spring Security e as principais perguntas sobre ele.


Também pode ser usado para se preparar para uma entrevista.


↓ Outros artigos estão disponíveis nos links do índice ↓


Sumário
  1. Injeção de dependência, contêiner, IoC, feijão
  2. AOP (programação orientada a aspectos)
  3. JDBC, Transações, JPA, Dados da Primavera
  4. Bota de mola
  5. Spring mvc
  6. Segurança de primavera
  7. REST
  8. Teste




Perguntas em si:


O que é autenticação e autorização?

Autenticação é o processo de verificação do usuário de um sistema de computador.
É assim que acontece na primavera:


  1. A senha e o nome de usuário resultantes são convertidos em uma instância de UsernamePasswordAuthenticationToken . Ele implementa a interface de autenticação .
  2. O token é passado para o objeto AuthenticationManager para verificação
  3. Se for bem-sucedido, o AM retornará um objeto de Authentication preenchido
  4. O contexto de segurança é definido chamando SecurityContextHolder.getContext().setAuthentication(...)

Autorização é o processo de verificar se o usuário tem a função necessária para executar uma ação. Durante a autorização, é verificado se você possui os direitos apropriados para acessar o recurso.


Processo:


  1. Pelo principal (principal) do usuário, sua função é exibida
  2. Função de usuário verificada em relação à função de recurso

Primeiro, a autenticação ocorre e depois a autenticação.


Como a segurança trabalha internamente?
  • Usando proxies Spring AOP que herdam da classe AbstractSecurityInterceptor.


    É usado para métodos que chamam de autorização.


  • A infraestrutura da Web de segurança é baseada em filtros de servlet.



A primeira etapa é configurar o filtro DelegatingFilterProxy . Ele delega a solicitação no FilterChainProxy .


FilterChainProxy é um bean que aceita um ou mais SecurityFilterChain no construtor.


SeccurityFilterChain compara o URL na solicitação com uma lista de filtros.



Principais recursos envolvidos na segurança da primavera

SecurityContextHolder - contém e fornece acesso ao SecurityContext no aplicativo.


SecurityContext - a implementação padrão do Spring Security que contém o objeto de autenticação.


Authentication - fornece um token para uma solicitação de autenticação ou para um principal que se autenticou. Ele também contém uma lista de poderes aos quais o principal tem acesso.


GrantedAuthority - Contém a autoridade concedida ao principal GrantedAuthority .


UserDetails - contém informações sobre o usuário: senha, login, permissões. Essas informações são usadas para criar um objeto de autenticação após uma autenticação bem-sucedida.


UserDetailsService - este serviço extrai informações sobre o usuário do repositório (memória do programa, banco de dados, etc.) e as coloca em UserDetails.


O que é um filtro de proxy delegado?

A classe DelegatingFilterProxy é uma classe que implementa a interface javax.Servlet.Filter .


Este é um filtro especial que delega o trabalho para outros beans, que também são filtros.


O que é a cadeia de filtros de segurança?

A cadeia de filtros implementa a interface SecurityFilterChain . A implementação fornecida pelo Spring Security é DefaultSecurityFilterChain.


O construtor DSFC aceita vários parâmetros. O primeiro parâmetro é o solicitador de correspondência. Os parâmetros restantes são filtros que implementam a interface servlet.Filter. Aqui estão todos os filtros aceitos pelo DSFC:


  • ChannelProcessingFilter
  • SecurityContextPersistenceFilter
  • ConcurrentSessionFilter
  • Qualquer autenticação. filter: UserNamePasswordAuthenticationFilter / CasAythenticationFilter / BasicAuthenticationFilter
  • SecurityContextHolderAwareRequestFilter
  • JaasApiIntegrationFilter
  • RemeberMeAuthenticationFilter
  • AnonymusAuthenticationFilter
  • ExceptionTranslationFilter
  • FilterSecurityInterceptor

O que é um contexto de segurança?

O objeto principal é um SecurityContextHolder . É o local em que os detalhes sobre o contexto de segurança atual são armazenados, por exemplo, detalhes do principal que está usando o aplicativo no momento. Por padrão, o ThreadLocal usado para armazenamento.


 // SecurityContext SecurityHolderContext.getContext() 

O objeto retornado pelo método getContext() é SecurityContext . Permite receber e configurar um objeto de Authentication .


Authentication representa as seguintes propriedades:


  • A cobrança de poderes concedidos ao principal
  • Dados para identificação do usuário (login, senha)
  • Detalhes - adicionar. informações, se necessário. Pode ser nulo
  • Principal
  • Sinalizador de autenticação - variável booleana que indica se o principal passou no teste com sucesso

Como definir uma interceptação de cliques do usuário em URLs específicos?
 @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() //    /resources .antMatchers("/resources/**").permitAll() //      2  .antMatchers("/").hasAnyRole("ANONYMOUS", "USER") .antMatchers("/login)*").hasAnyRole("ANONYMOUS", "USER") .antMatchers("/logoutr").hasAnyRole("ANONYMOUS", "USER") //      ADMIN .antMatchers("iadmin/*").hasRole("ADMIN") .antMatchers("/events/").hasRole("ADMIN") } 

O que * significa nos métodos antMatchers e mvcMatchers ()?

Esta expressão significa "qualquer".


Existem 2 tipos:


  • * - intercepta apenas no nível em que é usado.


    Por exemplo, o padrão "/ orders / *" verifica os direitos do usuário se o usuário seguir


    / orders / aliens ou / orders / 1, mas não / orders / alien / 1.


  • ** - intercepta em todos os níveis.
    Quaisquer pedidos serão verificados, / orders / aliens, / orders / 1, / orders / alien / 1.



Por que o mvcMatcher é mais seguro que o antMatcher?

Como o antMatcher(“/service”) mapeia o caminho da solicitação apenas para “/service” , enquanto o mvcMatcher(“/service”) mapeia para “/service” , “/service.html” , “/service.abc” .


O Spring suporta hash de senha? O que é sal?

Sim sim. Existe uma interface PasswordEncoder para hash, que contém apenas um método:


static PasswordEncoder createDelegatingPasswordEncoder() , que retorna o padrão DelegatePasswordEncoder .


Salt é usado para calcular o valor do hash da senha. Essa é uma sequência de números aleatórios usados ​​para converter uma senha de texto em um hash. O salt é armazenado de forma clara ao lado da senha de hash e pode ser usado posteriormente ao converter uma senha limpa em um hash com um novo login de usuário.


Por que você precisa de proteção para métodos? Como instalá-lo?

O Spring Security suporta a proteção de métodos individuais em beans (por exemplo, em controladores). Essa é uma camada adicional de proteção para o aplicativo.


Ele deve ser especificado explicitamente usando a anotação @EnableGlobalMethodSecurity .


O que a anotação @RolesAllowed faz?

Esta anotação é baseada no JSR-250.
@RolesAllowed permite configurar o acesso aos métodos (por exemplo, na classe do controlador) usando funções.
Exemplo: @RolesAllowed(“ADMIN”) permitirá apenas usuários com a função ADMIN


Para usar, você precisa definir @EnableGlobalMethodSecurity(jsr250Enabled=true) na classe @Configuration + você precisa que esta anotação esteja no caminho de classe.


Conte-nos sobre @PreAuthorize

@PreAuthorize permite configurar o acesso ao método usando o SpEL.
Para usar, você precisa definir @EnableGlobalMethodSecurity(prePostEnabled=true)


Como todas essas anotações são implementadas?

A funcionalidade de ponta a ponta é usada usando o Spring AOP (objetos proxy).

Source: https://habr.com/ru/post/pt470786/


All Articles