Uso de @Secured, @PreAuthorize, @PostAuthorize, @PreFilter, @PostFilter en la autorización del usuario

Uso de @Secured, @PreAuthorize, @PostAuthorize, @PreFilter, @PostFilter en la autorización del usuario

Primero, domina el significado de algunas palabras en inglés

Autorizar: autorización

Autenticación: autenticación

asegurado: protegido

¿Dónde se usa?

Estas cinco anotaciones se utilizan por encima del método en el controlador, como se muestra a continuación:

Inserte la descripción de la imagen aquí

Habilitar anotaciones para Spring Security

Primero, debe habilitar las anotaciones en la clase de inicio o la clase de configuración (con las anotaciones de @Configuration), porque Spring Security deshabilita las anotaciones de forma predeterminada. Para habilitar las anotaciones, debe agregar las anotaciones de @EnableGlobalMethodSecurity a la clase de inicio o la clase de configuración;

Si desea habilitar la anotación @Secured, debe agregar la anotación @EnanleGlobalMethodSecurity (secureEnabled = true) a la clase de inicio o la clase de configuración. Si desea habilitar las cuatro anotaciones @PreAuthorize, @PostAuthorize, @PreFilter y @PostFilter, debe ingresar a la clase de inicio o debe ingresar Agregue la anotación @EnableGlobalMethodSecurity (prePostEnabled = true) a la clase de configuración;

Por lo tanto, si queremos usar estas cinco anotaciones, primero debemos agregar @EnableGlobalMethodSecurity (secureEnabled = true, prePostEnabled = true) a la clase de inicio, para habilitar estas cinco anotaciones en Spring Security, y luego usarlas. Abra la anotación en la clase como se muestra a continuación:

Inserte la descripción de la imagen aquí

@Anotación segura

La función de la anotación @Secured: cuando el usuario envía una solicitud al navegador, accederá al método en el controlador, y luego, antes de acceder al método en el controlador, primero irá al objeto de usuario devuelto en el método de implementación de la clase de implementación de detalles de usuario UserDetailsService Verifique si tiene el rol especificado en la anotación @Secured. Si hay un rol especificado, el sistema permite al usuario acceder a este método de controlador; de lo contrario, el sistema no permite el acceso a este método de controlador; tenga en cuenta que cuando utilice @Secured para establecer el nombre del rol, el rol El nombre debe tener el prefijo ROLE_; como se muestra a continuación:

Inserte la descripción de la imagen aquí

La situación en la clase de implementación de detalles de usuario UserDetailsService es la siguiente:

Inserte la descripción de la imagen aquí

El usuario en UserDetailsService tiene el rol de ROLE_xzy, por lo que puede acceder al método de actualización en el controlador. El acceso en el navegador es el siguiente:

Inserte la descripción de la imagen aquí

@PreAuthorize anotación (autenticación de autoridad antes del método de acceso)

El rol de la anotación @PreAuthorize: después de que el navegador envía una solicitud, accederá al método correspondiente en el controlador. La anotación @PreAuthorize realizará la autenticación de permisos antes de acceder al método en el controlador. Mire el correspondiente en la clase de implementación de detalles de usuario de UserDetailsService. ¿Tiene el usuario la autoridad correspondiente? Si es así, la solicitud enviada por el usuario puede ingresar el método correspondiente en el controlador; si no hay autoridad correspondiente, entonces la solicitud enviada por el usuario no puede ingresar el método correspondiente en el controlador;

El uso de la anotación @PreAuthorize es el siguiente:

Inserte la descripción de la imagen aquí

La situación en la clase de implementación de detalles de usuario UserDetailsService es la siguiente:

Inserte la descripción de la imagen aquí

El usuario en UserDetailsService tiene permisos de administrador, por lo que puede acceder al método update2 en el controlador. El acceso en el navegador es el siguiente:Inserte la descripción de la imagen aquí

@PostAuthorize anotación (autenticación de autoridad después del método de acceso)

La función de la anotación @PostAuthorize: después de acceder al método relevante en el controlador (no se accede primero a la devolución del método), realice la autenticación de permisos para ver si el usuario en la clase de implementación de detalles de usuario UserDetailsService tiene el permiso correspondiente, si es así, entonces Se ejecutará la última declaración de retorno del método del controlador; de lo contrario, no se ejecutará la última declaración de retorno del método del controlador;

El uso de la anotación @PostAuthorize es el siguiente:

Inserte la descripción de la imagen aquí

La situación en la clase de implementación de detalles de usuario UserDetailsService es la siguiente:

Inserte la descripción de la imagen aquí

Debido a que el usuario en la clase de implementación de detalles del usuario solo tiene permisos de administrador pero no permisos de admins4 o admins5, no se ejecutará la declaración de devolución en el controlador. La situación después de solicitar acceso al navegador es la siguiente:

Inserte la descripción de la imagen aquí

Luego, puede encontrar que la declaración en el método update3 de la consola de idea se puede generar como se muestra a continuación:

Inserte la descripción de la imagen aquí

Esto significa que cuando se usa la anotación @PostAuthorize, el método en el controlador se ejecutará primero, y cuando se ejecute la última oración de retorno, se autenticará la autorización;

@PostFilter anotación

Tenga en cuenta que la anotación @PostFilter solo se puede usar cuando el valor de retorno del método del controlador es una colección;

La función de la anotación @PostFilter: si el valor de retorno del método del controlador es un conjunto, esta anotación puede filtrar y generar el conjunto de retorno;

Utilice la anotación @PostFilte para filtrar el valor de retorno del tipo de colección. Al usar @PostFilter, Spring Security eliminará los elementos que hacen que el resultado de la expresión correspondiente sea falso.

El uso de la anotación @PostFilter es el siguiente:

Inserte la descripción de la imagen aquí

El filterObject en la figura anterior es una expresión incorporada cuando se usa @PreFilter y @PostFilter, que representa el objeto actual en la colección.

El resultado correspondiente en el navegador es el siguiente:

Inserte la descripción de la imagen aquí

@PreFilter anotación

Nota: La anotación @PreFilter solo se puede usar cuando el parámetro del método del controlador es un tipo de colección

El papel de la anotación @PreFilter: puede filtrar los parámetros del método del controlador;

Cuando probé esta anotación, era la única de las cinco que no se pudo probar correctamente. Por lo tanto, fui a Baidu para buscar un resumen de esta anotación de otros bloggers y luego lo pegué directamente debajo. Si alguien conoce esta anotación Por favor, infórmeme sobre cómo probar;

Baidu pega de la siguiente manera:

filterObject es una expresión incorporada cuando se usa @PreFilter y @PostFilter, que representa el objeto actual en la colección. Cuando el método anotado por @PreFilter tiene varios parámetros de tipo conjunto, la propiedad filterTarget de @PreFilter necesita especificar qué parámetro está actualmente filtrado por @PreFilter.
 Por ejemplo, el siguiente código especifica que el @PreFilter actual se usa para filtrar los identificadores de parámetros a través de filterTarget

   @PreFilter(filterTarget="ids", value="filterObject%2==0")
   public void delete(List<Integer> ids, List<String> usernames) {
      ...
   }

Supongo que te gusta

Origin blog.csdn.net/qq_45950109/article/details/112982204
Recomendado
Clasificación