package com.eraop.common.shiro;
import at.pollux.thymeleaf.shiro.dialect.ShiroDialect;
import org.apache.shiro.cache.ehcache.EhCacheManager;
import org.apache.shiro.spring.LifecycleBeanPostProcessor;
import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.CookieRememberMeManager;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.apache.shiro.web.servlet.SimpleCookie;
import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.handler.SimpleMappingExceptionResolver;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
/**
* Shiro 配置
* Apache Shiro 核心通过 Filter 来实现,就好像SpringMvc 通过DispachServlet 来主控制一样。
* 既然是使用 Filter 一般也就能猜到,是通过URL规则来进行过滤和权限校验,所以我们需要定义一系列关于URL的规则和访问权限。
*
* @author sun
* @date 2017-4-2
*/
@Configuration
public class ShiroConfig {
@Value("${shiro.success-url}")
private String host;
@Autowired
private ShiroProperties shiroProperties;
/**
* ShiroFilterFactoryBean 处理拦截资源文件问题。
* 注意:单独一个ShiroFilterFactoryBean配置是或报错的,因为在
* 初始化ShiroFilterFactoryBean的时候需要注入:SecurityManager
* Filter Chain定义说明
* 1、一个URL可以配置多个Filter,使用逗号分隔
* 2、当设置多个过滤器时,全部验证通过,才视为通过
* 3、部分过滤器可指定参数,如perms,roles
*/
@Bean(name = "shiroFilter")
public ShiroFilterFactoryBean shiroFilterFactoryBean(DefaultWebSecurityManager securityManager) {
ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();
// 设置 securityManager
factoryBean.setSecurityManager(securityManager);
// 登录的 url,如果不设置默认会自动寻找Web工程根目录下的页面
factoryBean.setLoginUrl(shiroProperties.getLoginUrl());
// 登录成功后要跳转的连接
factoryBean.setSuccessUrl(shiroProperties.getSuccessUrl());
factoryBean.setUnauthorizedUrl(shiroProperties.getUnauthorizedUrl());
loadShiroFilterChain(factoryBean);
System.out.println("shiro拦截器工厂类注入成功");
return factoryBean;
}
/**
* 加载ShiroFilter权限控制规则
*/
private void loadShiroFilterChain(ShiroFilterFactoryBean factoryBean) {
// 下面这些规则配置最好配置到配置文件中
Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
// authc:该过滤器下的页面必须验证后才能访问,它是Shiro内置的一个拦截器,所有url都必须认证通过才可以访问
// anon:它对应的过滤器里面是空的,什么都没做,可以理解为不拦截,所有url都都可以匿名访问
// authc是认证过,user是登录过,如果开启了rememberMe功能的话,user也是可以通过的,而authc通过不了
// 设置免认证 url
List<String> anonUrls = shiroProperties.getAnonUrl();
if (anonUrls != null && anonUrls.size() > 0) {
for (String url : anonUrls) {
filterChainDefinitionMap.put(url, "anon");
}
}
filterChainDefinitionMap.put("/**", "user");
factoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
}
/**
* 用于开启 Thymeleaf 中的 shiro 标签的使用
*
* @return ShiroDialect shiro 方言对象
*/
@Bean
public ShiroDialect shiroDialect() {
return new ShiroDialect();
}
@Bean
public EhCacheManager ehCacheManager() {
EhCacheManager ehcacheManager = new EhCacheManager();
ehcacheManager.setCacheManagerConfigFile("classpath:ehcache-shiro.xml");
return ehcacheManager;
}
@Bean(name = "myShiroRealm")
public MyShiroRealm myShiroRealm(EhCacheManager ehCacheManager) {
MyShiroRealm realm = new MyShiroRealm();
realm.setCacheManager(ehCacheManager);
return realm;
}
@Bean(name = "lifecycleBeanPostProcessor")
public static LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
return new LifecycleBeanPostProcessor();
}
@Bean
public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
DefaultAdvisorAutoProxyCreator creator = new DefaultAdvisorAutoProxyCreator();
creator.setProxyTargetClass(true);
return creator;
}
@Bean(name = "securityManager")
public DefaultWebSecurityManager defaultWebSecurityManager(MyShiroRealm realm) {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
//设置realm
securityManager.setRealm(realm);
securityManager.setCacheManager(ehCacheManager());
//注入记住我管理器
securityManager.setRememberMeManager(rememberMeManager());
return securityManager;
}
@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(DefaultWebSecurityManager securityManager) {
AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();
advisor.setSecurityManager(securityManager);
return advisor;
}
//
// @Bean
// public SimpleMappingExceptionResolver resolver() {
// SimpleMappingExceptionResolver resolver = new SimpleMappingExceptionResolver();
// Properties properties = new Properties();
// properties.setProperty("org.apache.shiro.authz.UnauthorizedException", shiroProperties.getUnauthorizedUrl());
// resolver.setExceptionMappings(properties);
// return resolver;
// }
//cookie对象;
@Bean
public SimpleCookie rememberMeCookie() {
System.out.println("ShiroConfiguration.rememberMeCookie()");
//这个参数是cookie的名称,对应前端的checkbox的name = rememberMe
SimpleCookie simpleCookie = new SimpleCookie("rememberMe");
//<!-- 记住我cookie生效时间30天 ,单位秒;-->
simpleCookie.setMaxAge(shiroProperties.getCookieTimeout());
return simpleCookie;
}
//cookie管理对象;
@Bean
public CookieRememberMeManager rememberMeManager() {
System.out.println("ShiroConfiguration.rememberMeManager()");
CookieRememberMeManager manager = new CookieRememberMeManager();
manager.setCookie(rememberMeCookie());
return manager;
}
/*1.LifecycleBeanPostProcessor,这是个DestructionAwareBeanPostProcessor的子类,负责org.apache.shiro.util.Initializable类型bean的生命周期的,初始化和销毁。主要是AuthorizingRealm类的子类,以及EhCacheManager类。
2.HashedCredentialsMatcher,这个类是为了对密码进行编码的,防止密码在数据库里明码保存,当然在登陆认证的生活,这个类也负责对form里输入的密码进行编码。
3.ShiroRealm,这是个自定义的认证类,继承自AuthorizingRealm,负责用户的认证和权限的处理,可以参考JdbcRealm的实现。
4.EhCacheManager,缓存管理,用户登陆成功后,把用户信息和权限信息缓存起来,然后每次用户请求时,放入用户的session中,如果不设置这个bean,每个请求都会查询一次数据库。
5.SecurityManager,权限管理,这个类组合了登陆,登出,权限,session的处理,是个比较重要
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
























格式:zip 资源大小:18.2MB


格式:sql 资源大小:709.1KB



收起资源包目录




























































































共 60 条
- 1
资源评论



檀越@新空间
- 粉丝: 5w+
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 网站编辑个人年度工作总结.docx
- 《应用软件多精彩》参考教案5.doc
- 工程管理规则与信息化建设(版).ppt
- 高中数学第一章算法初步112第3课时循环结构学案(含解析)新人教A版必修3.doc
- 网络业务代理协议.doc
- 医院人力资源信息化系统设计与实用论文.doc
- 最新电子商务专业大学生实习报告.doc
- 智慧操作系统成本核算设计方案.docx
- 互联网企业服务活动方案.docx
- 2019-2020学年吉林省白城市通榆县第一中学高二下学期网络期中考试数学(文)试题.doc
- 资产评估行业财务管理软件培训教程.ppt
- 提升旋转式自动化立体车库.doc
- 华中科技大学操作系统原理课程设计项目方案
- 网站安全运行自查报告.docx
- 2023教师网络学习心得体会合集四篇.docx
- 塑料制品取出升降输送设备的PLC控制系统设计-自动化技术毕业论文.doc
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制
