走进shiro,构建安全的应用程序---shiro修仙序章
0. 写在前面
在最近的一个项目当中,我们基于Shiro实现我们系统的认证和授权。借此机会,写几篇博客,总结一下在本次实践当中遇到的问题,和较全面地学习一下Shiro的知识点,
1. 权限管理
权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户访问而且只能访问授权访问的资源。
权限管理主要分为两个部分,一是身份认证(authentication),二是授权(authorization)。
2. 实现方案与模型
目前主流的解决方案spring security+JWT或者Shiro+JWT方案。当然也有相关团队(公司)是自己编写过滤器进行访问控制。但这并不值得推荐,除非你设计的权限管理方案能经得起生产环境的考验。
如果大家需要了解关于spring security的相关内容,可以阅读我spring security的相关文章。
权限管理模型的话,主要有这么几种:
自主访问控制(DAC: Discretionary Access Control)。一个典型的例子就是windows操作系统的权限管理。DAC 最大的缺陷就是对权限控制比较分散,不便于管理,比如说简单地对一组文件设置统一的权限并授予指定的一组用户。
强制访问控制模型(MAC: Mandatory Access Control)。MAC为了弥补DAC而生,MAC给用户和资源分别数字化标记其权限等级。当用户访问某一资源时,只有它的权限等级高于或等于资源的权限等级时,才能访问,否则拒绝访问。比如存在某一资源404.MP4,资源等级为1024.存在用户Ferrayman,其权限等级为256,存在用户boss,其权限等级为2048.那么,boss就能正常访问资源404.MP4,而Ferrayman则无权访问。
基于角色的访问控制模型(RBAC: Role-based Access Control),即给用户分配角色,角色下对应一定的资源,用户对其角色下的资源具有访问权限。RBAC细分为RBAC0、RBAC1、RBAC2、RBAC3几个版本。
我们主要采用的也是RBAC模型。
3. Shiro是什么?
Apache Shiro is a powerful and easy-to-use Java security framework that performs
authentication, authorization, cryptography, and session management. With Shiro’s
easy-to-understand API, you can quickly and easily secure any application – from the
smallest mobile applications to the largest web and enterprise applications.
Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。
3.1 Shiro组成
Shiro三大组件:Subject, SecurityManager 和 Realms.
3.1.1 Subject:
即“当前主体”。在Shiro中,Subject这一概念并不仅仅指人,也可以是第三方进程、后台帐户(Daemon Account)或其他类似事物。它仅仅意味着“当前跟软件交互的东西”。Subject代表了当前用户的安全操作,SecurityManager则管理所有用户的安全操作。
它主要由身份信息Principal和凭证Principals组成。Principal可以理解为主体在系统中的账号,且是具有唯一性的。Principals可以理解为主体在当前系统账户所对应的密码、证书。
3.1.2 SecurityManager:
它是Shiro框架的核心,典型的Facade模式,Shiro通过SecurityManager来管理内部组件实例,并通过它来提供安全管理的各种服务。
3.1.3 Realm:
Realm充当了Shiro与应用安全数据间的“桥梁”或者“连接器”。也就是说,当对用户执行认证(登录)和授权(访问控制)验证时,Shiro会从应用配置的Realm中查找用户及其权限信息。
从这个意义上讲,Realm实质上是一个安全相关的DAO:它封装了数据源的连接细节,并在需要时将相关数据提供给Shiro。当配置Shiro时,你必须至少指定一个Realm,用于认证和(或)授权。配置多个Realm是可以的,但是至少需要一个。
Shiro内置了可以连接大量安全数据源(又名目录)的Realm,如LDAP、关系数据库(JDBC)、类似INI的文本配置资源以及属性文件等。如果缺省的Realm不能满足需求,你还可以插入代表自定义数据源的自己的Realm实现。
4 Shiro的优势
简单、灵活。
使用起来相对于spring security简单。不仅支持Web应用也支持非Web应用,无缝集成。
5 一个Demo
创建一个空的maven工程并引入如下依赖
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.5.3</version>
</dependency>
<!--方便测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
引入shiro的配置文件
shiro的配置文件是以“.ini”结尾的文件。之所以使用.ini格式,是因为该文件类型支持比较复杂的数据格式。主要用来存储shiro的一些权限数据。这个主要是拿来学习shiro用的,平时项目中,权限数据存储于数据库中。
配置主体的身份信息和凭证
[users]
xiangbei=123
xiangname=123
创建认证器
package pers.lbf.shirodemo.core;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.*;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.realm.text.IniRealm;
import org.apache.shiro.subject.Subject;
/**认证器
* @author 赖柄沣 bingfengdev@aliyun.com
* @version 1.0
* @date 2020/9/21 0:50
*/
public class Authenticator {
private DefaultSecurityManager securityManager;
public Authenticator(){
//1. 创建安全管理器
this.securityManager = new DefaultSecurityManager();
//2. 给安全管理器设置问题域
//因为权限信息从ini文件中读取,所以是IniRealm
this.securityManager.setRealm(new IniRealm("classpath:shiro.ini"));
//3. 注入安全管理器,并使用SecurityUtils全局安全工具类完成认证
SecurityUtils.setSecurityManager(securityManager);
}
/**认证
* @author 赖柄沣 bingfengdev@aliyun.com
* @date 2020-09-23 16:22:11
* @param username 用户名
* @param password 密码
* @return void
* @version 1.0
*/
public void authenticate(String username,String password){
//4. 获取当前主题
Subject subject = SecurityUtils.getSubject();
//5.根据登录对象身份凭证信息创建登录令牌
UsernamePasswordToken token = new UsernamePasswordToken(username,password);
//6.认证
//如果认证通过,则不抛出异常,否则抛出AuthenticationExceptixon异常子类
//正式项目建议直接抛出,统一异常处理
try {
subject.login(token);
}catch (IncorrectCredentialsException e) {
e.printStackTrace();
}catch (ConcurrentAccessException e){
e.printStackTrace();
}catch (UnknownAccountException e){
e.printStackTrace();
}catch (ExcessiveAttemptsException e){
e.printStackTrace();
}catch (ExpiredCredentialsException e){
e.printStackTrace();
}catch (LockedAccountException e){
e.printStackTrace();
}
}
}
测试,模拟认证
package shirodemo;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;
import org.junit.Before;
import org.junit.Test;
import pers.lbf.shirodemo.core.Authenticator;
/**测试认证
* @author 赖柄沣 bingfengdev@aliyun.com
* @version 1.0
* @date 2020/9/21 0:49
*/
public class TestAuthenticator {
private Authenticator authenticator=null;
@Before
public void init() {
authenticator = new Authenticator();
}
@Test
public void testAuth(){
authenticator.authenticate("xiangbei","123");
}
}
6 写在最后
今天,我们主要通过一个简单的demo,去开始学习shiro的相关知识。但这些知识还不足以让我们应用到我们的产品中去,接下来的shiro系列修仙功法(文章),作者将跟着大家一起去学习shiro的应用。
走进shiro,构建安全的应用程序---shiro修仙序章的更多相关文章
- 程序猿修仙之路--数据结构之你是否真的懂数组? c#socket TCP同步网络通信 用lambda表达式树替代反射 ASP.NET MVC如何做一个简单的非法登录拦截
程序猿修仙之路--数据结构之你是否真的懂数组? 数据结构 但凡IT江湖侠士,算法与数据结构为必修之课.早有前辈已经明确指出:程序=算法+数据结构 .要想在之后的江湖历练中通关,数据结构必不可少. ...
- 程序员修仙之路- CXO让我做一个计算器!!
菜菜呀,个税最近改革了,我得重新计算你的工资呀,我需要个计算器,你开发一个吧 CEO,CTO,CFO于一身的CXO X总,咱不会买一个吗? 菜菜 那不得花钱吗,一块钱也是钱呀··这个计算器支持加减乘除 ...
- 程序员修仙之路--优雅快速的统计千万级别uv(留言送书)
菜菜,咱们网站现在有多少PV和UV了? Y总,咱们没有统计pv和uv的系统,预估大约有一千万uv吧 写一个统计uv和pv的系统吧 网上有现成的,直接接入一个不行吗? 别人的不太放心,毕竟自己写的,自己 ...
- 程序员修仙之路--优雅快速的统计千万级别uv
菜菜,咱们网站现在有多少PV和UV了? Y总,咱们没有统计pv和uv的系统,预估大约有一千万uv吧 写一个统计uv和pv的系统吧 网上有现成的,直接接入一个不行吗? 别人的不太放心,毕竟自己写的,自己 ...
- 基于Shiro,JWT实现微信小程序登录完整例子
小程序官方流程图如下,官方地址 : https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html ...
- Shiro 系列: 简单命令行程序示例
在本示例中, 使用 INI 文件来定义用户和角色. 首先学习一下 INI 文件的规范. =======================Shiro INI 的基本规范================== ...
- springboot + shiro 构建权限模块
权限模块基本流程 权限模块的基本流程:用户申请账号和权限 -->登陆认证 -->安全管控模块认证 -->调用具体权限模块(基于角色的权限控制) --> 登陆成功 -->访 ...
- shiro的使用2 灵活使用shiro的密码服务模块
shiro最闪亮的四大特征是认证,授权,加密,会话管理. 上一篇已经演示了如何使用shiro的授权模块,有了shiro这个利器,可以以统一的编码方式对用户的登入,登出,认证进行管理,相当的优雅. 为了 ...
- 用Spring构建企业Java应用程序的方法
https://mp.weixin.qq.com/s?__biz=MzU0MDEwMjgwNA==&mid=2247484965&idx=1&sn=ca6b847c65e506 ...
随机推荐
- C# OWC11
public void OcwChart(int[] Data,string[] DataName,string Yname,string Xname,string ChartName,string ...
- Unity中的枚举和标志
译林军 宿学龙|2014-04-10 08:56|9007次浏览|Unity(377)0 枚举和标志 今天的主题是枚举,它是C#语言中的一个很有帮助的工具,可以增强代码的清晰度以及准确性. 枚举一系列 ...
- WebStorm 运行Rect Native 项目
今天教大家如何直接使用WebStorm这个IDE直接完成编码+运行项目工作.这样就可以不用打开Xcode了. 1.首先点击WebStorm右上方的下拉箭头弹出的Edit Configurations. ...
- 【HttpRunner v3.x】笔记—6. 测试用例-teststeps-RunRequest
之前我们了解了config里的各项参数,今天来了解另一个重要部分--teststeps,在这之前,先看看测试用例的分层模型. 一.测试用例分层模型 一个testcase里(就是一个pytest格式的P ...
- [HGAME Week2] Cosmos的博客后台
觉得这道题考察的东西比较综合而且比较简单,就写上了.因为写这篇文章的时候环境已经关闭了,所以引用了其他师傅wp的图片 本题考察了:php://filter伪协议文件包含.var_dump()输出GLO ...
- 跟着尚硅谷系统学习Docker-【day02】
day02-20200714 p9.docker阿里云配置 helloword 拉取镜像-运行- 拉取镜像如果从国外网站拉取辉比较慢,所以需要配置阿里云或者网易云得镜像仓库. 首先 ...
- springboot2.x基础教程:自动装配原理与条件注解
spring Boot采用约定优于配置的方式,大量的减少了配置文件的使用.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置. 当springboot启动的时候,默认在容器中注入 ...
- 图解冒泡排序及算法优化(Java实现)
冒牌排序 基本思想 定义:冒泡排序的英文是bubblesort,它是一种基础的交换排序 原理:每次比较两个相邻的元素,将较大的元素交换至右端 (升序排序) 思路:相邻的元素两两比较,当一个元素大于右侧 ...
- 【小白学PyTorch】9 tensor数据结构与存储结构
文章来自微信公众号[机器学习炼丹术]. 上一节课,讲解了MNIST图像分类的一个小实战,现在我们继续深入学习一下pytorch的一些有的没的的小知识来作为只是储备. 参考目录: @ 目录 1 pyto ...
- Python中的type(),isinstance,()dir(),的区别
1.type() type(),获取一个变量的类型,返回值为:<class '类名'>,属于class类型2.isinstance() isinstance(),判断一个对象是否属于某种数 ...