packagecom.inslink.roboqa.shiro;importorg.apache.shiro.mgt.SecurityManager;importorg.apache.shiro.spring.LifecycleBeanPostProcessor;importorg.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;importorg.apache.shiro.spring.web.ShiroFilterFactoryBean;importorg.apache.shiro.web.mgt.CookieRememberMeManager;importorg.apache.shiro.web.mgt.DefaultWebSecurityManager;importorg.apache.shiro.web.servlet.ShiroHttpSession;importorg.apache.shiro.web.servlet.SimpleCookie;importorg.apache.shiro.web.session.mgt.DefaultWebSessionManager;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importorg.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;importorg.springframework.beans.factory.annotation.Qualifier;importorg.springframework.boot.web.servlet.FilterRegistrationBean;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.web.filter.DelegatingFilterProxy;importcom.alibaba.fastjson.JSON;importjavax.servlet.DispatcherType;importjava.util.LinkedHashMap;
@Configurationpublic classShiroConfiguration {private static final Logger logger = LoggerFactory.getLogger(ShiroConfiguration.class);
@BeanpublicMysqlSessionDao mysqlSessionDao(){return newMysqlSessionDao();
}
@BeanpublicMysqlCacheManager mysqlCacheManager(){return newMysqlCacheManager();
}
@BeanpublicFilterRegistrationBean filterRegistrationBean() {
FilterRegistrationBean filterRegistration= newFilterRegistrationBean();
filterRegistration.setFilter(new DelegatingFilterProxy("shiroFilter"));
filterRegistration.setEnabled(true);
filterRegistration.addUrlPatterns("/*");
filterRegistration.setDispatcherTypes(DispatcherType.REQUEST);returnfilterRegistration;
}
@Bean(name= "shiroFilter")public ShiroFilterFactoryBean shiroFilter(@Qualifier("securityManager") SecurityManager manager) {
ShiroFilterFactoryBean bean= newShiroFilterFactoryBean();
bean.setSecurityManager(manager);//配置登录的url和登录成功的url
bean.setLoginUrl("/login");//登录成功后要跳转的链接
bean.setSuccessUrl("/index");//未授权界面;
bean.setUnauthorizedUrl("/403");//配置访问权限//Mapfilters = new HashMap();//filters.put("perms", urlPermissionsFilter());//filters.put("anon", new AnonymousFilter());//bean.setFilters(filters);
LinkedHashMap filterChainDefinitionMap = new LinkedHashMap<>();//filterChainDefinitionMap.put("/static/**", "anon");//表示可以匿名访问//filterChainDefinitionMap.put("/loginUser", "anon");//filterChainDefinitionMap.put("/login","anon");//filterChainDefinitionMap.put("/loginIndex","authc");//filterChainDefinitionMap.put("/static/index.html","authc");//filterChainDefinitionMap.put("/**", "authc,perms");//表示需要认证才可以访问//filterChainDefinitionMap.put("/*.*", "authc");//filterChainDefinitionMap.put("/static/error.html*","anon");//filterChainDefinitionMap.put("/*", "authc,perms");//表示需要认证才可以访问
filterChainDefinitionMap.put("/*", "anon");
filterChainDefinitionMap.put("/**", "anon");
filterChainDefinitionMap.put("/*.*", "anon");
bean.setFilterChainDefinitionMap(filterChainDefinitionMap);returnbean;
}
@BeanpublicURLPermissionsFilter urlPermissionsFilter() {return newURLPermissionsFilter();
}//设置客户信息cookie管理器
@Bean(name = "rememberMeManager")publicCookieRememberMeManager rememberMeManager() {
CookieRememberMeManager rememberMeManager= newCookieRememberMeManager();
SimpleCookie cookie= newSimpleCookie(CookieRememberMeManager.DEFAULT_REMEMBER_ME_COOKIE_NAME);
cookie.setHttpOnly(true);
cookie.setMaxAge(24*60*60*7);returnrememberMeManager;
}//配置核心安全事务管理器
@Bean(name = "securityManager")public SecurityManager securityManager(@Qualifier("authRealm") AuthRealm authRealm, @Qualifier("sessionManager") DefaultWebSessionManager sessionManager, @Qualifier("rememberMeManager") CookieRememberMeManager rememberMeManager) {
System.err.println("--------------shiro已经加载----------------");
DefaultWebSecurityManager manager= newDefaultWebSecurityManager();
manager.setRealm(authRealm);
manager.setRememberMeManager(rememberMeManager);
manager.setSessionManager(sessionManager);//manager.setCacheManager(mysqlCacheManager());
returnmanager;
}//设置session管理器
@Bean(name = "sessionManager")publicDefaultWebSessionManager sessionManager() {
DefaultWebSessionManager sessionManager= newDefaultWebSessionManager();
SimpleCookie cookie= newSimpleCookie(ShiroHttpSession.DEFAULT_SESSION_ID_NAME);
cookie.setHttpOnly(true);
cookie.setMaxAge(24*60*60);
sessionManager.setSessionIdCookie(cookie);
sessionManager.setDeleteInvalidSessions(true);//设置是否删除无效session//sessionManager.setGlobalSessionTimeout(mysqlSessionDao().getExpireTime());//设置全局session超时时长//mysqlSessionDao().setCacheManager(mysqlCacheManager());
sessionManager.setSessionDAO(mysqlSessionDao());//设置自定义session操作//sessionManager.setSessionValidationSchedulerEnabled(true);//设置是否定期检查session
returnsessionManager;
}//重写报错
@Bean(name = "exceptionResolver")publicMyExceptionResolver myExceptionResolver() {return newMyExceptionResolver();
}//配置自定义的权限登录器
@Bean(name = "authRealm")public AuthRealm authRealm(@Qualifier("credentialsMatcher") CredentialsMatcher matcher) {
AuthRealm authRealm= newAuthRealm();
authRealm.setCredentialsMatcher(matcher);returnauthRealm;
}//配置自定义的密码比较器
@Bean(name = "credentialsMatcher")publicCredentialsMatcher credentialsMatcher() {return newCredentialsMatcher();
}
@BeanpublicLifecycleBeanPostProcessor lifecycleBeanPostProcessor() {return newLifecycleBeanPostProcessor();
}
@BeanpublicDefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
DefaultAdvisorAutoProxyCreator creator= newDefaultAdvisorAutoProxyCreator();
creator.setProxyTargetClass(true);returncreator;
}
@Beanpublic AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(@Qualifier("securityManager") SecurityManager manager) {
AuthorizationAttributeSourceAdvisor advisor= newAuthorizationAttributeSourceAdvisor();
advisor.setSecurityManager(manager);returnadvisor;
}
}