Preparación para la certificación profesional de primavera. Seguridad de primavera

Este artículo es una traducción del artículo Spring Professional Certification Prep .


Cubrirá el tema de Spring Security y las principales preguntas al respecto.


También se puede usar para prepararse para una entrevista.


↓ Otros artículos están disponibles en los enlaces en la tabla de contenido ↓


Tabla de contenidos
  1. Inyección de dependencia, contenedor, IoC, frijoles
  2. AOP (programación orientada a aspectos)
  3. JDBC, Transacciones, JPA, Spring Data
  4. Bota de primavera
  5. Mvc de primavera
  6. Seguridad de primavera
  7. DESCANSO
  8. Prueba




Preguntas en sí mismas:


¿Qué es autenticación y autorización?

La autenticación es el proceso de verificación del usuario de un sistema informático.
Así es como sucede en primavera:


  1. La contraseña y el nombre de usuario resultantes se convierten en una instancia de UsernamePasswordAuthenticationToken . Implementa la interfaz de autenticación .
  2. El token se pasa al objeto AuthenticationManager para su verificación.
  3. Si tiene éxito, AM devuelve un objeto de Authentication poblado
  4. El contexto de seguridad se establece llamando a SecurityContextHolder.getContext().setAuthentication(...)

La autorización es el proceso de verificar que el usuario tiene el rol requerido para tomar una acción. Durante la autorización, se verifica si tiene los derechos adecuados para acceder al recurso.


Proceso:


  1. Por el principal (principal) del usuario, se muestra su rol
  2. Rol de usuario verificado contra rol de recurso

Primero, se lleva a cabo la autenticación, y luego la autenticación.


¿Cómo funciona la seguridad internamente?
  • Usar proxys Spring AOP que heredan de la clase AbstractSecurityInterceptor.


    Se utiliza para métodos que requieren autorización.


  • La infraestructura web de seguridad se basa en filtros de servlet.



El primer paso es configurar el filtro DelegatingFilterProxy . FilterChainProxy la solicitud a FilterChainProxy .


FilterChainProxy es un bean que acepta uno o más SecurityFilterChain en el constructor.


SeccurityFilterChain compara la URL en la solicitud con una lista de filtros.



Características clave involucradas en Spring Security

SecurityContextHolder : contiene y proporciona acceso a SecurityContext en la aplicación.


SecurityContext : la implementación predeterminada de Spring Security que contiene el objeto de autenticación.


Authentication : proporciona un token para una solicitud de autenticación o para un principal que se ha autenticado. También contiene una lista de poderes a los que el director tiene acceso.


GrantedAuthority : contiene la autoridad otorgada al principal GrantedAuthority .


UserDetails del usuario: contiene información sobre el usuario: contraseña, inicio de sesión, permisos. Esta información se utiliza para crear un objeto de autenticación después de una autenticación exitosa.


UserDetailsService : este servicio recupera información sobre el usuario del repositorio (memoria de programa, base de datos, etc.) y la coloca en UserDetails.


¿Qué es un filtro proxy delegado?

La clase DelegatingFilterProxy es una clase que implementa la interfaz javax.Servlet.Filter .


Este es un filtro especial que delega el trabajo a otros beans, que también son filtros.


¿Qué es la cadena de filtro de seguridad?

La cadena de filtros implementa la interfaz SecurityFilterChain . La implementación proporcionada por Spring Security es DefaultSecurityFilterChain.


El constructor DSFC acepta varios parámetros. El primer parámetro es la solicitud de coincidencia. Los parámetros restantes son filtros que implementan la interfaz servlet.Filter. Aquí están todos los filtros aceptados por DSFC:


  • ChannelProcessingFilter
  • SecurityContextPersistenceFilter
  • ConcurrentSessionFilter
  • Cualquier autenticación filter: UserNamePasswordAuthenticationFilter / CasAythenticationFilter / BasicAuthenticationFilter
  • SecurityContextHolderAwareRequestFilter
  • JaasApiIntegrationFilter
  • RemeberMeAuthenticationFilter
  • AnonymusAuthenticationFilter
  • ExceptionTranslationFilter
  • FilterSecurityInterceptor

¿Qué es un contexto de seguridad?

El objeto principal es un SecurityContextHolder . Este es el lugar donde se almacenan los detalles sobre el contexto de seguridad actual, por ejemplo, los detalles del principal que está utilizando actualmente la aplicación. Por defecto, ThreadLocal usa para el almacenamiento.


 // SecurityContext SecurityHolderContext.getContext() 

El objeto devuelto por el método getContext() es SecurityContext . Le permite recibir y configurar un objeto de Authentication .


Authentication representa las siguientes propiedades:


  • El conjunto de poderes otorgados al principal
  • Datos para la identificación del usuario (inicio de sesión, contraseña)
  • Detalles - agregar. información, si es necesario. Puede ser nulo
  • Director
  • Indicador de autenticación: variable booleana que indica si el principal pasó la prueba con éxito

¿Cómo configurar una intercepción de clic de usuario en URL específicas?
 @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") } 

¿Qué significa * en los métodos antMatchers y mvcMatchers ()?

Esta expresión significa "cualquiera".


Hay 2 tipos:


  • * - intercepta solo en el nivel en el que se usa.


    Por ejemplo, el patrón "/ orders / *" verificará los derechos del usuario si el usuario sigue


    / orders / aliens u / orders / 1, pero no / orders / alien / 1.


  • ** - intercepta en todos los niveles.
    Cualquier solicitud será verificada, / orders / aliens, / orders / 1, / orders / alien / 1.



¿Por qué es más seguro mvcMatcher que antMatcher?

Debido a que antMatcher(“/service”) asigna la ruta de solicitud solo a “/service” , mientras que mvcMatcher(“/service”) asigna a “/service” , “/service.html” , “/service.abc” .


¿Spring admite el hashing de contraseñas? ¿Qué es la sal?

Si lo hace. Hay una interfaz PasswordEncoder para el hash, que contiene solo un método:


static PasswordEncoder createDelegatingPasswordEncoder() , que devuelve el DelegatePasswordEncoder predeterminado.


La sal se usa para calcular el valor hash de la contraseña. Esta es una secuencia de números aleatorios que se utilizan para convertir una contraseña de texto en un hash. La sal se almacena en forma clara junto a la contraseña hash y se puede usar más tarde al convertir una contraseña limpia en un hash con un nuevo inicio de sesión de usuario.


¿Por qué necesitas protección para los métodos? ¿Cómo instalarlo?

Spring Security admite la protección de métodos individuales en beans (por ejemplo, en controladores). Esta es una capa adicional de protección para la aplicación.


Debe especificarse explícitamente utilizando la anotación @EnableGlobalMethodSecurity .


¿Qué hace la anotación @RolesAllowed?

Esta anotación se basa en el JSR-250.
@RolesAllowed permite configurar el acceso a los métodos (por ejemplo, en la clase de controlador) utilizando roles.
Ejemplo: @RolesAllowed(“ADMIN”) solo permitirá a los usuarios con el rol ADMIN


Para usar, debe establecer @EnableGlobalMethodSecurity(jsr250Enabled=true) en la clase @Configuration + necesita esta anotación para estar en la ruta de clase.


Cuéntanos sobre @PreAuthorize

@PreAuthorize permite configurar el acceso al método usando SpEL.
Para usar, debe establecer @EnableGlobalMethodSecurity(prePostEnabled=true)


¿Cómo se implementan todas estas anotaciones?

La funcionalidad de extremo a extremo se utiliza con Spring AOP (objetos proxy).

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


All Articles