|
|
@ -12,27 +12,59 @@ 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的配置类,用于配置Shiro框架相关的组件和功能,通过定义多个Bean方法来创建并配置Shiro中的核心组件,
|
|
|
|
|
|
|
|
// 如Realm(用于认证和授权的领域对象)、缓存管理器、安全管理器、过滤器工厂等,这些组件协同工作,为Web应用提供基于角色和权限的安全访问控制功能。
|
|
|
|
@Configuration
|
|
|
|
@Configuration
|
|
|
|
public class ShiroConfiguration {
|
|
|
|
public class ShiroConfiguration {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 定义一个静态的LinkedHashMap,用于存储URL路径与对应的Shiro过滤器链定义,其中键表示URL的匹配模式,值表示对应的过滤器链定义(例如需要进行何种认证、授权等操作),
|
|
|
|
|
|
|
|
// 后续会将该映射配置到ShiroFilterFactoryBean中,用于控制不同URL的访问权限和安全策略。
|
|
|
|
private static Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>();
|
|
|
|
private static Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 创建并配置MemberRealm(自定义的Realm,用于实现具体的认证和授权逻辑,应该继承自Shiro的相关Realm类并实现了特定的业务逻辑)的Bean,
|
|
|
|
|
|
|
|
* 该Realm会被注入到安全管理器(SecurityManager)中,作为Shiro进行用户认证和授权操作的核心逻辑处理单元,根据业务需求从数据库等数据源获取用户信息、权限信息等进行相应验证。
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @return 返回创建好的MemberRealm实例,Spring容器会管理该实例,并将其提供给其他Shiro组件(如安全管理器)使用,以实现认证和授权功能。
|
|
|
|
|
|
|
|
*/
|
|
|
|
@Bean(name = "shiroRealm")
|
|
|
|
@Bean(name = "shiroRealm")
|
|
|
|
public MemberRealm getShiroRealm() {
|
|
|
|
public MemberRealm getShiroRealm() {
|
|
|
|
return new MemberRealm();
|
|
|
|
return new MemberRealm();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 创建并配置EhCacheManager(基于EhCache的缓存管理器)的Bean,用于管理Shiro框架中的缓存,例如缓存用户的认证信息、授权信息等,
|
|
|
|
|
|
|
|
* 可以提高系统性能,减少频繁查询数据库等操作,通过设置配置文件路径(classpath:ehcache-shiro.xml)来加载具体的缓存配置信息,确定缓存的策略、过期时间等相关设置。
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @return 返回创建好的EhCacheManager实例,Spring容器会管理该实例,并将其注入到安全管理器等相关Shiro组件中,使其生效用于缓存管理。
|
|
|
|
|
|
|
|
*/
|
|
|
|
@Bean(name = "shiroEhcacheManager")
|
|
|
|
@Bean(name = "shiroEhcacheManager")
|
|
|
|
public EhCacheManager getEhCacheManager() {
|
|
|
|
public EhCacheManager getEhCacheManager() {
|
|
|
|
EhCacheManager em = new EhCacheManager();
|
|
|
|
EhCacheManager em = new EhCacheManager();
|
|
|
|
|
|
|
|
// 设置EhCache的配置文件路径,该文件通常定义了缓存的名称、缓存的策略(如内存缓存、磁盘缓存等)、缓存的过期时间、最大缓存数量等相关配置信息,
|
|
|
|
|
|
|
|
// Shiro会根据该配置文件来初始化和管理缓存,这里使用classpath路径表示从类路径下查找该配置文件。
|
|
|
|
em.setCacheManagerConfigFile("classpath:ehcache-shiro.xml");
|
|
|
|
em.setCacheManagerConfigFile("classpath:ehcache-shiro.xml");
|
|
|
|
return em;
|
|
|
|
return em;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 创建并配置LifecycleBeanPostProcessor(生命周期Bean后置处理器)的Bean,用于管理Shiro组件在Spring容器中的生命周期,
|
|
|
|
|
|
|
|
* 它可以自动调用Shiro组件实现了相关生命周期接口的方法(如初始化、销毁方法等),确保Shiro组件在正确的时机进行相应的初始化和资源释放操作,保证系统的稳定性和资源管理的合理性。
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @return 返回创建好的LifecycleBeanPostProcessor实例,Spring容器会管理该实例,并使其作用于Shiro组件的生命周期管理过程中。
|
|
|
|
|
|
|
|
*/
|
|
|
|
@Bean(name = "lifecycleBeanPostProcessor")
|
|
|
|
@Bean(name = "lifecycleBeanPostProcessor")
|
|
|
|
public LifecycleBeanPostProcessor getLifecycleBeanPostProcessor() {
|
|
|
|
public LifecycleBeanPostProcessor getLifecycleBeanPostProcessor() {
|
|
|
|
return new LifecycleBeanPostProcessor();
|
|
|
|
return new LifecycleBeanPostProcessor();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 创建并配置DefaultAdvisorAutoProxyCreator(默认的顾问自动代理创建器)的Bean,用于在Spring AOP框架中创建基于顾问(Advisor)的自动代理,
|
|
|
|
|
|
|
|
* 在Shiro与Spring整合时,它可以帮助自动创建代理对象,使得Shiro的安全拦截等功能能够通过AOP机制应用到相应的方法或类上,实现权限控制等安全相关的切面逻辑,
|
|
|
|
|
|
|
|
* 通过设置proxyTargetClass为true,表示使用基于类的代理方式(而不是基于接口的代理方式,具体取决于业务场景和需求)。
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @return 返回创建好的DefaultAdvisorAutoProxyCreator实例,Spring容器会管理该实例,并使其在Spring AOP和Shiro整合过程中发挥作用,创建合适的代理对象用于安全控制。
|
|
|
|
|
|
|
|
*/
|
|
|
|
@Bean
|
|
|
|
@Bean
|
|
|
|
public DefaultAdvisorAutoProxyCreator getDefaultAdvisorAutoProxyCreator() {
|
|
|
|
public DefaultAdvisorAutoProxyCreator getDefaultAdvisorAutoProxyCreator() {
|
|
|
|
DefaultAdvisorAutoProxyCreator daap = new DefaultAdvisorAutoProxyCreator();
|
|
|
|
DefaultAdvisorAutoProxyCreator daap = new DefaultAdvisorAutoProxyCreator();
|
|
|
@ -40,14 +72,30 @@ public class ShiroConfiguration {
|
|
|
|
return daap;
|
|
|
|
return daap;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 创建并配置DefaultWebSecurityManager(默认的Web安全管理器)的Bean,它是Shiro框架在Web应用中进行安全管理的核心组件,
|
|
|
|
|
|
|
|
* 负责协调和管理其他安全相关的组件,如Realm(用于认证和授权的具体逻辑实现)、缓存管理器(用于缓存相关信息以提高性能)等,
|
|
|
|
|
|
|
|
* 通过将自定义的MemberRealm和EhCacheManager注入到其中,使其具备了根据业务逻辑进行用户认证、授权以及缓存管理的能力,从而实现整个Web应用的安全访问控制功能。
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @return 返回创建好的DefaultWebSecurityManager实例,Spring容器会管理该实例,并将其作为核心的安全管理组件应用到Shiro的整个安全体系中,例如配置到ShiroFilterFactoryBean中用于处理请求的安全验证等操作。
|
|
|
|
|
|
|
|
*/
|
|
|
|
@Bean(name = "securityManager")
|
|
|
|
@Bean(name = "securityManager")
|
|
|
|
public DefaultWebSecurityManager getDefaultWebSecurityManager() {
|
|
|
|
public DefaultWebSecurityManager getDefaultWebSecurityManager() {
|
|
|
|
DefaultWebSecurityManager dwsm = new DefaultWebSecurityManager();
|
|
|
|
DefaultWebSecurityManager dwsm = new DefaultWebSecurityManager();
|
|
|
|
|
|
|
|
// 设置自定义的Realm,将之前创建的MemberRealm实例注入到安全管理器中,使得安全管理器在进行认证和授权操作时能够调用MemberRealm中实现的具体业务逻辑。
|
|
|
|
dwsm.setRealm(getShiroRealm());
|
|
|
|
dwsm.setRealm(getShiroRealm());
|
|
|
|
|
|
|
|
// 设置缓存管理器,将之前创建的EhCacheManager实例注入到安全管理器中,使得安全管理器能够利用缓存来管理用户认证信息、授权信息等,提高系统性能和响应速度。
|
|
|
|
dwsm.setCacheManager(getEhCacheManager());
|
|
|
|
dwsm.setCacheManager(getEhCacheManager());
|
|
|
|
return dwsm;
|
|
|
|
return dwsm;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 创建并配置AuthorizationAttributeSourceAdvisor(授权属性源顾问)的Bean,它是Shiro与Spring AOP整合用于处理授权相关切面逻辑的组件,
|
|
|
|
|
|
|
|
* 通过设置安全管理器(将之前创建的DefaultWebSecurityManager实例注入其中),使得在进行方法调用等操作时,能够基于Shiro的授权机制对方法进行权限验证,
|
|
|
|
|
|
|
|
// 例如判断当前用户是否具有访问某个被@RequiresPermissions等授权注解标注的方法的权限,从而实现细粒度的权限控制功能。
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @return 返回创建好的AuthorizationAttributeSourceAdvisor实例,Spring容器会管理该实例,并使其在Spring AOP和Shiro整合的授权控制过程中发挥作用,对方法进行权限验证等操作。
|
|
|
|
|
|
|
|
*/
|
|
|
|
@Bean
|
|
|
|
@Bean
|
|
|
|
public AuthorizationAttributeSourceAdvisor getAuthorizationAttributeSourceAdvisor() {
|
|
|
|
public AuthorizationAttributeSourceAdvisor getAuthorizationAttributeSourceAdvisor() {
|
|
|
|
AuthorizationAttributeSourceAdvisor aasa = new AuthorizationAttributeSourceAdvisor();
|
|
|
|
AuthorizationAttributeSourceAdvisor aasa = new AuthorizationAttributeSourceAdvisor();
|
|
|
@ -55,15 +103,30 @@ public class ShiroConfiguration {
|
|
|
|
return new AuthorizationAttributeSourceAdvisor();
|
|
|
|
return new AuthorizationAttributeSourceAdvisor();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 创建并配置ShiroFilterFactoryBean(Shiro过滤器工厂Bean)的Bean,它是Shiro在Web应用中配置URL过滤器链的核心组件,
|
|
|
|
|
|
|
|
* 用于定义不同URL路径需要应用的Shiro过滤器(如认证过滤器、授权过滤器等),从而实现对Web资源的访问控制,通过设置安全管理器、登录页面URL、成功登录后的跳转URL以及具体的过滤器链定义映射等参数,
|
|
|
|
|
|
|
|
* 来定制整个Web应用的安全访问策略,例如哪些URL需要用户登录后才能访问,哪些URL可以匿名访问等情况。
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @return 返回配置好的ShiroFilterFactoryBean实例,Spring容器会管理该实例,并根据其配置的过滤器链定义等信息,对Web请求进行相应的安全拦截和处理,实现Web应用的安全访问控制功能。
|
|
|
|
|
|
|
|
*/
|
|
|
|
@Bean(name = "shiroFilter")
|
|
|
|
@Bean(name = "shiroFilter")
|
|
|
|
public ShiroFilterFactoryBean getShiroFilterFactoryBean() {
|
|
|
|
public ShiroFilterFactoryBean getShiroFilterFactoryBean() {
|
|
|
|
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
|
|
|
|
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
|
|
|
|
|
|
|
|
// 设置安全管理器,将之前创建的DefaultWebSecurityManager实例注入到ShiroFilterFactoryBean中,使得过滤器工厂能够利用安全管理器进行认证、授权等安全相关的操作,
|
|
|
|
|
|
|
|
// 根据安全管理器中配置的Realm、缓存管理器等组件来判断请求是否合法、用户是否具有访问权限等情况。
|
|
|
|
shiroFilterFactoryBean.setSecurityManager(getDefaultWebSecurityManager());
|
|
|
|
shiroFilterFactoryBean.setSecurityManager(getDefaultWebSecurityManager());
|
|
|
|
|
|
|
|
// 设置登录页面的URL,当用户访问需要认证但未登录的资源时,Shiro会自动重定向到该URL,让用户进行登录操作,这里设置为"/login",表示应用中对应的登录页面路径。
|
|
|
|
shiroFilterFactoryBean.setLoginUrl("/login");
|
|
|
|
shiroFilterFactoryBean.setLoginUrl("/login");
|
|
|
|
|
|
|
|
// 设置用户成功登录后的跳转URL,当用户登录成功后,Shiro会自动重定向到该URL,这里设置为"/index",表示登录成功后默认跳转到应用中的首页路径(具体根据业务需求确定)。
|
|
|
|
shiroFilterFactoryBean.setSuccessUrl("/index");
|
|
|
|
shiroFilterFactoryBean.setSuccessUrl("/index");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 将定义好的URL路径与对应的Shiro过滤器链定义的映射添加到ShiroFilterFactoryBean中,例如将"/member/**"路径设置为需要进行认证("authc"表示需要进行身份认证的过滤器),
|
|
|
|
|
|
|
|
// 将"/**"路径设置为可以匿名访问("anon"表示允许匿名访问的过滤器),通过这样的配置来精确控制不同URL资源的访问权限,实现灵活的安全访问策略。
|
|
|
|
filterChainDefinitionMap.put("/member/**", "authc");
|
|
|
|
filterChainDefinitionMap.put("/member/**", "authc");
|
|
|
|
filterChainDefinitionMap.put("/**", "anon");
|
|
|
|
filterChainDefinitionMap.put("/**", "anon");
|
|
|
|
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
|
|
|
|
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
|
|
|
|
|
|
|
|
|
|
|
|
return shiroFilterFactoryBean;
|
|
|
|
return shiroFilterFactoryBean;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|