流程图

1.主要功能介绍

  1. Subject:主体,一般指用户。
  2. SecurityManager:Shiro的核心部分,它负责安全认证与授权。Shiro本身已经实现了所有的细节,用户可以完全把它当做一个黑盒来使用,本质上就是一个工厂类似Spring中的ApplicationContext安全管理器,管理所有Subject,可以配合内部安全组件。(类似于SpringMVC中的DispatcherServlet)
  3. Realms:用于进行权限信息的验证,一般需要自己实现,Shiro需要根据用户名和密码首先判断登录的用户是否合法,然后再对合法用户授权。而这个过程就是Realm的实现过程。
    2 详细功能
  4. Authentication:身份认证/登录(账号密码验证)。
  5. Authorization:授权,即角色或者权限验证。
  6. Session Manager:会话管理,用户登录后的session相关管理。
  7. Cryptography:加密,密码加密等。
  8. Web Support:Web支持,集成Web环境。
  9. Caching:缓存,用户信息、角色、权限等缓存到如redis等缓存中。
  10. Concurrency:多线程并发验证,在一个线程中开启另一个线程,可以把权限自动传播过去。
  11. Testing:测试支持;
  12. Run As:允许一个用户假装为另一个用户(如果他们允许)的身份进行访问。
  13. 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安全框架)案例(含源码)相关推荐

  1. 用Linux / C实现基于自动扩/减容线程池+epoll反应堆检测沉寂用户模型的服务器框架(含源码)

    用Linux/ C实现基于自动扩/减容线程池+epoll反应堆模型的服务器框架 前言 服务器端源码 客户端源码 自定义库 helper.c 和 helper.h helper.c helper.h M ...

  2. 单片机零基础入门(9-1)实战:模块化编程(模块化两个案例含源码--以及无法显示头文件(.h)的解决方案)

    单片机零基础入门(9-1)实战:模块化编程-(以及无法显示头文件(.h)的解决方案) 本文作为单片机零基础入门(8-5)模块化编程的拓展和补充,比前面的单片机零基础入门(8-5)模块化编程更为详细. ...

  3. Java+SSH水费管理系统(含源码+论文+答辩PPT等)

    项目功能简介: 该项目采用技术:JSP +struts2+Spring+Hibernate+css+js+jQuery+bootstrap等相关技术,项目含有源码.文档.配套开发软件.软件安装教程.项 ...

  4. SpringBoot整合RocketMQ,三种测试附带源码【rocketmq-spring-boot-starter】

    我们整合boot项目的时候都是引入 xxx-start 依赖,但是现在大多数的整合RocketMQ都还不是这样. 我花了一天时间使用rocketmq-spring-boot-starter整合,使得操 ...

  5. java基本框架代码_Rxjava 源码系列 - 基础框架分析

    前言 本篇博客讲解的 Rxjava 的原理基于版本 2.1.4,RxAndroid 的原理的版本基于 2.0.2 . 基本框架 Rxjava 有四个基本的概念 Observable (可观察者,即被观 ...

  6. Java集合专题(含源码)

    Java集合专题 一.集合是什么? 1.集合和数组的区别 2.Collection体系的继承树 2.1 Collection接口常用方法 2.2 Collection常用遍历方式 2.2.1 迭代器I ...

  7. Java+SSH人力资源管理系统(含源码+论文+答辩PPT等)

    项目功能简介: 该项目采用技术JSP.strust2.Spring.Hibernate.Tomcat服务器.MySQL数据库 ,项目含有源码.论文.配套开发软件.软件安装教程.项目发布教程 下面是系统 ...

  8. Java飞机票售票管理系统(含源码+论文+答辩PPT等)

    项目功能简介: 该项目采用技术:JSP +Servlet +MySQL+jdbc+css+js等相关技术,项目含有源码.课设报告.配套开发软件.软件安装教程.项目发布教程等 下面是系统运行起来后的部分 ...

  9. Java+JSP问卷调查系统(含源码+论文+答辩PPT等)

    项目功能简介: 该项目采用技术:JSP +Servlet +MySQL+jdbc+css+js+jQuery等相关技术,项目含有源码.文档.配套开发软件.软件安装教程.项目发布教程等 本系统为Serv ...

  10. Java实现记事本(含源码)

    使用Java fx实现的简单记事本.主要功能包括以下: 新建文件 打开文件 保存文件 另存为 复制粘贴 查找替换 插入日期 退出 主要源码如下 /*** 界面逻辑控制器,*/ @SuppressWar ...

最新文章

  1. linux(六)之文本操作
  2. utf8乱码解决方案[适合tomcat部署的jsp应用]
  3. 数字集成电路的层次关系
  4. 【OpenCV】函数imread的使用之通道数变化
  5. python图像处理实战 戴伊_这一套封面的程序员专业书籍你读过哪一本?
  6. numpy 数组抽取_清晰易懂的Numpy入门教程
  7. c语言中错误c2228,错误:C2228:''必须有class/struct/union
  8. 案例:控制文件序列号满故障处理和分析
  9. 决策树 随机森林 xgboost_推荐收藏 | 决策树、随机森林、bagging、boosting、Adaboost、GBDT、XGBoost总结...
  10. 一些关于直播间人货场的打造干货,直播电商新手必须要了解人货场的概念
  11. .第一天.net 学习理论
  12. c4d流体插件_C4D流体模拟插件 NextLimit RealFlow 2.6.5.0095 Win已注册版
  13. DongDong数颜色 树上启发式合并 牛客
  14. 4p营销组合策略案例_营销组合策略的4P讲解
  15. java 修改mysql数据库表结构_MYSQL数据库表结构优化方法详解
  16. 计算机三级应该学什么条件,计算机三级报名条件
  17. java modbus4j_java使用modbus4j来实现modbusTCP通信
  18. 潭州教育python学院_潭州什么学院,直播python课程内幕
  19. 计算流体力学笔记D2
  20. 软件案例分析——两大音乐软件的PK

热门文章

  1. Golang unsafe包使用笔记
  2. 判断两根线段是否相交
  3. 九度 1188 约瑟夫环问题
  4. Localtunnel(Node.js 版) 使用教程
  5. 让Windows 7变成WIFI热点
  6. 62. WWW 服务器
  7. 18.UNIX 环境高级编程--终端IO
  8. 98.set_include_path()
  9. 17. Magento 重写控制器
  10. python学习_循环结构 and 类型判断