You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
test/src-源文件/main/java/com/yf/exam/config/ShiroConfig.java

133 lines
6.9 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

// 定义包路径用于存放Shiro配置类
package com.yf.exam.config;
import com.yf.exam.ability.shiro.CNFilterFactoryBean; // 自定义过滤器工厂类
import com.yf.exam.ability.shiro.ShiroRealm; // 自定义Shiro领域类
import com.yf.exam.ability.shiro.aop.JwtFilter; // JWT认证过滤器
import lombok.extern.slf4j.Slf4j; // Lombok日志注解
import org.apache.shiro.mgt.DefaultSessionStorageEvaluator; // Shiro默认会话存储评估器
import org.apache.shiro.mgt.DefaultSubjectDAO; // Shiro默认主体DAO
import org.apache.shiro.mgt.SecurityManager; // Shiro安全管理器
import org.apache.shiro.spring.LifecycleBeanPostProcessor; // Spring生命周期Bean后处理器
import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor; // Shiro授权属性源顾问
import org.apache.shiro.spring.web.ShiroFilterFactoryBean; // Shiro过滤器工厂类
import org.apache.shiro.web.mgt.DefaultWebSecurityManager; // Shiro默认Web安全管理器
import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator; // Spring默认顾问自动代理创建器
import org.springframework.context.annotation.Bean; // Spring Bean注解
import org.springframework.context.annotation.Configuration; // Spring配置注解
import org.springframework.context.annotation.DependsOn; // Spring依赖注解
import javax.servlet.Filter; // Servlet过滤器接口
import java.util.HashMap; // Java哈希映射类
import java.util.LinkedHashMap; // Java链接哈希映射类
import java.util.Map; // Java映射类
/**
* Shiro配置类
* 用于配置和自定义Shiro框架的相关组件包括安全管理器、过滤器工厂、Realm等。
* @author bool
*/
@Slf4j // 使用Lombok注解启用Log4j2日志
@Configuration // 使用Spring注解标记为配置类
public class ShiroConfig {
/**
* 定义Shiro过滤器链
* 方法用于配置Shiro过滤器链定义哪些URL路径需要通过哪些过滤器。
*
* @param securityManager Shiro安全管理器
* @return ShiroFilterFactoryBean Shiro过滤器工厂Bean
*/
@Bean("shiroFilterFactoryBean") // 使用Spring注解声明为Bean并指定Bean名称
public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {
CNFilterFactoryBean shiroFilterFactoryBean = new CNFilterFactoryBean(); // 创建自定义过滤器工厂Bean
shiroFilterFactoryBean.setSecurityManager(securityManager); // 设置安全管理器
// 定义过滤器链
Map<String, String> map = new LinkedHashMap<>(); // 创建拦截器映射
// 配置不需要认证的路径
map.put("/exam/api/sys/user/login", "anon"); // 登录接口不需要认证
map.put("/exam/api/sys/user/reg", "anon"); // 注册接口不需要认证
map.put("/exam/api/sys/user/quick-reg", "anon"); // 快速注册接口不需要认证
// 配置其他不需要认证的静态资源路径
map.put("/upload/file/**", "anon"); // 文件上传路径不需要认证
map.put("/", "anon"); // 根路径不需要认证
map.put("/v2/**", "anon"); // Swagger路径不需要认证
map.put("/doc.html", "anon"); // Swagger文档不需要认证
// ... 省略其他静态资源配置
// 添加自定义JWT过滤器
Map<String, Filter> filterMap = new HashMap<>(); // 创建过滤器映射
filterMap.put("jwt", new JwtFilter()); // 添加JWT过滤器
shiroFilterFactoryBean.setFilters(filterMap); // 设置过滤器
// 设置过滤器链定义
map.put("/**", "jwt"); // 所有请求都需要通过JWT过滤器
shiroFilterFactoryBean.setFilterChainDefinitionMap(map); // 设置过滤器链定义
return shiroFilterFactoryBean; // 返回Shiro过滤器工厂Bean
}
/**
* 定义Shiro安全管理器
* 方法用于配置Shiro安全管理器设置自定义Realm和禁用Shiro的会话存储。
*
* @param myRealm 自定义Shiro领域
* @return DefaultWebSecurityManager Shiro安全管理器
*/
@Bean("securityManager") // 使用Spring注解声明为Bean并指定Bean名称
public DefaultWebSecurityManager securityManager(ShiroRealm myRealm) {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); // 创建默认Web安全管理器
securityManager.setRealm(myRealm); // 设置自定义Realm
// 禁用Shiro的会话存储
DefaultSubjectDAO subjectDAO = new DefaultSubjectDAO(); // 创建默认主体DAO
DefaultSessionStorageEvaluator defaultSessionStorageEvaluator = new DefaultSessionStorageEvaluator(); // 创建默认会话存储评估器
defaultSessionStorageEvaluator.setSessionStorageEnabled(false); // 禁用会话存储
subjectDAO.setSessionStorageEvaluator(defaultSessionStorageEvaluator); // 设置会话存储评估器
securityManager.setSubjectDAO(subjectDAO); // 设置主体DAO
return securityManager; // 返回安全管理器
}
/**
* 定义注解支持
* 方法用于添加注解支持使得Shiro的注解可以正常工作。
*
* @return DefaultAdvisorAutoProxyCreator 顾问自动代理创建器
*/
@Bean // 使用Spring注解声明为Bean
@DependsOn("lifecycleBeanPostProcessor") // 依赖于生命周期Bean后处理器
public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator(); // 创建顾问自动代理创建器
defaultAdvisorAutoProxyCreator.setProxyTargetClass(true); // 设置代理目标类
return defaultAdvisorAutoProxyCreator; // 返回顾问自动代理创建器
}
/**
* 定义生命周期Bean后处理器
* 方法用于定义Shiro的生命周期Bean后处理器确保Shiro的组件能够按照预期的生命周期工作。
*
* @return LifecycleBeanPostProcessor 生命周期Bean后处理器
*/
@Bean // 使用Spring注解声明为Bean
public static LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
return new LifecycleBeanPostProcessor(); // 返回生命周期Bean后处理器
}
/**
* 定义授权属性源顾问
* 方法用于定义Shiro的授权属性源顾问用于处理Shiro注解中的权限控制。
*
* @param securityManager Shiro安全管理器
* @return AuthorizationAttributeSourceAdvisor 授权属性源顾问
*/
@Bean // 使用Spring注解声明为Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(DefaultWebSecurityManager securityManager) {
AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor(); // 创建授权属性源顾问
advisor.setSecurityManager(securityManager); // 设置安全管理器
return advisor; // 返回授权属性源顾问
}
}