La seguridad está en todas partes. Aproveché las vacaciones para leer los documentos de Shiro y documentar la integración de Shiro de Spring Boot para controlar los derechos de acceso en función de los roles en la base de datos
Introducción
Apache Shiro es un marco de seguridad de código abierto potente, flexible y abierto. Maneja la autenticación, la autorización, la gestión de la sesión empresarial y el cifrado limpiamente.
La imagen de arriba muestra la arquitectura básica de Shiro
Autenticación
A veces llamado "inicio de sesión" para demostrar que el usuario es el propio usuario
Autorización
El proceso de control de acceso, es decir, determina "quién" accede "qué"
Gestión de sesiones
Administrar sesiones específicas del usuario. En Shiro, puede encontrar que toda la información de la sesión del usuario será controlada por Shiro.
Criptografía (cifrado)
Algoritmos de cifrado en fuentes de datos al tiempo que garantiza la facilidad de uso
Comenzar
ambiente
Spring Boot 1.5.9 MySQL 5.7 Maven 3.5.2 Datos de resorte JPA Lombok
Agregar dependencias
Solo las principales dependencias de Shiro se dan aquí
<Spendency> <MoupRoMID> org.apache.shiro </groupid> <artifactid> shiro-spring-boot-starter </arfactid> <versión> 1.4.0-rc2 </versión> </pendency>
Configuración
Solo necesitamos la tabla de usuario y la tabla de roles por el momento. La modificación del archivo de configuración en Spring Boot creará automáticamente una tabla de base de datos para nosotros
server: port: 8888spring: datasource: driver-class-name: com.mysql.jdbc.Driver username: root password: root url: jdbc:mysql://localhost:3306/shiro?characterEncoding=utf-8&useSSL=false jpa: generate-ddl: true hibernate: ddl-auto: update show-sql: true
entidad
Rol.java
@Data @entitypublic class rol {@ID @Id @GeneratedValue Private Integer ID; ID de usuario largo privado; rol de cadena privada;}User.java
@Data @EntityPublic Class User {@id @GeneratedValue Private Long ID; nombre de usuario de cadena privada; contraseña de cadena privada;}Reino
Primero, cree la clase Realm, herede de autorizar Realm y personalice nuestros propios métodos de autorización y autenticación. Realm es un componente que puede acceder a datos de seguridad específicos para la aplicación, como usuarios, roles y permisos.
Realm.java
Public Class Realm se extiende AuthorizingRealm {@aUtowired private UserService UserSerService; // Autorizar la autorización protegida de @OverrideInfo dogetAuthorizationInfo (principalCollection principalCollection) {// Obtener nombre de usuario de credenciales string username = (string) SecurityUtils.getSubject (). GetPrincipal (); // consulta objeto de usuario basado en usuarios de usuarios de usuario = Userservice.getUserByUsername (nombre de usuario); // consulta los roles propiedad de la lista de usuarios <sol> list = roleservice.findbyuserid (user.getID ()); SimpleAuthorizationInfo info = new SimpleAuthorizationInfo (); para (rol rol: list) {// Dé al usuario Info.addStringPermission (rol.getRole ()); } Información de retorno; } // autorizar @Override autenticación protegidainfo dogetAuthenticationInfo (AuthenticationToken AuthenticationToken) lanza AuthenticationException {// Obtener el nombre de usuario del usuario actual String UserName = (String) AutenticationToken.getPrincipal (); // encontrar usuario del usuario de la base de datos user = userservice.getUserByUsername (nombre de usuario); if (Userservice.getUserByUsername (UserName) == NULL) {Throw New DescalledACcountException ("La información del usuario correspondiente no se encontró en este sistema"); } SimpleAuthenticationInfo info = new SimpleAuthenticationInfo (user.getUsername (), user.getPassword (), getName ()); Información de retorno; }}Clase de configuración de Shiro
Shiroconfig.java
@ConfigurationPublic Class Shiroconfig {@Bean public shirofilterFactoryBean shirofilterFactoryBean (SecurityManager SecurityManager) {shirofilterFactoryBean shirofilterFactoryBean = new shiroFilterFactoryBean (); shiroFilterFactoryBean.SetSecurityManager (SecurityManager); MAP <String, String> FilterChainDefinitionMap = new LinkedHashMap <String, String> (); // La siguiente es la cadena de filtro, filtrándose en orden, por lo que/** necesita poner el último recurso estático // abrir filtreChainDefinitionMap.put ("/favicon.ico", "anon"); // Icon web FilterChainDefinitionMap.put ("/**", "Authc"); shirofilterFactoryBean.setFilterChainDefinitionMap (filtreChainDefinitionMap); return shirofilterfactorybean; } @Bean public DefaultWebSecurityManager SecurityManager () {defaultWebSecurityManager DefaultWebSecurityManager = new DefaultWebSecurityManager (myRealM ()); return DefaultWebSecurityManager; } @Bean public myRealm myRealm () {myRealM myRealm = new myRealm (); devolver myrealm; }}Controlador
UserController.java
@ControllerPublic Class UserController {@aUtoWired private UserService UserService; @GetMapping ("/") public String index () {return "índice"; } @Getmapping ("/login") public string tOloL () {return "Login"; } @Getmapping ("/admin") public String admin () {return "admin"; } @PostMapping ("/Login") public String dologin (String UserName, String Password) {UserNamePassWordToken token = new UserNamePassWordToken (nombre de usuario, contraseña); Sujeto sujeto = SecurityUtils.getSubject (); intente {Sujem.login (token); } catch (Exception e) {E.PrintStackTrace (); } return "Redirect: Admin"; } @Getmapping ("/home") public string home () {somett = SecurityUtils.getSubject (); intente {Sujem.CheckPermission ("Admin"); } Catch (excepción no autorizedException) {System.out.println ("No hay permisos suficientes"); } regresar "Inicio"; } @Getmapping ("/logrout") public string logrout () {return "índice"; }}Servicio
Userservice.java
@ServicePublic Class UserService {@aUtowired userdao userDao; Usuario público getUserByUserName (String UserName) {return userDao.findByUsername (nombre de usuario); } @RequiresRoles ("admin") public void send () {System.out.println ("Ahora tengo el administrador de roles y puedo ejecutar esta declaración"); }}Capa de visualización
admin.html
< name = "UserName" /> <input type = "Password" name = "Password" /> <input type = "Envir" value = "Login" /> </form> </body> < /html>
casa.html
<! Doctype html> <html xmlns: th = "http://www.thymeleaf.org"> <html lang = "en"/> <head> <seta Charset = "utf-8"/> <title> Title </title> <bead> <body> Home </body> </html>
index.html
< en </a> </body> </html>
Login.html
< name = "UserName" /> <input type = "Password" name = "Password" /> <input type = "Envir" value = "Login" /> </form> </body> < /html>
Resumir
Este pequeño caso implementa el control del acceso al usuario en función de los roles, el más importante de los cuales es el reino, que actúa como un "puente" o "conector" entre Shiro y los datos de seguridad de la aplicación.
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.