搭建前后端分离的权限系统
#写在前面前面我们使用Spring Boot+Shiro框架搭建的权限管理系统只使用于前后端一体化的项目,并不适用于当前最流行的前后端分离架构。要实现前后端分离,那么需要考虑两点:一是项目不再基于Session,那么此时如何确认访问者身份;二是如何确认访问者所具有的权限。如果你之前有过前后端分离的开发经验,肯定知道前后端分离一般依靠的都是token,即采用token来实现。用户登录时会生成token及token过期时间,而token与用户是一一对应关系,在调用接口的时候,将token放入header或者请求参数中,这样服务端就知道当前是哪个用户在调用接口。
由于本篇主要介绍如何实现前后端分离,因此关于前端的代码这里就忽略,详细的前端会在后面文章进行介绍。
新建SpringBoot项目使用spring Initializr构建工具构建一个SpringBoot的Web应用,名称为shiro-fontback,然后在pom.xml文件中添加Shiro依赖以及Swagger依赖,代码为:
12345678910111213141516171819202122232425262728293031 ...
搭建RESTful风格权限系统
写在前面前面我们使用SpringBoot集成Shiro搭建了一个简易的权限管理系统,但是那种在实际开发过程中用的不多,本篇来学习另一种较为常见的SpringBoot集成Shiro搭建权限管理系统,这里就不使用Thymeleaf模板引擎,而是直接返回RESTful风格的API。
新建SpringBoot项目使用spring Initializr构建工具构建一个SpringBoot的Web应用,名称为shiro-swagger,然后在pom.xml文件中添加Shiro依赖以及页面模板引擎依赖,代码为:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId ...
SpringBoot集成Shiro搭建简易权限系统
写在前面前面学习的都是通过模拟数据库这一方式来学习,在实际开发过程中都是直接连接数据库,因此本篇将搭建一个使用Shiro框架实现的权限校验系统。
新建SpringBoot项目使用spring Initializr构建工具构建一个SpringBoot的Web应用,名称为envy-shiro,然后在pom.xml文件中添加Shiro依赖以及页面模板引擎依赖,代码为:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950<dependencies> <!--添加Shiro依赖--> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.4.0</version& ...
密码加密和SpringBoot集成Shiro
写在前面Shiro是一个安全框架,除了提供前面介绍的认证和授权之外,还可以对用户密码进行加密,那么本篇就来学习Shiro如何对密码进行加密,并介绍如何在SpringBoot中使用Shiro框架。
MD5加密前面我们无论是读取配置文件中的密码还是模拟数据库中的密码,使用的都是明文密码,显然这是不安全的,因此很多情况下我们都会采用加密算法,尤其是采用非对称加密,其实就是不可逆加密,常用的MD5加密算法就是这样的一种算法。
举个例子,下面一段代码演示了如何利用MD5加密算法对密码1234进行加密:
12345public static void main(String[] args){ String password = "1234"; String encodePassword = new Md5Hash(password).toString(); System.out.println(encodePassword); };
执行结果如下所示:
181dc9bdb52d04dc20036dbd8313ed055
由于这是非对称 ...
自定义Realm
写在前面通过前面的学习,我们知道实际进行权限信息验证的是Realm,而Shiro框架内部提供了两种实现,一种是查询.ini文件的IniRealm;另一种是查询数据库的JdbcRealm。那么本篇就来分别研究这两个实现。
本篇主要学习以下内容:(1)Realm;(2)Shiro功能;(3)Shiro优点:(4)Shiro架构:(5)Shiro概念:(6)Shiro认证流程:(7)Shiro授权流程。
RealmShiro从Realm中获取安全数据(用户、角色、权限),也就是说SecurityManager想要验证用户身份,那么它必须从Realm中获取安全数据进而来确定用户的身份是否合法,之后判断用户是否具有某个角色,某个权限。
自定义Realm一般来说,自定义Realm都需要继承org.apache.shiro.realm.AuthorizingRealm类,查看一下这个类的源码,如下所示:
1public abstract class AuthorizingRealm extends AuthenticatingRealm implements Authorizer, Initiali ...
快速入门
写在前面本篇开始学习Shiro安全框架,这是一个开源的轻量级的Java安全框架,在一些中小型项目中推荐使用Shiro安全框架。
本篇主要学习以下内容:(1)Shiro简介;(2)Shiro功能;(3)Shiro优点;(4)Shiro架构;(5)Shiro概念;(6)Shiro认证流程;(7)Shiro授权流程;(8)Shiro标签;(9)权限。
ShiroShiro简介Apache Shiro是一个开源的轻量级的Java安全框架,它提供身份验证、授权、密码管理以及会话管理等功能。相对于Spring Security, Shiro框架更加直观、易用,同时也能提供健壮的安全性。
Shiro功能Shiro框架相比于Spring Security更加轻量级,但是它也提供了一些基础的,能满足日常开发所需的权限控制功能。
Shiro框架提供的功能如下所示:(1)提供登录用户身份的验证;(2)用户访问权限控制和登陆认证,注意这个有两层含义,其一是用户登录验证;其二是用户登录后授权,即用户拥有访问哪些接口的权限;(3)可以响应认证、访问控制或者Session生命周期中发生的事件;(4)支持单点登录SS ...
YARN入门
写在前面接下来学习Hadoop生态系统中的第三个重要组成部分YARN。本篇主要学习YARN的产生背景、YARN是什么以及YARN的架构设计等内容,可以快速入门YARN。
YARN产生背景MapReduce1.0存在的问题首先来看一张图,该图是Hadoop1.x中MapReduce的构成结果,如下所示:
我们知道在Hadoop1.x中,MapReduce是Master/Slave(主从)结构,在集群中的表现形式为一个JobTracker带多个TaskTracker。其中JobTracker负责资源管理和作业调度,TaskTracker定期向JobTracker汇报本节点的健康、资源使用、任务执行等情况以及接收和执行来自JobTracker的操作指令,如启动/杀死任务等。
显然上述结构存在明显的问题:(1)单节点故障。由于JobTracker节点只有一个,因此如果该节点不可用,将会导致整个集群不可用;(2)节点压力大。JobTracker负责接收来自各个TaskTracker节点的RPC请求,因此该节点上的请求压力很大,限制了集群的扩展,且随着节点规模增大,JobTracker必定会成为 ...
MapReduce的高级应用
写在前面前面学习的都是MapReduce较为基本的操作,接下来学习一些MapReduce的高级应用,主要包括使用MapReduce完成join操作、排序操作、二次排序操作和小文件合并操作,这些应用在实际工作中非常有帮助。
MapReduce实现join操作join操作概述如果你之前熟悉数据库,那么肯定知道使用SQL语法实现join操作是非常简单的,但是在大数据场景下使用MapReduce编程模型来实现类似的join操作其实是比较困难的。通常在实际工作中,我们都是借助于Hive、Spark SQL等框架来实现join,既然这里是学习,那么对于MapReduce实现join操作的原理还是有必要学习一下,它对于理解join操作的底层是有非常大的帮助。接下来开始学习,如何使用MapReduce API来实现join操作。
需求分析假设现在有如下两个txt文件,里面的内容如下所示:
1234567891011//emp.txt数据519,smith,clerk,8920,1990-10-01,880.00,20536,alien,salesman,8945,1992-09-11,1600.00, ...
MapReduce其他内容
写在前面MapReduce基础内容除了前面介绍的外,还有两个比较重要的内容:Partitioner操作和自定义RecordReader。
Partitioner操作概述在进行MapReduce计算时,有时候可能需要将最终的输出数据分到不同的文件中,这种情况是非常普遍的。
举个例子,现在需要将销售额按照省份来进行划分,那么就需要将同一省份的数据在一个文件中。
我们知道最终的输出数据都来自Reducer任务,因此想得到多个文件,这就意味着需要有相同数量的Reducer任务在运行。而Reducer任务的数量又来自于Mapper任务,也就是说任务的数量是由Mapper任务决定的。Mapper任务需要划分数据,将不同的数据分配给不同的Reducer任务,之后由它来生成对应的数据文件。我们称Mapper任务划分数据的过程为Partition,称负责划分数据的类为Partitioner。
请注意,MapReduce默认的Partitioner类为HashPartitioner。一般来说,Partitioner会先计算Key的哈希值(通常为md5值),然后通过Reducer个数来执行取模运算,即key ...
如何开发MapReduce应用
写在前面前面学习的都是MapReduce较为基础的内容,接下来学习如何开发MapReduce应用,其中最重要的就是学习MapReduce的类型、输入格式、输出格式和Combiner的使用。
MapReduce的类型其实这里主要学习的是MapReduce的输入和输出类型。前面也说过,使用Hadoop中的MapReduce编程模型非常简单,开发者只需实现map和reduce方法中的输入和输出key/value键值对的类型即可,下面来学习各种数据类型在MapReduce中是如何使用的。
通过查看WritableComparable接口,可以发现Hadoop提供了很多与Java数据类型相对应的数据类型,如下表所示:
Hadoop中数据类型
Java中的数据类型
IntWritable
Integer
BooleanWritable
Boolean
FloatWritable
Float
LongWritable
Long
DoubleWritable
Double
ShortWritable
Short
ByteWritable
Byte
同时可以发现M ...