码洞 - Shiro
type: channel
link: https://www.tremblingboy.cn/index.php/tag/Shiro/
items: 权限框架Shiro快速整合前后端分离项目
items: 深入Shiro如何优雅的进行配置？
items: 初识Shiro有哪些需要注意的地方？

权限框架Shiro快速整合前后端分离项目
type: item
date: 2020-08-23T19:38:00+08:00
description: 开端好的，起因是我把最近做好的项目给一部分人进行了测试，发现大部分朋友都提出了同一个问题，你的系统权限管理是如何实现的。我只能尴尬的说一句，不好意思这部分还没开发。然而我也知道，其实对于一个项目来说，权限可以说是最主要的一部分。后端除了对权限进行处理，其实也就是提供一些业务逻辑对 CRUD 进行组合拼装。所以我打算接下来学习权限控制方面的知识并整合到我的项目中去，顺便把我的学习笔记分享给大家。而对于权限控制的框架呢，听的最多的还是 Shiro 还有 Spring Security。Spring 的安全框架单独用在 Spring 项目中是无可挑剔的，不管是功能上还是维护方面。但是考虑到 Shiro 是一个全能性的框架，可以用在各种场合，甚至非 Web 项目中，由于它的会话独立于容器，后期学习分布式和微服务的时候也比较方便使用。最重要的是 Spring 官网用的也是 Shiro 的框架。所以还是打算学习 Shiro。由于这部分内容比较多，我也发现了前后端项目部署那篇文章接近 1w 字导致阅读的时候不是很舒服，所以我打算把这个内容分成几个部分：初识 Shiro、配置重点、整合技巧来讲述。这篇文章是关于如何利用我们之前学习的知识快速进行 Shiro 与前后端分离项目的整合。虽然说是快速，我还是会一步步都告诉大家，并没有想象中的那么快。整合那么之前结果两篇长文的讲解，大家应该已经初步了解了一些关于 Shiro 的知识，接下来我们开始快速整合 Shiro 和 SSM ，我只讲最关键的步骤，至于更多额外功能的拓展留给大家自行发掘。下文的内容可能略微与我前面写的两篇文章有所不同，不过不影响食用。毕竟一边做一边写，总会发现之前的一些问题并找到更好的解决方法。使用 Maven 管理 jar 包Maven 是一个后端的包管理工具，可以使用写 XML 的形式快速从仓库寻找 jar 包。使用阿里云仓库众所周知，如果你从 github clone 一个项目，如果没有梯子下载 jar 包可能就要花几个小时的时间。还好阿里爸爸给我们提供了镜像仓库，几分钟就能解决 jar 包的问题。关于引用仓库可以在 maven 配置中修改：<mirror> <id>aliyunmaven</id> <mirrorOf>*</mirrorOf> <name>阿里云公共仓库</name> <url>https://maven.aliyun.com/repository/public</url> </mirror>不过我还是推荐大家在自己的项目中加入仓库，灵活性更高：<repositories> <repository> <id>alimaven</id> <name>aliyun maven</name> <url>https://maven.aliyun.com/repository/public</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories>这里我就直接用 public 仓库，这个仓库整合了两个小仓库，东西更丰富些。releases 是线上版本，snapshots 是开发版本，都填 true 问题不大。搜索并导入 jar 包大家可以在上边这个网址内搜索自己要找的 jar 包，中心 central 仓库够大了，组织的话就是 Shiro 的网址，按结构写不要反了，然后输入文件名，点击搜索到的蓝色文件名后把 Maven 依赖这些代码复制进项目里即可。像下面的一样，我们引入最新版本的 Shiro 相关的 jar 包。具体使用哪些包的话请大家去官网上查找资料，比如说官网里提示说 core 包需要 slf4j 的支持，再比如说你用了谷歌的 IOC 容器，那么需要使用 guice 包等等。 <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-all</artifactId> <version>1.5.3</version> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.5.3</version> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-web</artifactId> <version>1.5.3</ve…

深入Shiro如何优雅的进行配置？
type: item
date: 2020-08-15T17:39:00+08:00
description: 开端好的，起因是我把最近做好的项目给一部分人进行了测试，发现大部分朋友都提出了同一个问题，你的系统权限管理是如何实现的。我只能尴尬的说一句，不好意思这部分还没开发。然而我也知道，其实对于一个项目来说，权限可以说是最主要的一部分。后端除了对权限进行处理，其实也就是提供一些业务逻辑对 CRUD 进行组合拼装。所以我打算接下来学习权限控制方面的知识并整合到我的项目中去，顺便把我的学习笔记分享给大家。而对于权限控制的框架呢，听的最多的还是 Shiro 还有 Spring Security。Spring 的安全框架单独用在 Spring 项目中是无可挑剔的，不管是功能上还是维护方面。但是考虑到 Shiro 是一个全能性的框架，可以用在各种场合，甚至非 Web 项目中，由于它的会话独立于容器，后期学习分布式和微服务的时候也比较方便使用。最重要的是 Spring 官网用的也是 Shiro 的框架。所以还是打算学习 Shiro。由于这部分内容比较多，我也发现了前后端项目部署那篇文章接近 1w 字导致阅读的时候不是很舒服，所以我打算把这个内容分成几个部分：初识 Shiro、配置重点、整合技巧来讲述。这篇文章是关于 Shiro 该如何配置的，面向 Spring Boot，讲一些比较基础的内容。深入Shiro之前我们了解了一下 Shiro 的基本功能和架构，现在我们来看看它的工作流程。工作流程拦截Shiro 特别重要的一块就是拦截，它通过过滤器拦截所有请求，根据配置决定哪些可以认证通过，哪些不用被拦截，还有哪些没有通过认证强制跳转。我们看一段配置代码，如何通过过滤器决定谁去谁留。@Bean(name = "shiroFilter") public ShiroFilterFactoryBean shiroFilter(org.apache.shiro.mgt.SecurityManager securityManager){ ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); shiroFilterFactoryBean.setSecurityManager(securityManager); shiroFilterFactoryBean.setLoginUrl("/user/login"); Map<String,String> filterChainDefinitionMap = new LinkedHashMap<>(); filterChainDefinitionMap.put("/user/login","anon"); filterChainDefinitionMap.put("/**", "corsAuthenticationFilter"); shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); Map<String, Filter> filterMap = new LinkedHashMap<>(); filterMap.put("corsAuthenticationFilter", corsAuthenticationFilter()); shiroFilterFactoryBean.setFilters(filterMap); return shiroFilterFactoryBean; }代码非常简单，首先使用 @Bean 注释将这个方法交给 Spring 来管理，名字必须是 shiroFilter，这样才能和默认配置中的名字匹配，否则 Spring 会找不到这个过滤器。在这个方法中首先 new 一个过滤器工厂对象，将获取到的 securityManager 注入。之后设置一个登陆 url，告诉 Shiro，这个页面/接口是我的登陆页面，用户角色权限的获取也都在这里。接着就是刚刚图中的 filterChainDefinition，我们定义一个 map 来存储不被拦截的页面。每一个键值对中 key 存储 url，value 存储拦截器的名字，拦截器主要是以下几个：拦截器名称拦截器功能anno不需要授权和登录，可以匿名访问authc需要登录授权才能访问logout退出成功之后可以自定义重定向user需要登录授权或者登录后开启了记住我（remember me）就能访问ssl通过https协议才能通过roles角色拦截restrest风格拦截port端口拦截perms权限拦截noSessionCreation不创建会话连接器authcBasic基本http身份验证拦截比较常用的四个拦截器我使用加粗表示出来了，anno 一般是最先使用…

初识Shiro有哪些需要注意的地方？
type: item
date: 2020-08-12T19:28:00+08:00
description: 开端好的，起因是我把最近做好的项目给一部分人进行了测试，发现大部分朋友都提出了同一个问题，你的系统权限管理是如何实现的。我只能尴尬的说一句，不好意思这部分还没开发。然而我也知道，其实对于一个项目来说，权限可以说是最主要的一部分。后端除了对权限进行处理，其实也就是提供一些业务逻辑对 CRUD 进行组合拼装。所以我打算接下来学习权限控制方面的知识并整合到我的项目中去，顺便把我的学习笔记分享给大家。而对于权限控制的框架呢，听的最多的还是 Shiro 还有 Spring Security。Spring 的安全框架单独用在 Spring 项目中是无可挑剔的，不管是功能上还是维护方面。但是考虑到 Shiro 是一个全能性的框架，可以用在各种场合，甚至非 Web 项目中，由于它的会话独立于容器，后期学习分布式和微服务的时候也比较方便使用。最重要的是 Spring 官网用的也是 Shiro 的框架。所以还是打算学习 Shiro。由于这部分内容比较多，我也发现了前后端项目部署那篇文章接近 1w 字导致阅读的时候不是很舒服，所以我打算把这个内容分成几个部分：初识 Shiro、配置重点、整合技巧来讲述。这篇文章是关于初识 Shiro 的，主要是 Shiro 的一些基本特性和架构，以及官网上的小例子。 # Shiro 简介Apache 软件基金会开发的 Java 安全（权限）框架。适用于 Java SE 和 Java EE 的环境。主要功能有：认证、授权、加密、会话管理、集成 Web、缓存等。[官网下载]: shiro.apache.org Shiro 具体功能功能翻译解释Authentication身份验证/登录验证用户登录时的身份Authorization权限验证验证用户拥有哪些权限Session Manager会话管理一次登录即一次会话Cryptography加密保护数据安全，密码加密存储Web SupportWeb支持支持方便的Web集成Caching缓存提高查找效率Run As身份替换假装成其他用户(若被允许)Remember Me二次记忆二次登录无需验证初次见面看不懂没有关系的，现在心中有个初步的印象，等到全部学习完整合完你就恍然大悟了。我就简单的讲两个：Authentication首先前两个功能比较容易混淆，到时候写程序千万看清别把方法名写错。Authentication 是身份的验证，我们对于权限的结构划分是基于 RBAC 模型来的（具体可以见我的另一篇博文），所以会有用户、角色、权限三层数据表。而这个功能就是判断用户的角色，是管理员、运维、开发还是测试等等。我们来看一段 Realm 中的方法 doGetAuthenticationInfo：@Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken; String userName = token.getUsername(); User user = userService.selectByName(userName); return new SimpleAuthenticationInfo( user.getUsrName(), user.getUsrPassword(), getName() ); }这段方法中首先获取用户身份 token 参数，然后获取用户名。使用我自定义的 Mapper 中的 selectByName( ) 在用户数据表中查询数据，最后返回一个 Simple 身份验证信息，参数为用户名、密码和 CachingRealm 的名字。当然正统的方式是把用户对象直接传给他，但是我测试的时候发现传用户名和密码出错的可能性更低，具体可以去看看 SimpleAuthenticationInfo 类的源码。Authorization第二个是用来验证角色所对应的权限。比如说管理员用户拥有增删改查所有权限，游客只拥有查找的权限等等。我们还是通过一段 Java 代码来理解这个功能。@Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizatio…