Spring Security (四)

Los tres primeros capítulos de la demanda no entra en detalles, directamente al papel para completar los requisitos que se enumeran a continuación:

  1. El sitio está dividido en casa, página de usuario, departamentos página 1, página 2 departamentos, la página de administración y la página de inicio de sesión;
  2. Utilizando el nombre de usuario más contraseña, error de inicio de sesión a un error;
  3. Los tres primeros capítulos, los usuarios de tres aspectos: 1) El usuario memoria de usuario, admin; 2) utilizando el hacker puerta trasera filtro Alex; 3), y una base de datos de usuario 5 (ver datos de base de datos)
  4. Los diferentes usuarios tienen diferentes derechos, permisos diferentes pueden acceder a diferentes páginas;
  5. Página de inicio de sesión no requiere ningún permiso;
  6. Página usuario requiere de privilegios de usuario, página administrador requiere privilegios ADMIN; sector 1 página necesita USER1 o gerente derechos; el sector 2 página requiere USER2 o el Administrador de derechos;
  7. saltar automáticamente la página de inicio de sesión si el usuario no está conectado, necesita permiso para acceder a la página;
  8. Si el usuario ha iniciado la sesión, la página no tiene derecho a acceder el servidor devuelve un JSON, que indica al usuario no tiene permiso para acceder a la página

1. Principio de autenticación

Se han introducido los tres primeros capítulos, Primavera Securtiy las dos funciones es para verificar y autenticar. La autenticación es la verificación de la identidad del usuario, lo que permite al usuario iniciar sesión en el sistema. Este proceso de verificación se completa con una serie de cadenas AuthenticationProvider. Tras la autenticación exitosa, la identidad del usuario se confirma, también tiene una serie de funciones, tales como ROLE_USER o ROLE_ADMIN.

La autenticación es para determinar si una serie de procesos que el usuario tiene acceso al recurso. Para este artículo como un ejemplo, usamos la tabla de base de datos para almacenar papel myauthorization.resource y los recursos necesarios. Por ejemplo, / ** / depart2 recursos, la necesidad ROLE_ADMIN, ROLE_MANAGER, un ROLE_DEPART2 cualquiera de estas tres funciones. Y si el usuario conectado tiene uno de estos recursos, se puede acceder sin problemas, de lo contrario se producirá una AccessDeniedException, introduzca el manejador de excepciones.

El siguiente código necesario para escribir de nuevo de acuerdo con el proceso de autenticación para el proceso de autenticación:

1. Cuando el usuario no está conectado, los derechos de acceso de todos los recursos necesarios cambiará la página de inicio de sesión y tratar de conectarse;

2. Cuando el inicio de sesión de usuario tiene éxito, va a ser una serie de papeles.

3. Cuando el usuario accede a un recurso / xxx, realización FilterInvocationSecurityMetadataSource de esta clase (Este artículo es MySecurityMetadataSource) llama getAttributes acercan al juego de recursos. Se lee todos los registros de la tabla de la base de recursos de encendido / xxx partido. Si el partido tiene éxito, / xxx corresponde a una función es necesaria para la colección <ConfigAttribute> retorno; a continuación, el partido no tiene éxito / xxx no requiere ningún acceso adicional;

4. El proceso llegó a su clase de implementación de clase AccessDecisionManager decisión de autenticación (MyAccessDecisionManager), que decidirá el método puede determinar si los recursos actuales de acceso de los usuarios Can. Parámetros deciden método se puede obtener información de autenticación del usuario actual, los recursos obtenidos en el paso 3 información de las funciones es necesario, puede decidir si la autenticación de la información correspondiente en estos papeles. Por supuesto, también se puede añadir su propio método único para determinar, por ejemplo, el tiempo que el usuario tiene un papel en la liberación de todos los ROLE_ADMIN;

5. Si la autenticación se realiza correctamente, el usuario accede a la página con éxito, decida otra cosa ser lanzado en AccessDeniedException excepción método que será procesado clase de implementación AccessDeniedHandler (MyAccessDeniedHandler). Simplemente está generando un objeto JSON se convierte en una parte posterior de cadena para el cliente.

2. Código Explicación

1. La primera es la cuestión de la tabla de la base de diseño de base de datos, el papel se sigue utilizando una única estructura de la tabla, el papel de este campo es una coma separada en dos tablas, y luego desbloquear el programa para tallar, de la siguiente manera:

- ---------------------------- 
- Estructura de tabla para `user`
 - ---------- ------------------ 
DROP TABLE IF EXISTS `user`; 
CREATE TABLE `user` ( 
  ` id` bigint ( 20 ) NOT NULL AUTO_INCREMENT, 
  `name` varchar ( 32 ) NULL DEFAULT COMENTARIO ' 姓名' , 
  ` address` varchar ( 64 ) NULL DEFAULT COMENTARIO ' 联系地址' , 
  `varchar username` ( 255 ) CARACTERES utf8mb4 INTERCALAR utf8mb4_bin DEFAULT NULL COMENTARIO ' 账号' , 
  `varchar password` ( 255) CARÁCTER SET utf8mb4 COLLATE utf8mb4_bin COMENTARIO DEFAULT NULL ' 密码' , 
  `varchar roles` ( 255 ) CARÁCTER SET utf8mb4 COLLATE utf8mb4_bin COMENTARIO DEFAULT NULL ' 角色' , 
  PRIMARY KEY (` id`) 
) MOTOR = InnoDB AUTO_INCREMENT = 3 DEFAULT CHARSET = utf8 ;
- ---------------------------- 
-   Registros de `user`
 - ----------- ----------------- 
COMENZAR; 
INSERT INTO `VALORES user` ( ' 1 ' , ' Adán ' , ' Beijing ' ,' Adán ' , ' $ 2a $ 10 $ 9SIFu8l8asZUKxtwqrJM5ujhWarz / PMnTX44wXNsBHfpJMakWw3M6 ' , ' ROLE_USER ' ); 
INSERT INTO `VALORES user` ( ' 2 ' , ' SuperMan ' , ' Shanghang ' , ' súper ' , ' $ 2a $ 10 $ 9SIFu8l8asZUKxtwqrJM5ujhWarz / PMnTX44wXNsBHfpJMakWw3M6 ' , ' ROLE_USER, ROLE_ADMIN ' ); 
INSERT INTO `VALORES user` ( ' 3 ' , '' ' Beijing ' ' gerente ' ' $ 2a $ 10 $ 9SIFu8l8asZUKxtwqrJM5ujhWarz / PMnTX44wXNsBHfpJMakWw3M6 ' ' ROLE_USER, ROLE_MANAGER ' ); 
INSERT INTO `VALORES user` ( ' 4 ' , ' Usuario1 ' , ' Shanghang ' , ' usuario1 ' , ' $ 2a $ 10 $ 9SIFu8l8asZUKxtwqrJM5ujhWarz / PMnTX44wXNsBHfpJMakWw3M6 ' , ' ROLE_USER, ROLE_DEPART1 ' );
INSERT INTO `VALORES user` ( 
  `url` varchar (' 5 ' , ' Usuario2 ' , ' Shanghang ' , ' usuario2 ' , ' $ 2a $ 10 $ 9SIFu8l8asZUKxtwqrJM5ujhWarz / PMnTX44wXNsBHfpJMakWw3M6 ' , ' ROLE_USER, ROLE_DEPART2 ' ); 
COMETER; 

- ---------------------------- 
- Estructura de tabla para `resource`
 - ---------- ------------------ 
DROP TABLE IF EXISTS `resource`; 
CREATE TABLE `resource` ( 
  ` id` BIGINT ( 20 ) NOT NULL AUTO_INCREMENT, 255 ) DEFAULT NULL COMENTARIO '资源' 
  `varchar roles` ( 255 ) DEFAULT NULL COMENTARIO ' 所需角色' , 
  PRIMARY KEY (` id`) 
) MOTOR = InnoDB AUTO_INCREMENT = 3 DEFAULT CHARSET = utf8;
- ---------------------------- 
-   Registros de `resource`
 - ----------- ----------------- 
COMENZAR; 
INSERT INTO `VALORES (resource` ' 1 ' , ' / depart1 / ** ' , ' ROLE_ADMIN, ROLE_MANAGER, ROLE_DEPART1 ' 
INSERT INTO` VALORES resource` ( ' 2 ' , ); ' / depart2 / ** ' , ' ROLE_ADMIN, ROLE_MANAGER, ROLE_DEPART2 ' ); 
INSERT INTO `VALORES resource` ( ' 3 ' , ' / usuario / ** ' , ' ROLE_ADMIN, ROLE_USER ' ); 
INSERT INTO `VALORES resource` ( ' 4 ' , ' / admin / ** ' , ' ROLE_ADMIN ' ); 
COMETER;

2. Sobre la clase FilterInvocationSecurityMetadataSource (clase origen de metadatos de seguridad) a WebSecurityConfigurerAdapter cuestión de cómo configurar los artículos en línea integrada de la corriente, el uso JavaConfig sólo un método, a saber, el uso del método de withObjectPostProcessor, de la siguiente manera:

@EnableWebSecurity
 pública  clase SecurityConfiguration extiende WebSecurityConfigurerAdapter { 
    @Autowired 
    BackdoorAuthenticationProvider backdoorAuthenticationProvider; 
    @Autowired 
    MyUserDetailsService myUserDetailsService; 
    @Autowired 
    MyAccessDecisionManager myAccessDecisionManager; 
    @Autowired 
    MySecurityMetadataSource mySecurityMetadataSource; 
    @Autowired 
    MyAccessDeniedHandler myAccessDeniedHandler; 

...省略
    @ Override 
    protegida  vacío configure (HttpSecurity http) throws Exception { 
        http 
                .authorizeRequests ()
                .withObjectPostProcessor ( nueva ObjectPostProcessor <FilterSecurityInterceptor> () { 
                    @ Override 
                    pública <O se extiende FilterSecurityInterceptor> O postproceso (O objeto ) {
                         objeto .setSecurityMetadataSource (mySecurityMetadataSource);
                         objeto .setAccessDecisionManager (myAccessDecisionManager);
                         regreso  objeto ; 
                    } 
                }) 
   ...省略
3. AccessDecisionManager proporcionado a las clases de decisiones de autenticación WebSecurityConfigurerAdapter hay dos métodos, uno es el método como se describe anteriormente, el otro es
http 
                .authorizeRequests (). AccessDecisionManager (myAccessDecisionManager)

4. MyAccessDeniedHandler en este documento simplemente devuelve una clase de cadena JSON. Si no se controla una AccessDeniedException, se muestra página de error 403. La cadena devuelta aquí y el extremo delantero se pueden combinar para mostrar una página más rico.


3. Resumen

En otro tipo de autenticación en línea de introducción de artículos, a menudo denominado Spring Security construido tres AccessDecisionManager lograr la votación basada en la clase, que son AffirmativeBased, ConsensusBased y UnanimousBased. Entonces cómo implementar un voto de clase. Pero creo que el sucesor directo AccessDecisionManager y vuelva a grabar decidir el método más fácil.

Supongo que te gusta

Origin www.cnblogs.com/xc-xinxue/p/12500853.html
Recomendado
Clasificación