SpringBoot 整合Shiro Ehcache

文章目录

依赖

    <properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version><mybatis.spring.boot.version>1.3.1</mybatis.spring.boot.version><druid.version>1.0.28</druid.version><shiro.version>1.3.2</shiro.version><kaptcha.version>0.0.9</kaptcha.version></properties><!-- 集成shiro版本 --><properties><shiro.version>1.3.2</shiro.version><kaptcha.version>0.0.9</kaptcha.version></properties><!-- spring集成shiro --><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring</artifactId><version>${shiro.version}</version></dependency><!-- shiro缓存 --><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-ehcache</artifactId><version>${shiro.version}</version></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>${mybatis.spring.boot.version}</version></dependency><!-- 集成验证码 --><dependency><groupId>com.github.axet</groupId><artifactId>kaptcha</artifactId><version>${kaptcha.version}</version></dependency>

Shiro 配置类

package com.qf.config;import com.qf.realm.UserRealm;
import org.apache.shiro.cache.ehcache.EhCacheManager;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.session.mgt.SessionManager;
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.Cookie;
import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.util.LinkedHashMap;
import java.util.Map;@Configuration
public class ShiroConfig {//1,创建 SessionManager 管理会话@Bean(name = "sessionManager")//<bean class="">public SessionManager sessionManager(){DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();//设置过期时间sessionManager.setGlobalSessionTimeout(1000*60*30);//设置后台线程  清理过期的会话sessionManager.setSessionValidationSchedulerEnabled(true);//设置地址比拼接sessionidsessionManager.setSessionIdUrlRewritingEnabled(false);return sessionManager;}//2,创建SecurityManager@Bean(name="securityManager")public SecurityManager securityManager(SessionManager sessionManager,UserRealm userRealm){DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();securityManager.setSessionManager(sessionManager);//缓存管理EhCacheManager cacheManager = new EhCacheManager();cacheManager.setCacheManagerConfigFile("classpath:ehcache.xml");securityManager.setCacheManager(cacheManager);//cookie管理CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager();Cookie cookie = cookieRememberMeManager.getCookie();cookie.setMaxAge(60*60*24*3);cookie.setPath("/");securityManager.setRememberMeManager(cookieRememberMeManager);//设置自定义realmsecurityManager.setRealm(userRealm);return  securityManager;}//3,创建ShiroFilter@Bean(name="shiroFilter")public ShiroFilterFactoryBean  shiroFilterFactoryBean(SecurityManager securityManager){ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();shiroFilterFactoryBean.setSecurityManager(securityManager);//设置登录页面shiroFilterFactoryBean.setLoginUrl("/login.html");shiroFilterFactoryBean.setSuccessUrl("/index.html");shiroFilterFactoryBean.setUnauthorizedUrl("unauthorized.html");//拦截的路径的详细设置//什么Map是存取有序的?Map<String,String> map = new LinkedHashMap<>();map.put("/sys/login","anon");//匿名访问map.put("/captcha.jpg","anon");//验证码放行map.put("/**","authc");shiroFilterFactoryBean.setFilterChainDefinitionMap(map);return  shiroFilterFactoryBean;}//4,BeanLifeCycle  生命周期@Bean(name="lifecycleBeanPostProcessor")public LifecycleBeanPostProcessor lifecycleBeanPostProcessor(){LifecycleBeanPostProcessor lifecycleBeanPostProcessor = new LifecycleBeanPostProcessor();return  lifecycleBeanPostProcessor;}//5,开启aop对shiro的bean动态代理@Bean(name = "defaultAdvisorAutoProxyCreator")public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();defaultAdvisorAutoProxyCreator.setProxyTargetClass(true);//cglib方式return defaultAdvisorAutoProxyCreator;}/*** 6.开启shiro的注解** @param securityManager* @return*/@Bean(name = "authorizationAttributeSourceAdvisor")public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();advisor.setSecurityManager(securityManager);return advisor;}
}

自定义Realm

package com.qf.realm;import com.qf.pojo.SysUser;
import com.qf.service.MenuService;
import com.qf.service.RoleService;
import com.qf.service.SysUserService;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import java.util.List;@Component
public class UserRealm extends AuthorizingRealm {@Autowiredprivate SysUserService sysUserService;@Autowiredprivate RoleService roleService;@Autowiredprivate MenuService menuService;/*** 先认证** @param token* @return* @throws AuthenticationException*/@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {//1.得到用户名和密码UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken)token;String username = usernamePasswordToken.getUsername();//默认获取password的类型为char[],转换处理String password = new String(usernamePasswordToken.getPassword());//2.从数据库根据用户名查询用户信息SysUser byUsername = sysUserService.findByUsername(username);//判断查询出的用户对象(sysUser)是否为空if(byUsername==null){throw new UnknownAccountException("账户不存在");}//判断查询出的用户对象的用户密码和页面从页面传递过来的密码进行比较是否相同if(!byUsername.getPassword().equals(password)){throw new IncorrectCredentialsException("密码不正确");}//判断查询出的用户对象的用户的可用状态  0 -> 账户冻结状态if(byUsername.getStatus()==0){throw new LockedAccountException("账户被冻结");}SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(byUsername,password,this.getName());return info;}/*** 后授权** @param principals* @return*/@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {//1.从principals中获取用户信息SysUser sysUser = (SysUser)principals.getPrimaryPrincipal();//2.获取userIdLong userId = sysUser.getUserId();//3.通过userId获取当前用户的角色信息List<String> rolsByUserID = roleService.findRolsByUserID(userId);//4.通过userId获取当前用户的权限信息List<String> permsByUserId = menuService.findPermsByUserId(userId);//5.把角色和权限信息封装到SimpleAuthorizationInfo中,进行返回SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();info.addRoles(rolsByUserID);info.addStringPermissions(permsByUserId);return info;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/520326.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQLServer AlwaysOn在阿里云的前世今生

缘起 早在2015年的时候&#xff0c;随着阿里云业务突飞猛进的发展&#xff0c;SQLServer业务也积累了大批忠实客户&#xff0c;其中一些体量较大的客户在类似大促的业务高峰时RDS的单机规格&#xff08;规格是按照 内存CPUIOPS 一定比例分配&#xff0c;根据底层资源不同都会有…

构建企业数字化转型协同力有多难?青云发布workly.ai誓要解决这些棘手的问题!...

戳蓝字“CSDN云计算”关注我们哦&#xff01;相信大部分人都经历过办公中的手忙脚乱与无所适从&#xff0c;每天面对无数的任务与工作本就是一项挑战&#xff0c;而在办公中面对不同终端协同工具&#xff0c;所带来的那些令人头疼的密码、来不及回复的信息与邮件、繁琐的办公流…

docker无法连接mysql镜像_关于Docker官方CentOS镜像无法启动mysqld的总结

很多童鞋反映&#xff0c;在Docker官方CentOS镜像中安装了Mysql server后&#xff0c;无法正常启动。无法正常启动表现为两种情况&#xff1a;1> 初始完数据库后&#xff0c;mysqld启动报错2> systemctl start mysqld或者service mysqld start报错首先重现一下现场。第一…

阿里云高级技术专家带你全面了解云主机性能评测

钱超&#xff0c;花名西邪&#xff0c;阿里云高级技术专家&#xff0c;超12年老阿里&#xff0c;是云主机性能领域的知名专家。 在目前的云计算测评领域&#xff0c;很多性能测评存在营销的包装&#xff0c;容易引起误导&#xff1a;比如用瞬时性能引导读者得出结论&#xff0…

RabbitMQ控制台详解

文章目录属性说明overview→Totals所有队列的阻塞情况Ready待消费的消息总数Unacked待应答的消息总数Total总数 ReadyUnacked 属性说明Publishproducter pub消息的速率Publisher confirmbroker确认pub消息的速率Deliver(manual ack)ustomer手动确认的速率Deliver( auto ack)cu…

阿里云HBase携X-Pack再进化,重新赋能轻量级大数据平台

一、八年双十一&#xff0c;造就国内最大最专业HBase技术团队 阿里巴巴集团早在2010开始研究并把HBase投入生产环境使用&#xff0c;从最初的淘宝历史交易记录&#xff0c;到蚂蚁安全风控数据存储。持续8年的投入&#xff0c;历经8年双十一锻炼。4个PMC&#xff0c;6个committ…

2018阿里云双12年终大促主会场全攻略

2018阿里云双12年终大促活动已经于12月7日正式开启&#xff0c;从已开放的活动页面来看&#xff0c;活动分为两个阶段&#xff1a; 12月7日-12月23日的拉新返现阶段和12月24日-12月28日的TOP100英雄榜PK阶段。 活动核心亮点&#xff1a; 老会员拉新可享25%返现最高2.5万奖金&a…

RabbitMQ集群原理介绍

文章目录一、RabbitMQ默认集群原理1. RabbitMQ集群元数据的同步2. 为何RabbitMQ集群仅采用元数据同步的方式3. RabbitMQ集群发送/订阅消息的基本原理4. 客户端直接连接队列所在节点5. 客户端连接的是非队列数据所在节点7. 集群节点类型磁盘节点内存节点8. 总结二、RabbitMQ镜像…

mysql统计每周每个学校新增学生数量_深入学习之mysql(四)聚合函数

聚合函数&#xff1a;COUNT统计记录的条数、SUM求和函数、AVG求平均值、MAX求最大值、MIN求最小值一、COUNT练习&#xff1a;1、统计学校一共有多少个学生&#xff1a;mysql> SELECT COUNT(*) AS Total FROM t_student;-------| Total |-------| 13 |-------1 row in set (0…

阿里云物联网平台体验(树莓派+Python篇)

阿里云物联网平台体验(树莓派Python篇) 虽然对阿里云物联网平台比较熟悉了&#xff0c;从一开始就有幸参与了飞凤平台&#xff08;Link Develop 一站式开发平台的前身&#xff09;的一些偏硬件接入的工作。但是同时也见证了阿里云物联网团队从几十人到数百人的迅速扩张&#x…

阿里云物联网边缘计算加载MQTT驱动

写在前面 本文在LinkEdge快速入门样例驱动的基础上&#xff0c;加载了MQTT订阅的客户端&#xff0c;使得边缘端容器可以通过MQTT获得外部数据。 1. 系统需求 物联网边缘计算平台&#xff0c;又名Link IoT Edge[1]。在物联网边缘计算帮助文档中的 “快速入门”描述了…

RabbitMQ镜像策略set_policy

添加vhosts rabbitmqctl add_vhost <vhost>rabbitmqctl delete_vhost <vhost>rabbitmqctl list_vhosts [<vhostinfoitem> ...]参数设置格式&#xff1a; #设置 rabbitmqctl set_policy [-p <vhost>] [--priority <priority>] [--apply-to <a…

IBM推出可加快响应跨云网络威胁的开放技术 业界首次实现跨安全工具和跨云的搜索威胁功能,无需移动数据

&#xff08;2019年11月20日&#xff0c;美国纽约州阿蒙克&#xff09;IBM发布了Cloud Pak for Security&#xff0c;创新性地实现了业界首次无需从原始数据源移动数据而能连接任意安全工具、云和本地部署的系统。该平台现已可用&#xff0c;包括了用于搜索威胁的开源技术&…

mysql做文本挖掘_4graphlab简单文本挖掘

爬虫Python基础、数据分析扩展包Numpy、pandas、matplotlib&#xff0c;Python读取MySQL数据&#xff0c;Python爬虫及Scrapy框架&#xff0c;无监督机器学习算法聚类分析等&#xff0c;以及案例&#xff1a;互联网金融行业客户价值分析等。机器学习机器学习是一门多领域交叉学…

完爆 Best Fit,看阿里如何优化 Sigma 在线调度策略节约亿级成本

2018 年“双 11”的交易额又达到了一个历史新高度 2135 亿。相比十年前&#xff0c;我们的交易额增长了 360 多倍&#xff0c;而交易峰值增长了 1200 多倍。相对应的&#xff0c;系统数呈现爆发式增长。系统在支撑“双 11”过程中的复杂度和难度呈现指数级形式上升趋势。 作为…

重磅!阿里巴巴工程师获得 containerd 社区席位,与社区共建云时代容器标准

重磅&#xff01;阿里巴巴工程师获得 containerd 社区席位&#xff0c;与社区共建云时代容器标准 11 月 29 日&#xff0c;CNCF containerd 社区正式宣布&#xff1a;两位阿里巴巴工程师正式获得 containerd 社区席位&#xff0c;成为 containerd 社区 Reviewer&#xff0c;未…

RabbitMQ管控台操作手册

文章目录一、MQ管控台配置1.1. 修改guest用户的默认密码1.2. 创建Virtual Hosts1.3. 创建用户1.4. 给Virtual Hosts指定用户1.5. 给Virtual Hosts创建监控用户1.6. 给Virtual Hosts指定监控用户二、 验证2.1.给proj-01项目配置mq连接信息2.2.为proj-01项目声明队列和交换机2.3.…

只有程序员才能读懂的三国演义(一)

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | popsuper1982责编&#xff5c;阿秃这是通过三国演义串起操作系统的原理。第一回&#xff1a;宴桃园豪杰三结义&#xff0c;开放平台启动内核话说天下大势&#xff0c;分久必合&#xff0c;合久必分。IT江湖起起伏伏&#xff…

基于协同过滤算法的推荐

基于协同过滤算法的推荐 &#xff08;本实验选用数据为真实电商脱敏数据&#xff0c;仅用于学习&#xff0c;请勿商用&#xff09; 数据挖掘的一个经典案例就是尿布与啤酒的例子。尿布与啤酒看似毫不相关的两种产品&#xff0c;但是当超市将两种产品放到相邻货架销售的时候&a…

python三菱_三菱机器人melfarxm.ocx控件的Python使用,MelfaRxMOCX,python,用法

1. 安装控件 \MelfaRXM\MelfaRXM_Dev\Redist\Installer2. 在WINDOWS/System32里找到MelfaRxM.ocx3.把OCX控件转成C#的DLLa.打vs的开发人员命令行b.把刚刚的OCX放到命令行显示的目录c.在命令输入 &#xff1a; aximp MelfaRxM.ocx生成的DLL就是pythonnet可用调用的DLL的4.p…