Apache Shiro

一、Shiro介绍:

Apache软件基金会专门针对系统中的登录、加密、权限认证、授权等等功能进行了封装,不仅仅适用于JavaWeb项目,CS架构的系统也可以使用Shiro。

  Apache Shiro是一个强大且易用的Java安全框架,有身份验证、授权、密码学(加密)和会话管理。使用Shiro的易于理解的API,可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。

相同的产品:  

  Spring security 重量级安全框架。

  Apache Shiro 轻量级安全框架。

二、Shiro的使用

  前提:创建一个普通的Maven项目。

  准备(导包):配置Shiro需要的jar包

<dependencies>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.4.0</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>

  1、密码加密

  注意:加密方式一般有 MD5 和 SHA 两种,下面测试使用的是MD5加密方式

    MD5加密方式特点:只能加密,不能解密。(在数据库中保存的密码都是加密过后的密码,使用MD5加密方式的话,登录的密码在登录之前都要先进行加密,因此必须保证登录前的加密规则要和数据库中密码的加密规则相同(加密规则:加密方式、盐值、加密次数))

public class ShiroTest extends BaseTest {

    @Test
public void test() throws Exception { String password = "123"; /**
* String algorithmName
* 加密方式: MD5 和 SHA 两种
* Object source
* 要加密的内容 [一般填密码字符串]
* Object salt
* 盐值[一般也是填字符串]
* int hashIterations
* 加密次数
*/
SimpleHash simpleHash = new SimpleHash("MD5", password,"wang",10); //MD5加密方式的结果:32位十六进制的数字组成的字符串
System.out.println(simpleHash); } /**
* 测试:将数据库中的密码进行加密
* 为了防止记不住密码,先在数据库中执行 update employee set password = username;
*/
@Autowired
private IEmployeeService employeeService;
@Test
public void testUpdateAllPassword() throws Exception {
SimpleHash simpleHash = null;
List<Employee> list = employeeService.findByJPQL("from Employee e");
for (Employee employee : list) {
simpleHash = new SimpleHash("MD5", employee.getUsername(),"wang",10);
//重新设置加密之后的密码
employee.setPassword(simpleHash.toString());
//保存数据【更新】
employeeService.save(employee);
}
} }

  2、登录验证

  2.1 准备 .ini 文件类型的数据(在ini文件中,#代表注释)

# -----------------------------------------------------------------------------
# 所有用户数据以及他属于哪些角色
# root = 123, admin, schwartz
# root表示用户名 123是密码 admin是root这个用户属于哪个角色
# -----------------------------------------------------------------------------
[users]
root = 123, admin
guest = 123, schwartz
presidentskroob = 123, president
darkhelmet = 123, darklord, schwartz
lonestarr = 123, goodguy, schwartz # -----------------------------------------------------------------------------
# 所有角色以及对应的权限
# admin = * admin是角色名称 *表示他拥有所有权限
# schwartz = employee:* schwartz是角色名称 employee:* 表示schwartz角色具备的权限:/employee/*
# goodguy = department:save goodguy是角色名称 department:save 表示goodguy角色具备的权限:/department/save
# -----------------------------------------------------------------------------
[roles]
admin = *
schwartz = employee:*
goodguy = department:save

  2.2 测试登录验证

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;
import org.junit.Test; public class ShiroTest { /**
* 1)准备资源【数据--ini配置文件来准备】
* 2)创建SecurityManager对象
* 读取ini文件【正式项目要换成数据库查询】得到一个工厂对象
* 通过工厂创建一个SecurityManager对象
* 将SecurityManager对象放入Shiro的上下文中
* 获取当前用户
* 判断是否已经登录 isAuthenticated()
* 登录【login 传入一个UsernamePasswordToken】
* 是否属于某个角色【hasRole】
* 是否拥有某些权限【isPermitted】
* 退出【logout()】
* @throws Exception
*/
@Test
public void test() throws Exception { //读取shiro.ini文件数据,生成一个SecurityManager工厂对象
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
//通过工厂创建一个SecurityManager对象
SecurityManager securityManager = factory.getInstance(); //将SecurityManager对象放入Shiro的上下文中
SecurityUtils.setSecurityManager(securityManager); //获取当前用户【不论你是否已经登录,只要你访问就认为你是一个用户】
Subject currentUser = SecurityUtils.getSubject(); System.out.println("判断用户root是否已经登录:" + currentUser.isAuthenticated()); //准备一个令牌【包含用户名和密码,模拟项目中的前端登录表单提交过来的请求参数】
UsernamePasswordToken token = new UsernamePasswordToken("root","123");
try {
if(!currentUser.isAuthenticated()){
//用户登录
currentUser.login(token);
}
} catch (UnknownAccountException e){
//UnknownAccountException:表示用户名不存在; Unknown(未知的) Account(账户、用户名)
e.printStackTrace();
System.out.println("登录失败-用户名不存在!");
} catch (IncorrectCredentialsException e){
//IncorrectCredentialsException :表示密码错误; Incorrect(不正确的) Credentials(凭证、密码)
e.printStackTrace();
System.out.println("登录失败-密码错误!");
} catch (AuthenticationException e) {
e.printStackTrace();
} System.out.println("判断用户root是否已经登录:" + currentUser.isAuthenticated()); //判断root用户是否属于某个角色
System.out.println("判断root用户是否属于admin角色:" + currentUser.hasRole("admin"));
System.out.println("判断root用户是否属于itsource角色:" + currentUser.hasRole("itsource"));
System.out.println("判断root用户是否属于guest角色:" + currentUser.hasRole("guest")); //判断root用户是否拥有某些权限
System.out.println("判断root用户是否拥有所有权限:" + currentUser.isPermitted("*"));
System.out.println("判断root用户是否拥有employee:*权限:" + currentUser.isPermitted("employee:*")); //用户退出系统
currentUser.logout(); System.out.println("判断用户root是否已经登录:" + currentUser.isAuthenticated());
}
}

 

Apache Shiro初认识的更多相关文章

  1. Apache Shiro 学习记录5

    本来这篇文章是想写从Factory加载ini配置到生成securityManager的过程的....但是貌似涉及的东西有点多...我学的又比较慢...很多类都来不及研究,我又怕等我后面的研究了前面的都 ...

  2. Apache Shiro 学习记录2

    写完上篇随笔以后(链接).....我也想自己尝试一下写一个Strategy.....Shiro自带了3个Strategy,教程(链接)里作者也给了2个.....我想写个都不一样的策略.....看来看去 ...

  3. Apache Shiro系列(1)

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

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

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

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

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

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

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

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

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

  8. Apache Shiro 学习记录1

    最近几天在学习Apache Shiro......看了一些大神们的教程.....感觉收获不少.....但是毕竟教程也只是指引一下方向....即使是精品教程,仍然有很多东西都没有说明....所以自己也稍 ...

  9. [转]在 Web 项目中应用 Apache Shiro

    目录[-] 用户权限模型 图 1. 用户权限模型 认证与授权 Shiro 认证与授权处理过程 Shiro Realm 清单 1. 实现自己的 JDBC Realm 为何对 Shiro 情有独钟 与 S ...

随机推荐

  1. Oraclecloud创建时没有上传公钥的解决办法

    https://blogs.oracle.com/cloud-infrastructure/recovering-opc-user-ssh-key-on-oracle-cloud-infrastruc ...

  2. Git的使用(2) —— 本地版本库的操作

    1. 向本地版本库中添加文件 注意:.git文件夹是本地版本库,包含.git文件夹的目录叫工作目录,要往本地版本库中添加文件,就必须将文件放在工作目录中. (1) 把文件添加到工作目录中. (2) 右 ...

  3. 在java的Map集合中,怎样更改value的值

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/chenyao1994/article/de ...

  4. 请你谈谈Cookie的弊端

    a. 每个特定的域名下最多生成的cookie个数有限制 b. IE和Opera 会清理近期最少使用的cookie,Firefox会随机清理cookie c. cookie的最大大约为4096字节,为了 ...

  5. 基因表达半衰期 | mRNA Half-Life

    做单细胞RNA-seq分析,自然就能想到我们测到的其实是一个概率学的东西,就像女士品茶里的酵母的泊松分布一样. 真实的细胞里,一切都是连续的,从DNA到mRNA到蛋白,是有一个时间间隔的,每一个pro ...

  6. js怎么模拟点击网页元素

    在测试页面中,引入jquery源文件,并添加一个div标签,一个a标签,为了演示效果a标签暂时不添加地址 通过jquery为div标签绑定一个点击事件,这个事件是被动执行的.意思是要点击才会触发的 在 ...

  7. vim 外部粘贴代码,如何保持原格式,而不持续缩进

    主要内容:使用“:set paste” 来实现vim 按照源文件格式复制 在vim 使用中偶尔要复制外部代码,常常出现不停缩进的问题: 怎么避免此种情况出现呢 可以在命令模式中使用“:set past ...

  8. Java 处理0x00特殊字符

    Java 处理0x00特殊字符 一.0x00字符 1,0x00是ascii码的0值:NUL 2,0x00在windows系统中显示: 3,0x00在Linux中显示: ctrl+V ctrl+@可以打 ...

  9. ubuntu18设置root账号的开机登录

    date: 2019-08-20  17:36:49 author: headsen chen notice :个人原创 1,用普通用户登录. su - root 打开终端 vi /etc/pam.d ...

  10. Netty服务器连接池管理设计思路

    应用场景: 在RPC框架中,使用Netty作为高性能的网络通信框架时,每一次服务调用,都需要与Netty服务端建立连接的话,很容易导致Netty服务器资源耗尽.所以,想到连接池技术,将与同一个Nett ...