在springboot中使用SHiro作为安全框架,非常简单,灵活性也比较高

在springboot中使用Shiro不用像官网教程那样,官网是将配置文件写在INI文件和XML配置中

springboot中提倡使用javaconfig的形式,所以这里都采用javaconfig的形式。

记录Shiro的初步使用(配置登录接口,认证成功的处理、认证失败的处理、无认证信息的处理)
进阶使用(使用缓存管理Shiro的Session和Cache)
完整版使用 (给出可在生产中使用的配置)

初步使用

  1. 自定义MyAuthorizingRealm类,继承类AuthorizingRealm,实现里面的doGetAuthorizationInfo和doGetAuthenticationInfo方法

AuthorizingRealm是Shiro提供的处理认证授权的抽象类,oGetAuthenticationInfo就是认证的处理,doGetAuthorizationInfo就是授权的处理。功能非常丰富。

  1. 自定义一个ShiroConfig类,对Shiro进行配置,主要是配置ShiroFilterFactoryBean,SecurityManager,DefaultWebSessionManager,AuthorizationAttributeSourceAdvisor

ShiroFilterFactoryBean,主要是配置某个Url的权限情况

DefaultWebSessionManager:对session进行管理,如命名、有效期等此处的Session是经过Shiro封装的session,扩展了相关属性。

AuthorizationAttributeSourceAdvisor:配置基于aop形式的授权校验,可在接口上通过注解添加权限处理

  1. 编写登录接口

    使用Shiro提供的Subject对象,调用其login方法,即可完成登录。

登录时会调用之前在MyAuthorizingRealm类定义的doGetAuthenticationInfo的认证逻辑(获取身份信息、密码加盐加密等),这其中还会涉及一些缓存的操作,暂时按下不表。

如何自定义Shiro的Filter?

Shiro已经提供了很多实现好的过滤器,可参考org.apache.shiro.web.filter.mgt.DefaultFilter枚举类,里面有实现类和简写的映射关系。

常用的如 anon(AnonymousFilter.class),authc(FormAuthenticationFilter.class),logout(LogoutFilter.class)等。

实现:

  1. 自定义类CustomFormAuthenticationFilter extends FormAuthenticationFilter
  2. 注册CustomFormAuthenticationFilter到shiroFilterFactoryBean中

tips:CustomFormAuthenticationFilter在获取时,只能用构造器new出来,spring容器中无法自定注入该类

参考:

    /**
* 在此配置拦截器栈
*/
@Bean
public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) {
System.out.println("init ShiroConfiguration.shirFilter()"); ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
shiroFilterFactoryBean.setSecurityManager(securityManager); //注册自定义filter 命名为authc 覆盖默认FormAuthenticationFilter
Map<String, Filter> filterMap = shiroFilterFactoryBean.getFilters();
filterMap.put("authc2", new CustomFormAuthenticationFilter());
shiroFilterFactoryBean.setFilters(filterMap); //拦截器.
Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>();
// 配置不会被拦截的链接 顺序判断 注意过滤器配置顺序 不能颠倒
//配置退出 过滤器,其中的具体的退出代码Shiro已经替我们实现了,登出后跳转配置的loginUrl
filterChainDefinitionMap.put("/logout.do", "logout");
// 配置不会被拦截的链接 顺序判断
filterChainDefinitionMap.put("/druid/**", "anon");
filterChainDefinitionMap.put("/static/**", "anon");
// ajax方式的登录
filterChainDefinitionMap.put("/ajaxLogin.do", "anon");
// ajax方式的退出登录
filterChainDefinitionMap.put("/ajaxLogout.do", "anon");
filterChainDefinitionMap.put("/unauth.do", "anon");
filterChainDefinitionMap.put("/formLogin.do", "authc2");
filterChainDefinitionMap.put("/**", "authc");
// 表单登录地址 是指跳转到登录页的url 而不是指定登录接口
shiroFilterFactoryBean.setLoginUrl("/formLogin.do");
// 表单登录成功后的跳转地址
shiroFilterFactoryBean.setSuccessUrl("/loginSuccess.do");
// 请求未认证的跳转地址
shiroFilterFactoryBean.setUnauthorizedUrl("/unauth.do"); shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
return shiroFilterFactoryBean;
}

如何进行传统表单登录而不是ajax形式?

在config类中配置一个接口,并用authc(FormAuthenticationFilter.class)过滤器进行认证,即可走表单登录。

地雷

  1. ShiroFilterFactoryBean配置的地址坑很多
shiroFilterFactoryBean.setLoginUrl("/formLogin.do");
// 表单登录成功后的跳转地址
shiroFilterFactoryBean.setSuccessUrl("/loginSuccess.do");
// 请求未认证的跳转地址
shiroFilterFactoryBean.setUnauthorizedUrl("/unauth.do");

LoginUrl配置的地址,是表单登录接口,但如果已经登录成功,再访问该接口重新登录,shiro并不会拦截到该接口,而是直接放行。springMVC会直接去寻找/formLogin.do接口,如果没有自定义该接口,就会报404

SuccessUrl是authc(FormAuthenticationFilter.class)处理登录成功后的跳转地址

UnauthorizedUrl是请求认证时发现无认证信息时,跳转的接口

  1. 配置可参考org.apache.shiro.spring.web.config包下的AbstractShiroWebConfiguration类,有一些参数配置文件的读取

代码参考地址

https://github.com/starmoon1994/shiro-collection

2521-Shiro系列-基本使用的更多相关文章

  1. Apache Shiro系列之五,概述 —— 配置

    Shiro设计的初衷就是可以运行于任何环境:无论是简单的命令行应用程序还是复杂的企业集群应用.由于运行环境的多样性,所以有多种配置机制可用于配置,本节我们将介绍Shiro内核支持的这几种配置机制.   ...

  2. Apache Shiro系列四,概述 —— Shiro的架构

    Shiro的设计目标就是让应用程序的安全管理更简单.更直观.     软件系统一般是基于用户故事来做设计.也就是我们会基于一个客户如何与这个软件系统交互来设计用户界面和服务接口.比如,你可能会说:“如 ...

  3. Apache Shiro系列三,概述 —— 10分钟入门

     一.介绍 看完这个10分钟入门之后,你就知道如何在你的应用程序中引入和使用Shiro.以后你再在自己的应用程序中使用Shiro,也应该可以在10分钟内搞定. 二.概述 关于Shiro的废话就不多说了 ...

  4. Apache Shiro系列一,概述 —— 初识

    一.什么是Shiro Apache Shiro是一个强大.灵活.开源的安全框架,它支持用户认证.权限控制.企业会话管理以及加密等. Apache Shiro的第一个也是最重要的一个目标就是易于使用和理 ...

  5. Apache Shiro系列(1)

    Apache Shiro是啥呢,安全框架. 360百科是这么描述的:        Apache Shiro(日语"堡垒(Castle)"的意思)是一个强大易用的Java安全框架, ...

  6. Apache Shiro系列二,概述 —— 基本概念

    做任何事情,首先要双方就一些概念的理解达成一致,这样大家就有共同语言,后续的沟通效率会高一些. #,Authentication,认证,也就是验证用户的身份,就是确定你是不是你,比如通过用户名.密码的 ...

  7. Apache Shiro系列教程之三:Shiro的结构

    Shiro的设计目标是简化应用的安全管理工作.软件通常是以用户为基础设计的.也就是说,我们经常是根据用户是怎样和我们的软件交互的来设计相关的用户接口.比如,你可能会说"如果是已经登录的用户与 ...

  8. Apache Shiro系列教程之二:十分钟上手Shiro

    在本教程中,我们会写一个简单的.仅仅输出一些内容命令行程序,从而对Shiro有一个大体的感觉. 一.准备工作 本教程需要Java1.5+,并且我们用Maven生成项目,当然Maven不是必须的,你也可 ...

  9. Shiro 系列: 简单命令行程序示例

    在本示例中, 使用 INI 文件来定义用户和角色. 首先学习一下 INI 文件的规范. =======================Shiro INI 的基本规范================== ...

  10. Shiro 系列 - 基本知识

    和 Spring Security 项目一样, Apache Shiro 也是一个被广泛使用安全框架, 它们都能完成认证.授权.会话管理等. 简单对比一下 Apache Shiro 和 Spring ...

随机推荐

  1. 关于Linux添加字体

    安装字体命令 yum -y install fontconfig 查看已经安装的字体 fc-list # 查看已经已经安装的中文字体 fc-list :lang=zh 在字体目录下创建新的目录或者使用 ...

  2. 项目:PMBok

    美国项目管理协会(PMI)资格认证之所以能在如此广的行业和地域范围内被迅速认可,首先是项目管理本身的重要性和实用性决定的,其次很大程度上是得益于该项认证体系本身的科学性.PMI早在七十年代末就率先提出 ...

  3. FreeMarker速查手册

    一.开始 原理图 引入FreeMarker依赖 <dependency> <groupId>org.freemarker</groupId> <artifac ...

  4. RabitMQ 简介

    每日一句 The secret of being miserable is to have leisure to bother about whether you are happy or not. ...

  5. CF1682D Circular Spanning Tree

    题意: 构造题,节点1~n顺时针排列成圆形,告诉你每个点度数奇偶性,让你构造一棵树,树边不相交. 思路: 因为每条边给总度数贡献2,因此如果度数为1的点有奇数个,直接输出no.显然0个度数为1的,也输 ...

  6. ex_Lucas定理

    Lucas定理(p为质数): \(C_n^m=C_{n/p}^{m/p}*C_{n\ mod\ p}^{m\ mod\ p}\) 可是p不为质数怎么办呢? ex_Lucas定理 (p不为质数) 思路 ...

  7. USACO 刷题小记

    \(\text{High Card Low Card}\) USACO2015DEC Platinum T2 贝西和艾尔西在玩游戏.有 \(2n\) 张牌,牌上的数字是 \(1\) 到 \(2n\) ...

  8. SpringCloud 配置管理:Nacos

    目录 统一配置管理 配置热更新 配置共享 多环境配置共享 多服务配置共享 统一配置管理 将配置交给 Nacos 管理的步骤: 在 Nacos 中添加配置文件. 在微服务中引入 nacos 的 conf ...

  9. Halodoc使用 Apache Hudi 构建 Lakehouse的关键经验

    Halodoc 数据工程已经从传统的数据平台 1.0 发展到使用 LakeHouse 架构的现代数据平台 2.0 的改造.在我们之前的博客中,我们提到了我们如何在 Halodoc 实施 Lakehou ...

  10. CYaRon!语

    P3695 CYaRon!语 开始之前 上次水了些小模拟之后感觉不能再颓废了,于是就来大模拟. 然后这个题花了我一个多星期 还是最差解 不过,为了纪念我的第 20 道紫题,纪念我这一周的努力,我还是想 ...