|
|
@ -11,15 +11,24 @@ import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreato
|
|
|
|
import org.springframework.context.annotation.Bean;
|
|
|
|
import org.springframework.context.annotation.Bean;
|
|
|
|
import org.springframework.context.annotation.Configuration;
|
|
|
|
import org.springframework.context.annotation.Configuration;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 表明这是一个Spring的配置类,Spring会扫描这个类并处理其中带有@Bean注解的方法,将这些方法返回的对象注册为Spring容器中的Bean,用于配置Shiro相关的功能组件。
|
|
|
|
@Configuration
|
|
|
|
@Configuration
|
|
|
|
public class ShiroConfiguration {
|
|
|
|
public class ShiroConfiguration {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 创建一个静态的LinkedHashMap,用于存储Shiro的过滤链定义。LinkedHashMap可以保证元素的插入顺序,便于按照定义顺序来匹配过滤规则。
|
|
|
|
|
|
|
|
// 键为请求的URL路径模式,值为对应的访问控制规则(如"anon"表示匿名可访问,"authc"表示需要认证后才能访问等)。
|
|
|
|
private static Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>();
|
|
|
|
private static Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 定义一个名为"shiroRealm"的Bean,该Bean返回一个UserRealm实例。UserRealm通常是自定义的实现了Shiro的Realm接口的类,
|
|
|
|
|
|
|
|
// 用于从数据源(如数据库)中获取用户认证和授权相关的信息,是Shiro进行身份验证和权限验证的核心逻辑所在。
|
|
|
|
@Bean(name = "shiroRealm")
|
|
|
|
@Bean(name = "shiroRealm")
|
|
|
|
public UserRealm getShiroRealm() {
|
|
|
|
public UserRealm getShiroRealm() {
|
|
|
|
return new UserRealm();
|
|
|
|
return new UserRealm();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 定义一个名为"shiroEhcacheManager"的Bean,用于创建并配置EhCacheManager实例。EhCacheManager是Shiro用于缓存的管理器,
|
|
|
|
|
|
|
|
// 在这里通过设置缓存配置文件(classpath:ehcache-shiro.xml)来指定缓存的相关配置信息,比如缓存的存活时间、缓存区域划分等,
|
|
|
|
|
|
|
|
// 以提高Shiro在处理认证和授权过程中的性能,避免频繁地从数据源获取相同的数据。
|
|
|
|
@Bean(name = "shiroEhcacheManager")
|
|
|
|
@Bean(name = "shiroEhcacheManager")
|
|
|
|
public EhCacheManager getEhCacheManager() {
|
|
|
|
public EhCacheManager getEhCacheManager() {
|
|
|
|
EhCacheManager em = new EhCacheManager();
|
|
|
|
EhCacheManager em = new EhCacheManager();
|
|
|
@ -27,11 +36,17 @@ public class ShiroConfiguration {
|
|
|
|
return em;
|
|
|
|
return em;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 定义一个名为"lifecycleBeanPostProcessor"的Bean,创建并返回一个LifecycleBeanPostProcessor实例。
|
|
|
|
|
|
|
|
// LifecycleBeanPostProcessor是Shiro提供的一个用于管理Shiro相关Bean生命周期的后置处理器,
|
|
|
|
|
|
|
|
// 它能确保Shiro的各种组件(如Realm、SecurityManager等)在Spring容器中的生命周期方法(如初始化、销毁等)得到正确调用。
|
|
|
|
@Bean(name = "lifecycleBeanPostProcessor")
|
|
|
|
@Bean(name = "lifecycleBeanPostProcessor")
|
|
|
|
public LifecycleBeanPostProcessor getLifecycleBeanPostProcessor() {
|
|
|
|
public LifecycleBeanPostProcessor getLifecycleBeanPostProcessor() {
|
|
|
|
return new LifecycleBeanPostProcessor();
|
|
|
|
return new LifecycleBeanPostProcessor();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 定义一个名为"defaultAdvisorAutoProxyCreator"的Bean,创建并配置DefaultAdvisorAutoProxyCreator实例。
|
|
|
|
|
|
|
|
// 它是Spring AOP中的一个自动代理创建器,用于根据Advisor(通知器,包含了切点和增强逻辑)来自动创建代理对象,
|
|
|
|
|
|
|
|
// 设置proxyTargetClass为true表示使用基于类的代理方式(而不是基于接口的代理),这样可以确保Shiro的安全切面等逻辑能够正确应用到目标对象上。
|
|
|
|
@Bean
|
|
|
|
@Bean
|
|
|
|
public DefaultAdvisorAutoProxyCreator getDefaultAdvisorAutoProxyCreator() {
|
|
|
|
public DefaultAdvisorAutoProxyCreator getDefaultAdvisorAutoProxyCreator() {
|
|
|
|
DefaultAdvisorAutoProxyCreator daap = new DefaultAdvisorAutoProxyCreator();
|
|
|
|
DefaultAdvisorAutoProxyCreator daap = new DefaultAdvisorAutoProxyCreator();
|
|
|
@ -39,6 +54,9 @@ public class ShiroConfiguration {
|
|
|
|
return daap;
|
|
|
|
return daap;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 定义一个名为"securityManager"的Bean,创建并返回一个DefaultWebSecurityManager实例,它是Shiro在Web环境下的核心安全管理器。
|
|
|
|
|
|
|
|
// 在这里配置了它所使用的Realm(通过调用getShiroRealm()方法获取自定义的UserRealm实例)以及缓存管理器(通过调用getEhCacheManager()方法获取EhCacheManager实例),
|
|
|
|
|
|
|
|
// 负责协调Shiro的各个组件,如认证、授权、会话管理等功能的执行,是整个Shiro安全框架在应用中的核心控制组件。
|
|
|
|
@Bean(name = "securityManager")
|
|
|
|
@Bean(name = "securityManager")
|
|
|
|
public DefaultWebSecurityManager getDefaultWebSecurityManager() {
|
|
|
|
public DefaultWebSecurityManager getDefaultWebSecurityManager() {
|
|
|
|
DefaultWebSecurityManager dwsm = new DefaultWebSecurityManager();
|
|
|
|
DefaultWebSecurityManager dwsm = new DefaultWebSecurityManager();
|
|
|
@ -47,6 +65,9 @@ public class ShiroConfiguration {
|
|
|
|
return dwsm;
|
|
|
|
return dwsm;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 定义一个名为"authorizationAttributeSourceAdvisor"的Bean,创建并返回一个AuthorizationAttributeSourceAdvisor实例。
|
|
|
|
|
|
|
|
// 它是Shiro与Spring AOP结合的一个通知器,用于在方法级别进行权限控制,通过设置安全管理器(调用getDefaultWebSecurityManager()方法获取),
|
|
|
|
|
|
|
|
// 可以基于方法上的权限注解(如@RequiresPermissions等)来自动进行权限验证,实现细粒度的访问控制。
|
|
|
|
@Bean
|
|
|
|
@Bean
|
|
|
|
public AuthorizationAttributeSourceAdvisor getAuthorizationAttributeSourceAdvisor() {
|
|
|
|
public AuthorizationAttributeSourceAdvisor getAuthorizationAttributeSourceAdvisor() {
|
|
|
|
AuthorizationAttributeSourceAdvisor aasa = new AuthorizationAttributeSourceAdvisor();
|
|
|
|
AuthorizationAttributeSourceAdvisor aasa = new AuthorizationAttributeSourceAdvisor();
|
|
|
@ -54,12 +75,20 @@ public class ShiroConfiguration {
|
|
|
|
return new AuthorizationAttributeSourceAdvisor();
|
|
|
|
return new AuthorizationAttributeSourceAdvisor();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 定义一个名为"shiroFilter"的Bean,创建并返回一个ShiroFilterFactoryBean实例,它是Shiro在Web应用中用于配置过滤链的核心组件。
|
|
|
|
|
|
|
|
// 首先设置了安全管理器(通过调用getDefaultWebSecurityManager()方法获取),确定了整个过滤链的安全控制基础。
|
|
|
|
|
|
|
|
// 然后设置了登录页面的URL("/login"),即当用户未认证访问受保护资源时,会被重定向到该登录页面进行认证操作。
|
|
|
|
|
|
|
|
// 接着设置了认证成功后的跳转页面URL("/index"),用于用户成功登录后自动跳转到相应的页面。
|
|
|
|
|
|
|
|
// 之后通过往filterChainDefinitionMap中添加一系列的URL路径模式和对应的访问控制规则,来定义哪些资源是匿名可访问(如各种前端框架相关的静态资源路径),哪些资源需要认证访问("/**"表示除了前面配置的匿名可访问路径外的其他所有路径)。
|
|
|
|
|
|
|
|
// 最后将配置好的过滤链定义Map设置到ShiroFilterFactoryBean中,使其生效,从而实现整个Web应用基于Shiro的访问控制。
|
|
|
|
@Bean(name = "shiroFilter")
|
|
|
|
@Bean(name = "shiroFilter")
|
|
|
|
public ShiroFilterFactoryBean getShiroFilterFactoryBean() {
|
|
|
|
public ShiroFilterFactoryBean getShiroFilterFactoryBean() {
|
|
|
|
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
|
|
|
|
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
|
|
|
|
shiroFilterFactoryBean.setSecurityManager(getDefaultWebSecurityManager());
|
|
|
|
shiroFilterFactoryBean.setSecurityManager(getDefaultWebSecurityManager());
|
|
|
|
shiroFilterFactoryBean.setLoginUrl("/login");
|
|
|
|
shiroFilterFactoryBean.setLoginUrl("/login");
|
|
|
|
shiroFilterFactoryBean.setSuccessUrl("/index");
|
|
|
|
shiroFilterFactoryBean.setSuccessUrl("/index");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 以下是配置各种静态资源路径为匿名可访问,这些资源通常是前端框架的相关文件,不需要进行认证就能访问,方便页面正常加载和展示。
|
|
|
|
filterChainDefinitionMap.put("/jquery/**", "anon");
|
|
|
|
filterChainDefinitionMap.put("/jquery/**", "anon");
|
|
|
|
filterChainDefinitionMap.put("/adminlte/**", "anon");
|
|
|
|
filterChainDefinitionMap.put("/adminlte/**", "anon");
|
|
|
|
filterChainDefinitionMap.put("/bootstrap/**", "anon");
|
|
|
|
filterChainDefinitionMap.put("/bootstrap/**", "anon");
|
|
|
@ -87,10 +116,11 @@ public class ShiroConfiguration {
|
|
|
|
filterChainDefinitionMap.put("/favicon.ico", "anon");
|
|
|
|
filterChainDefinitionMap.put("/favicon.ico", "anon");
|
|
|
|
filterChainDefinitionMap.put("/global.min.js", "anon");
|
|
|
|
filterChainDefinitionMap.put("/global.min.js", "anon");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 将除了上述配置的匿名可访问路径之外的所有请求路径都设置为需要认证访问("authc"表示需要认证),实现了对整个Web应用的基本访问控制。
|
|
|
|
filterChainDefinitionMap.put("/**", "authc");
|
|
|
|
filterChainDefinitionMap.put("/**", "authc");
|
|
|
|
|
|
|
|
|
|
|
|
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
|
|
|
|
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
|
|
|
|
|
|
|
|
|
|
|
|
return shiroFilterFactoryBean;
|
|
|
|
return shiroFilterFactoryBean;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|