shiro配置类主类,shiroconfig.java
(1)配置shiro过滤器工厂ShiroFilterFactoryBean
■创建过滤器工厂
■注入安全管理器
■通用配置(跳转登录页面,为授权跳转的页面)
■设置过滤器集合
// 配置shiro过滤器工厂ShiroFilterFactoryBean
@Bean
public ShiroFilterFactoryBean getShiroFilterFactoryBean(DefaultWebSecurityManager securityManager) {
//创建shiro的过滤器工厂
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
//注入安全管理器(必须有)
shiroFilterFactoryBean.setSecurityManager(securityManager);
//通用配置
//身份认证失败,跳转到login.jsp页面(默认,可修改)
shiroFilterFactoryBean.setLoginUrl("/login.jsp");
//身份认证失败,跳转到指定页面(默认不跳转)
shiroFilterFactoryBean.setUnauthorizedUrl("/error");
//登陆成功,跳转到指定页面
shiroFilterFactoryBean.setSuccessUrl("/index");
//设置过滤器集合(匿名访问、认证访问等)
Map<String, String> map = new HashMap<String, String>();
map.put("/user/login", "anon");//anon 设置为公共资源 放行资源放在下面
map.put("/user/register", "anon");//anon 设置为公共资源 放行资源放在下面
map.put("/register.jsp", "anon");//anon 设置为公共资源 放行资源放在下面
map.put("/**", "authc");//authc 所有请求资源需要认证和授权
shiroFilterFactoryBean.setFilterChainDefinitionMap(map);
return shiroFilterFactoryBean;
}
(2)创建安全管理器对象DefaultWebSecurityManager
■创建安全管理器
■管理realm(注入自定义realm对象)、管理seesionManger(注入自定义seesionManger对象)
@Bean
public DefaultWebSecurityManager getSecurityManager(Realm realm,SessionManager sessionManager) {
//创建安全管理器
DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager();
//注入自定义realm
defaultWebSecurityManager.setRealm(realm);
//注入自定义SessionManager
defaultWebSecurityManager.setSessionManager(sessionManager);
return defaultWebSecurityManager;
}
(3)创建自定义realm对象xxxRealm
■创建自定义realm对象xxxRealm(名字是自己定义的)
■修改凭证校验匹配器
■开启缓存
@Bean
public Realm getRealm() {
//创建自定义realm对象
CustomerRealm customerRealm = new CustomerRealm();
//修改凭证校验匹配器
HashedCredentialsMatcher credentialsMatcher = new HashedCredentialsMatcher();
//设置加密算法为md5
credentialsMatcher.setHashAlgorithmName("MD5");
//设置散列次数
credentialsMatcher.setHashIterations(1024);
customerRealm.setCredentialsMatcher(credentialsMatcher);
//开启全局缓存
customerRealm.setCachingEnabled(true);
//开启认证的缓存
customerRealm.setAuthenticationCachingEnabled(true);
//开启授权的缓存
customerRealm.setAuthorizationCachingEnabled(true);
//开启缓存管理器使用shiro的EhCacheManger
customerRealm.setCacheManager(new EhCacheManager());
//给授权缓存命名
customerRealm.setAuthorizationCacheName("授权缓存");
//给认证缓存命名
customerRealm.setAuthenticationCacheName("认证缓存");
return customerRealm;
}
(4)创建会话管理器对象xxxDefaultWebSessionManager
■创建自定义对象xxxDefaultWebSessionManager(名字是自己定义的)
■注入自定义SessionDAO对象
@Bean
public SessionManager sessionManager(RedisSessionDAO redisSessionDAO){
//创建自定义的缓存管理器对象
MyDefaultWebSessionManager sessionManager = new MyDefaultWebSessionManager();
//注入自定义的SessionDAO
sessionManager.setSessionDAO(redisSessionDAO);
return sessionManager;
}
(5)创建自定义SessionDAO对象
@Bean
public RedisSessionDAO redisSessionDAO(){
RedisSessionDAO redisSessionDAO = new RedisSessionDAO();
return redisSessionDAO;
}
(6)开启对shiro注解的支持
@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();
advisor.setSecurityManager(securityManager);
return advisor;
}