Apache Shiro es un marco de seguridad de código abierto potente y flexible que maneja los procesos de control de seguridad comunes en aplicaciones de nivel empresarial, como autenticación, autorización, gestión de sesiones y cifrado a un nivel de grano fino. El objetivo principal de Apache Shiro es la facilidad de uso y la comprensión. A veces, el control del proceso de seguridad puede ser muy complicado, lo cual es un dolor de cabeza para los desarrolladores, pero no necesariamente lo significa. Los marcos deben enmascarar la complejidad tanto como sea posible y exponer una API concisa e intuitiva, simplificando así el trabajo de los desarrolladores y garantizando la seguridad de su aplicación. Esta vez hablaremos sobre cómo usar Shiro para implementar el control de permisos en las aplicaciones web de Spring.
Función
Apache Shiro es un marco integral de seguridad de aplicaciones con muchas características. La siguiente figura muestra las funciones más importantes en Shiro:
Los objetivos principales de Shiro son "cuatro piedras angulares de la seguridad de la aplicación": autenticación, autorización, gestión de sesiones y cifrado:
Arquitectura
Desde una perspectiva holística, la arquitectura de Shiro tiene tres conceptos principales: sujeto (sujeto, es decir, usuario), gerente de seguridad (administrador de seguridad) y reinos (dominio). La siguiente figura describe la relación entre estos componentes:
Estos componentes pueden entenderse de la siguiente manera:
Preparación de datos
En las aplicaciones web, el control principal sobre la seguridad son los roles, los recursos y los permisos (a qué papel puede acceder a qué recursos). Un usuario puede tener múltiples roles, y un rol también puede acceder a múltiples recursos, es decir, un rol puede corresponder a múltiples permisos. Para implementar el diseño de la base de datos, necesitamos construir al menos 5 tablas: tabla de usuario, tabla de roles, tabla de recursos, tabla de recursos de roles, tabla de rol de usuario. La estructura de estas 5 tablas es la siguiente:
Tabla de usuario:
| identificación | nombre de usuario | contraseña |
|---|---|---|
| 1 | Zhang San | 123456 |
| 2 | Li si | 66666666 |
| 3 | Wang Wu | 000000 |
Lista de roles:
| identificación | Rolename |
|---|---|
| 1 | administrador |
| 2 | gerente |
| 3 | personal |
Tabla de recursos:
| identificación | resname |
|---|---|
| 1 | /usuario/agregar |
| 2 | /usuario/eliminar |
| 3 | /Compony/Info |
Tabla de recursos de roles:
| identificación | rolid | Residuos |
|---|---|---|
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 2 | 3 |
Tabla de rol de usuario:
| identificación | ID de usuario | rolid |
|---|---|---|
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 1 | 3 |
La clase POJO correspondiente es la siguiente:
/*** Usuario*/Public Class User {Private Integer ID; nombre de usuario de cadena privada; contraseña de cadena privada; // Getter & Setter ...} /*** rol*/public class rol {private String id; string privado rolename;} /*** Resource*/Public Class Resource {private String id; Resname de cadena privada;} /*** Roleurce*/public class Roleres {private String id; cadena privada rolyId; Residente de cadena privada;} /*** Rol de usuario*/public class Userrole {private String id; String de usuario de cadena privada; cadena privada rolyId;} Para obtener pasos detallados para integrar Spring y Shiro, consulte mi blog "Integrar Apache Shiro en aplicaciones de primavera". Aquí agregamos: debe presentar las dependencias de Shiro de antemano, abrir MVNRepository.com y buscar shiro. Necesitamos las tres primeras dependencias, a saber, Shiro-Core, Shiro-Web y Shiro-Spring. Tomando el proyecto Maven como ejemplo, agregue las siguientes dependencias bajo el nodo <dependencies> en pom.xml :
<Spendency> <MoupRoD> org.apache.shiro </groupid> <artifactid> shiro-core </artifactid> <verserse> 1.4.0 </versión> </pendency> <ependency> <mupoupid> org.apache.shiro </groupid> <artifactid> shiro-web </artifactid> <verserse> 1.4.0 </versión> </versión> </versión> </Versión> </Versión> </Versión> </Versión> </Versión> </Versión> </Versión> </Versión> </Versión> </Versión> </Dependency> <MoupRid> org.apache.shiro </groupid> <artifactid> shiro-spring </artifactid> <versión> 1.4.0 </versión> </pendency>
En application-context.xml debe configurar shiroFilter bean así:
< name = "Succesurl" value = "/index"/> <!-Acceso ilegal a páginas saltas-> <propiedad name = "unauthorizedURl" value = "/403"/> <!-Configuración de permiso-> <Property Name = "FilterChainDefinitions"> <Value> <!-Recursos estáticos que se pueden acceder sin autenticación y otras urls también se pueden agregar->/> ... Los recursos ignorados anteriormente, todos los demás recursos deben ser autenticados antes de que se pueda acceder a ellos ->/** = Authc </value> </Property> </Bean>
A continuación, debes definir el reino. Custom Realm está integrado de la clase AuthorizingRealm :
MyRealm de clase pública se extiende AuthorizingRealm {@autewired private UserService Userservice; / *** Permiso de verificación*/ @Override Autorización protegida en dogetAuthorizationInfo (PrincipalCollection principalCollection) {String LoginName = SecurityUtils.getSubject (). GetPrincipal (). ToString (); if (loginname! = null) {string userId = securityUtils.getSubject (). getSession (). getAttribute ("UsserssionIdSid"). toString (); // Objeto de información de permisos, utilizado para almacenar todos los roles y permisos del usuario sencillo de simpligüen encontrado Info = new SimpleAuthorizationInfo (); // colección de roles de usuario shirouser shirouser = (shirouser) principalCollection.getPrimaryPriPal (); info.setRoles (shirouser.getRoles ()); Info.addStringPermissions (shirouser.geturlset ()); Información de retorno; } return null; } / ** * Función de devolución de llamada de autenticación, call * / protegido AutenticationInfo doGetAuthenticationInfo (AuthenticationToken Token) {String UserName = (String) Token.getPrincipal (); Usuario user = nuevo usuario (); sysuser.setUsername (nombre de usuario); Pruebe {list <sysuser> users = Userservice.findbyNames (usuario); List <String> rolelist = Userservice.SelectrolenAmElistByUserID (ussers.get (0) .getId ()); if (users.size ()! = 0) {string pwd = users.get (0) .getPassword (); // Después de que se pasan todas las verificaciones, coloque la información del usuario en la sesión Session Session = SecurityUtils.getSubject (). GetSession (); session.SetAttribute ("UserSession", Uss.get (0)); session.SetAttribute ("UserssionId", users.get (0) .getId ()); session.SetAttribute ("Userroles", org.apache.commons.lang.stringutils.Join (rolelist, ",")); devolver nuevo SimpleAuthenticationInfo (nombre de usuario, ussers.get (0) .getPassword ()); } else {// El usuario no se encontró lanzar una nueva desconocidaCountException (); }} capt (excepción e) {system.out.println (e.getMessage ()); } return null; } /*** Actualice el caché de información de autorización del usuario. */ public void ClearCachedAuthorizationInfo (principios de colección principal) {super.cLearCachedAuthorizationInfo (principios); } /*** Actualice el caché de información del usuario. */ public void clearCachedauthenticationInfo (principios de colección principal) {super.cLearCachedAuthenticationInfo (principios); } /*** Borre el caché de información de autorización del usuario. */ public void ClearAllCachedAuthorizationInfo () {getAuthorizationCache (). Clear (); } /*** Borrar el caché de información del usuario. */ public void ClearAllCachedAuthenticationInfo () {getAuthenticationCache (). Clear (); } / *** Borrar todos los cachés* / public void ClearCache (Principales principales de Collection) {super.cLearCache (principales); } / *** Borrar todos los cachés de autenticación* / public void clearAllCache () {clearAllCachedAuthenticationInfo (); ClearAllCachedAuthorizationInfo (); }}Finalmente, defina un controlador para el inicio de sesión del usuario para aceptar solicitudes de inicio de sesión del usuario:
@ControllerPublic UserController {/*** User Login*/@PostMapping ("/Login") public String Login (@Valid User User, BindingResult BindingResult, redirectAttributes redirectatTributes) {try {if (bindingResult.haserrors ()) {return "; } // Use la herramienta de permiso para la autenticación, después de iniciar sesión con éxito, salte a SuccessUrl definido en el shirofilter Bean SecurityUtils.getSubject (). Login (new UserNamePassWordToken (user.getUsername (), user.getPassword ())); return "redireccionar: índice"; } Catch (AuthenticationException e) {redirectAtTributes.AddFlashAttribute ("Mensaje", "Nombre de usuario o contraseña de error"); return "redireccionar: inicio de sesión"; }}/*** logrout*/@getmapping ("/logrout") public string logrout (redirectatTributes redirectAtTributes) {SecurityUtils.getSubject (). Logrout (); return "redireccionar: inicio de sesió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.