1 Shiro  
 
 什么是  Shiro  
 
 官网: http://shiro.apache.org/  
 
 是一款主流的  Java  安全框架,不依赖任何容器,可以运行在  Java SE  
 
 和  Java EE  项目中,它的主要作用是对访问系统的用户进行身份认证、  
 
 授权、会话管理、加密等操作。  
 
 Shiro  就是用来解决安全管理的系统化框架。 
 
 
 2 Shiro  核心组件 
   用户、角色、权限  会给角色赋予权限,给用户赋予角色  
   1 、 UsernamePasswordToken , Shiro  用来封装用户登录信息,使用 用户的登录信息来创建令牌 Token 。  
   2 、 SecurityManager , Shiro  的核心部分,负责安全认证和授权。  
   3 、 Suject , Shiro  的一个抽象概念,包含了用户信息。  
   4 、 Realm ,开发者自定义的模块,根据项目的需求,验证和授权的逻 辑全部写在 Realm  中。  
   5 、 AuthenticationInfo ,用户的角色信息集合,认证时使用。  
   6 、 AuthorzationInfo ,角色的权限信息集合,授权时使用。  
   7 、 DefaultWebSecurityManager ,安全管理器,开发者自定义的 Realm 需要注入到 DefaultWebSecurityManager  进行管理才能生 效。 
   8 、 ShiroFilterFactoryBean ,过滤器工厂, Shiro  的基本运行机制是开 发者定制规则,Shiro  去执行,具体的执行操作就是由 ShiroFilterFactoryBean 创建的一个个  Filter  对象来完成。  
   Shiro  的运行机制如下图所示。 
   
  3 Spring Boot 整合 Shiro  
   1 、创建  Spring Boot  应用,集成  Shiro  及相关组件, pom.xml 
 <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>springboot-shiro</artifactId><version>0.1.0</version><properties><java.version>11</java.version><spring.boot.version>2.5.4</spring.boot.version><shiro.version>1.7.1</shiro.version></properties><dependencies><!-- Spring Boot Starter Web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>${spring.boot.version}</version></dependency><!-- Shiro Starter --><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring-boot-starter</artifactId><version>${shiro.version}</version></dependency><!-- Other Dependencies --><!-- Add other dependencies here if needed --></dependencies><build><plugins><!-- Maven Compiler Plugin --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>${java.version}</source><target>${java.version}</target></configuration></plugin><!-- Spring Boot Maven Plugin --><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring.boot.version}</version></plugin></plugins></build></project>
 2 、自定义  Shiro  过滤器 
 import sun.net.www.protocol.http.AuthenticationInfo;public class AccoutRealm extends AuthorizingRealm {@Autowiredprivate AccountService accountService;/*** 授权** @param principalCollection* @return*/@Overrideprotected AuthorizationInfodoGetAuthorizationInfo(PrincipalCollection principalCollection) {return null;}/*** 认证** @param authenticationToken* @return* @throws AuthenticationException*/@Overrideprotected AuthenticationInfodoGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;Account account = accountService.findByUsername(token.getUsername());if (account != null) {return new SimpleAuthenticationInfo(account, account.getPassword(), getName());}return null;}
}
 3、配置类  
 @Configuration
public class ShiroConfig {
@Bean
public ShiroFilterFactoryBean
shiroFilterFactoryBean(@Qualifier("securityManager")
DefaultWebSecurityManager securityManager){
ShiroFilterFactoryBean factoryBean = new
ShiroFilterFactoryBean();
factoryBean.setSecurityManager(securityManager);
return factoryBean;
}
@Bean
public DefaultWebSecurityManager
securityManager(@Qualifier("accoutRealm") AccoutRealm
accoutRealm){
DefaultWebSecurityManager manager = new
DefaultWebSecurityManager();
manager.setRealm(accoutRealm);
return manager;
}
@Bean
public AccoutRealm accoutRealm(){
return new AccoutRealm();
}
} 编写认证和授权规则:  
  认证过滤器 anon :无需认证。  
  authc :必须认证。  
  authcBasic :需要通过  HTTPBasic  认证。  
  user :不一定通过认证,只要曾经被  Shiro  记录即可,比如:记住我。  
  授权过滤器  
  perms :必须拥有某个权限才能访问。  
  role :必须拥有某个角色才能访问。  
  port :请求的端口必须是指定值才可以。  
  rest :请求必须基于  RESTful , POST 、 PUT 、 GET 、 DELETE 。  
  ssl :必须是安全的  URL  请求,协议  HTTPS 。 
  创建  3  个页面, main.html 、 manage.html 、 administrator.html 
  访问权限如下:  
  1 、必须登录才能访问  main.html  
  2 、当前用户必须拥有  manage  授权才能访问  manage.html  
  3 、当前用户必须拥有  administrator  角色才能访问  
  administrator.html 
     Shiro  整合 Thymeleaf 
  1 、 pom.xml  引入依赖 
 <dependency><groupId> com.github.theborakompanioni </groupId><artifactId> thymeleaf-extras-shiro </artifactId><version> 2.0.0 </version></dependency>
 2 、配置类添加  ShiroDialect  
 @Beanpublic ShiroDialect shiroDialect (){return new ShiroDialect ();}
 3 、 index.html  
 <!DOCTYPE html><html lang = "en" xmlns:th = "http://www.thymeleaf.org"xmlns:shiro = "http://www.thymeleaf.org/thymeleaf-extrasshiro" ><head><meta charset = "UTF-8" ><title> Title </title><link rel = "shortcut icon" href = "#" /></head><body><h1> index </h1><div th:if = "${session.account != null}" ><span th:text = "${session.account.username}+' 欢迎回来! '" ></span><a href = "/logout" > 退出 </a></div><a href = "/main" > main </a> <br/><div shiro:hasPermission = "manage" ><a href = "manage" > manage </a> <br/></div><div shiro:hasRole = "administrator" ><a href = "/administrator" > administrator </a></div></body> </html>
数据库 
 