SpringBoot整合Shiro(Java安全框架)案例(含源码)
流程图
1.主要功能介绍
- Subject:主体,一般指用户。
- SecurityManager:Shiro的核心部分,它负责安全认证与授权。Shiro本身已经实现了所有的细节,用户可以完全把它当做一个黑盒来使用,本质上就是一个工厂类似Spring中的ApplicationContext安全管理器,管理所有Subject,可以配合内部安全组件。(类似于SpringMVC中的DispatcherServlet)
- Realms:用于进行权限信息的验证,一般需要自己实现,Shiro需要根据用户名和密码首先判断登录的用户是否合法,然后再对合法用户授权。而这个过程就是Realm的实现过程。
2 详细功能 - Authentication:身份认证/登录(账号密码验证)。
- Authorization:授权,即角色或者权限验证。
- Session Manager:会话管理,用户登录后的session相关管理。
- Cryptography:加密,密码加密等。
- Web Support:Web支持,集成Web环境。
- Caching:缓存,用户信息、角色、权限等缓存到如redis等缓存中。
- Concurrency:多线程并发验证,在一个线程中开启另一个线程,可以把权限自动传播过去。
- Testing:测试支持;
- Run As:允许一个用户假装为另一个用户(如果他们允许)的身份进行访问。
- Remember Me:记住我,登录后,下次再来的话不用登录了
2.具体实现
2.1 引入依赖
2.2 模拟数据库信息
/*** 模拟数据库查询** @param userName 用户名* @return User*/private User getMapByName(String userName) {Permissions permissions1 = new Permissions("1", "query");Permissions permissions2 = new Permissions("2", "add");Set<Permissions> permissionsSet = new HashSet<>();permissionsSet.add(permissions1);permissionsSet.add(permissions2);Role role = new Role("1", "admin", permissionsSet);Set<Role> roleSet = new HashSet<>();roleSet.add(role);User user = new User("1", "wsl", "123456", roleSet);Map<String, User> map = new HashMap<>();map.put(user.getUserName(), user);Set<Permissions> permissionsSet1 = new HashSet<>();permissionsSet1.add(permissions1);Role role1 = new Role("2", "user", permissionsSet1);Set<Role> roleSet1 = new HashSet<>();roleSet1.add(role1);User user1 = new User("2", "zhangsan", "123456", roleSet1);map.put(user1.getUserName(), user1);return map.get(userName);}
2.3 自定义Realm用于查询用户的角色和权限信息并保存到权限管理器
public class CustomRealm extends AuthorizingRealm {@Autowiredprivate LoginService loginService;/*** @MethodName doGetAuthorizationInfo* @Description 权限配置类* @Param [principalCollection]* @Return AuthorizationInfo* @Author WangShiLin*/@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {//获取登录用户名String name = (String) principalCollection.getPrimaryPrincipal();//查询用户名称User user = loginService.getUserByName(name);//添加角色和权限SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();for (Role role : user.getRoles()) {//添加角色simpleAuthorizationInfo.addRole(role.getRoleName());//添加权限for (Permissions permissions : role.getPermissions()) {simpleAuthorizationInfo.addStringPermission(permissions.getPermissionsName());}}return simpleAuthorizationInfo;}/*** @MethodName doGetAuthenticationInfo* @Description 认证配置类* @Param [authenticationToken]* @Return AuthenticationInfo* @Author WangShiLin*/@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {if (StringUtils.isEmpty(authenticationToken.getPrincipal())) {return null;}//获取用户信息String name = authenticationToken.getPrincipal().toString();User user = loginService.getUserByName(name);if (user == null) {//这里返回后会报出对应异常return null;} else {//这里验证authenticationToken和simpleAuthenticationInfo的信息SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(name, user.getPassword().toString(), getName());return simpleAuthenticationInfo;}}
}
2.4 构建shiro配置类 ShiroConfig.java,把CustomRealm和SecurityManager等注入到spring容器中(主要用来加入自己的相关验证方式 对跳转路径或根据其权限进行相应的过滤)
@Configuration
public class ShiroConfig {@Bean@ConditionalOnMissingBeanpublic DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {DefaultAdvisorAutoProxyCreator defaultAAP = new DefaultAdvisorAutoProxyCreator();defaultAAP.setProxyTargetClass(true);return defaultAAP;}//将自己的验证方式加入容器@Beanpublic CustomRealm myShiroRealm() {return new CustomRealm();}//权限管理,配置主要是Realm的管理认证@Beanpublic SecurityManager securityManager() {DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();securityManager.setRealm(myShiroRealm());return securityManager;}//Filter工厂,设置对应的过滤条件和跳转条件@Beanpublic ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();shiroFilterFactoryBean.setSecurityManager(securityManager);Map<String, String> map = new HashMap<>();//登出map.put("/logout", "logout");//对所有用户认证map.put("/**", "authc");//登录shiroFilterFactoryBean.setLoginUrl("/login");//首页shiroFilterFactoryBean.setSuccessUrl("/index");//错误页面,认证不通过跳转shiroFilterFactoryBean.setUnauthorizedUrl("/error");shiroFilterFactoryBean.setFilterChainDefinitionMap(map);return shiroFilterFactoryBean;}//注入权限管理@Beanpublic AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);return authorizationAttributeSourceAdvisor;}
}
2.5 创建LoginController 对相应权限信息用户进行验证
@RestController
@Slf4j
public class LoginController {@GetMapping("/login")public String login(User user) {if (StringUtils.isEmpty(user.getUserName()) || StringUtils.isEmpty(user.getPassword())) {return "请输入用户名和密码!";}//用户认证信息Subject subject = SecurityUtils.getSubject();UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(user.getUserName(),user.getPassword());try {//进行验证,这里可以捕获异常,然后返回对应信息subject.login(usernamePasswordToken);subject.checkRole("admin");subject.checkPermissions("query", "add");} catch (UnknownAccountException e) {log.error("用户名不存在!", e);return "用户名不存在!";} catch (AuthenticationException e) {log.error("账号或密码错误!", e);return "账号或密码错误!";} catch (AuthorizationException e) {log.error("没有权限!", e);return "没有权限";}return "login success";}@RequiresRoles("admin")@GetMapping("/admin")public String admin() {return "admin success!";}@RequiresPermissions("query")@GetMapping("/index")public String index() {return "index success!";}@RequiresPermissions("add")@GetMapping("/add")public String add() {return "add success!";}
}
3.测试
首先先测试有相关权限的用户:
http://localhost:8080/login?userName=wsl&password=123456
最后测试无权限用户:
http://localhost:8080/login?userName=zhangsan&password=123456
至此 本节SpringBoot整合Shiro案例完成
SpringBoot整合Shiro(Java安全框架)案例(含源码)相关推荐
- 用Linux / C实现基于自动扩/减容线程池+epoll反应堆检测沉寂用户模型的服务器框架(含源码)
用Linux/ C实现基于自动扩/减容线程池+epoll反应堆模型的服务器框架 前言 服务器端源码 客户端源码 自定义库 helper.c 和 helper.h helper.c helper.h M ...
- 单片机零基础入门(9-1)实战:模块化编程(模块化两个案例含源码--以及无法显示头文件(.h)的解决方案)
单片机零基础入门(9-1)实战:模块化编程-(以及无法显示头文件(.h)的解决方案) 本文作为单片机零基础入门(8-5)模块化编程的拓展和补充,比前面的单片机零基础入门(8-5)模块化编程更为详细. ...
- Java+SSH水费管理系统(含源码+论文+答辩PPT等)
项目功能简介: 该项目采用技术:JSP +struts2+Spring+Hibernate+css+js+jQuery+bootstrap等相关技术,项目含有源码.文档.配套开发软件.软件安装教程.项 ...
- SpringBoot整合RocketMQ,三种测试附带源码【rocketmq-spring-boot-starter】
我们整合boot项目的时候都是引入 xxx-start 依赖,但是现在大多数的整合RocketMQ都还不是这样. 我花了一天时间使用rocketmq-spring-boot-starter整合,使得操 ...
- java基本框架代码_Rxjava 源码系列 - 基础框架分析
前言 本篇博客讲解的 Rxjava 的原理基于版本 2.1.4,RxAndroid 的原理的版本基于 2.0.2 . 基本框架 Rxjava 有四个基本的概念 Observable (可观察者,即被观 ...
- Java集合专题(含源码)
Java集合专题 一.集合是什么? 1.集合和数组的区别 2.Collection体系的继承树 2.1 Collection接口常用方法 2.2 Collection常用遍历方式 2.2.1 迭代器I ...
- Java+SSH人力资源管理系统(含源码+论文+答辩PPT等)
项目功能简介: 该项目采用技术JSP.strust2.Spring.Hibernate.Tomcat服务器.MySQL数据库 ,项目含有源码.论文.配套开发软件.软件安装教程.项目发布教程 下面是系统 ...
- Java飞机票售票管理系统(含源码+论文+答辩PPT等)
项目功能简介: 该项目采用技术:JSP +Servlet +MySQL+jdbc+css+js等相关技术,项目含有源码.课设报告.配套开发软件.软件安装教程.项目发布教程等 下面是系统运行起来后的部分 ...
- Java+JSP问卷调查系统(含源码+论文+答辩PPT等)
项目功能简介: 该项目采用技术:JSP +Servlet +MySQL+jdbc+css+js+jQuery等相关技术,项目含有源码.文档.配套开发软件.软件安装教程.项目发布教程等 本系统为Serv ...
- Java实现记事本(含源码)
使用Java fx实现的简单记事本.主要功能包括以下: 新建文件 打开文件 保存文件 另存为 复制粘贴 查找替换 插入日期 退出 主要源码如下 /*** 界面逻辑控制器,*/ @SuppressWar ...
最新文章
- linux(六)之文本操作
- utf8乱码解决方案[适合tomcat部署的jsp应用]
- 数字集成电路的层次关系
- 【OpenCV】函数imread的使用之通道数变化
- python图像处理实战 戴伊_这一套封面的程序员专业书籍你读过哪一本?
- numpy 数组抽取_清晰易懂的Numpy入门教程
- c语言中错误c2228,错误:C2228:''必须有class/struct/union
- 案例:控制文件序列号满故障处理和分析
- 决策树 随机森林 xgboost_推荐收藏 | 决策树、随机森林、bagging、boosting、Adaboost、GBDT、XGBoost总结...
- 一些关于直播间人货场的打造干货,直播电商新手必须要了解人货场的概念
- .第一天.net 学习理论
- c4d流体插件_C4D流体模拟插件 NextLimit RealFlow 2.6.5.0095 Win已注册版
- DongDong数颜色 树上启发式合并 牛客
- 4p营销组合策略案例_营销组合策略的4P讲解
- java 修改mysql数据库表结构_MYSQL数据库表结构优化方法详解
- 计算机三级应该学什么条件,计算机三级报名条件
- java modbus4j_java使用modbus4j来实现modbusTCP通信
- 潭州教育python学院_潭州什么学院,直播python课程内幕
- 计算流体力学笔记D2
- 软件案例分析——两大音乐软件的PK