shiro框架java使用
大纲
Shiro****简介及架构图讲解
ini****配置文件讲解
Shiro****搭建及简单认证实现
加密及凭证匹配器
Spring整合Shiro完成登录功能.
知识点详解
一、Shiro简介
1.Shiro一个Java权限框架.
1.1在项目中把涉及到权限的业务提出来用shiro完成.
2.Shiro架构图
2.1 Subject 主体.对应一个用户,用户所有的信息都存放在Subject中.无论什么编程语言只要有Subject都可以使用Shiro框架.
2.2 Cryptography: Shiro密码管理功能.
2.2.1 密码加密,加盐,迭代等等.
2.3 Security Manager: 权限管理器.Shiro核心内容.所有Shiro功能都封装到Security Manager
2.4 Authenticator: 认证器. 例如登录注册等功能就属性认证功能.
2.5 Authorizer:授权器. 例如:判断用户是否具有某个角色,判断用户是否有某个权限,判断用户可以访问的菜单.
2.6 Session Manager : Session管理器.使用Shiro后,shiro会禁用HttpSession,使用Shiiro自己的Session管理器.
2.7 Cache Manager : 缓存管理. 支持Cookie的缓存(remember me),支持Redis的缓存.
2.8 Realm: 域.作用是当Shiro希望访问数据库时,通过Realm组件完成的.
二、Shiro.ini文件
1.ini (InitializationFile) 初始文件.Window系统文件扩展名.
2.Shiro 使用时可以连接数据库,也可以不连接数据库.
2.1 如果不连接数据库,可以在shiro.ini中配置静态数据.
3. Shiro.ini文件组成部分
3.1[main] :定义全局变量
3.1.1 内置securityManager对象.
3.1.2 操作内置对象时,在[main]里面写东西
[main]
securityManager.属性=值
myobj=com.bjsxt.lei
securityManager.对象属性=$myobj
3.2[users] :定义用户名和密码
[users]
# 定义用户名为zhangsan 密码为zs
zhangsan=zs
# 定义用户名lisi密码为lisi同时具有role1和role2两个角色
lisi=lisi,role1,role2
3.3[roles]: 定义角色
[roles]
role1=权限名1,权限名2
role2=权限3,权限4
3.4[urls] : 定义哪些内置urls生效.在web应用时使用.
[urls]
url地址=内置filter或自定义filter
# 访问时出现/login的url必须去认证.支持authc对应的Filter
/login=authc
# 任意的url都不需要进行认证等功能.
/** = anon
# 所有的内容都必须保证用户已经登录.
/**=user
# url abc 访问时必须保证用户具有role1和role2角色.
/abc=roles[“role1,role2”]
三、Shiro 环境搭建实现认证
认证流程
实现步骤
2.1 在pom.xml中导入jar
<dependencies>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.3.2</version>
</dependency>
</dependencies>
2.2 在src /java/resources下新建shiro.ini文件
[users]
zhangsan=zs
2.3 编写代码,实现认证
// SecurityManager JDK也有这个类,在java.lang包
Factory factory = new IniSecurityManagerFactory(“classpath:shiro.ini”);
SecurityManager sm = factory.getInstance();
// 只要线程不变,Subject不变
SecurityUtils.setSecurityManager(sm);
Subject subject = SecurityUtils.getSubject();
// Subject subject = (new Subject.Builder()).buildSubject();
// 客户端传递过来的用户名和密码
UsernamePasswordToken token = new UsernamePasswordToken(“zhangsan”, “zs”);
try {
subject.login(token);
System.out.println(“登录成功”);
} catch (UnknownAccountException e) {
System.out.println(“账户不存在”);
} catch (IncorrectCredentialsException e) {
System.out.println(“密码错误”);
}
四、实现授权
1.流程图
2.常用api
2.1 subject.hasRole(“”); 判断是否有角色
2.2 subject.hashRoles(List);分别判断用户是否具有List中每个内容
2.3 subject.hasAllRoles(Collection);返回boolean,要求参数中所有角色用户都需要具有.
2.4 subject.isPermitted(“”);判断是否具有权限.
五、自定义Realm
1. Principal:身份
1.1 用户名可以是身份
1.2 邮箱可以是身份.
1.3 手机可以是身份.
1.4 用户对象也可以是身份.
2.Credentials:凭证.
2.1 密码可以是凭证
2.2 证书也是可以是凭证.
3. SecurityManager接口只有一个普通java类DefaultSecurityManager
4. 实现步骤:
4.1 新建类继承AuthorizingRealm
4.2 在doGetAuthenticationInfo实现认证过程.
4.3 代码
public class MyRealm extends AuthorizingRealm{
//执行授权方法
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
// TODO Auto-generated method stub
return null;
}
//执行认证
//当subject.login()时自动调用该方法
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
Object obj = token.getPrincipal();
System.out.println(“principal:”+obj);
Object obj2 = token.getCredentials();
new String((char[])obj2);
System.out.println(“credentials:”+new String((char[])obj2));
//如果方法返回值为null,shiro认为用户名不存在.
//如果返回值不是null,判断AuthenticationInfo中凭证和subject.login时凭证是否匹配
//第一个参数: 第一个参数写什么以后登录这个用户的身份就是什么.
//第二个参数是从数据库中取出的凭证信息,判断这个信息和subject.login()第二个参数是否匹配.
//第三个参数:都是用户主键值.
SimpleAuthenticationInfo info=new SimpleAuthenticationInfo(obj, “zs”, “myrealm”);
return info;
}
}
4.4 在shiro.ini中配置自定义Realm
[main]
myrealm=com.bjsxt.realm.MyRealm
securityManager.realms=$myrealm
4.5 执行subject.login()调用doGetAuthenticationInfo
六. 凭证匹配器
1. 保证数据库中密码是加密的密码
2.在shiro.ini中配置凭证匹配器
[main]
myrealm=com.bjsxt.realm.MyRealm
# 定义凭证匹配器类
credentialsMatcher =org.apache.shiro.authc.credential.HashedCredentialsMatcher
# 设置加密算法
credentialsMatcher.hashAlgorithmName=md5
# 迭代次数
credentialsMatcher.hashIterations=2
# 引用凭证匹配器
myrealm.credentialsMatcher=$credentialsMatcher
securityManager.realms=$myrealm
3.在自定义realm中
3.1 第三个参数:加盐值. 类型是ByteSource类型,bytes()跟字符串类型,不能使用Long
SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(token.getPrincipal(),rs.getObject(“password”),
ByteSource.Util.bytes(rs.getObject(“id”).toString()) ,“key:”+rs.getObject(“id”));
七、自定义Realm中-doGetAuthorizationInfo()
1.该方法被执行情况
- java中hasRole() , isPermitted();
- 使用注解
@RequiresRoles(“role1”)
@RequiresPermissions(“”)
2.在jsp中标签
<%@ taglib prefix=“shiro” uri=“http://shiro.apache.org/tags” %>
<shiro:hasRole name=“role1”>
abc
</shiro:hasRole>
<shiro:hasPermission name=“quanxian”>
jqk
</shiro:hasPermission>
shiro框架java使用相关推荐
- shiro框架的使用及扩展
2019独角兽企业重金招聘Python工程师标准>>> 管理后台的权限管理模块搭建中使用了shiro框架. shiro的优点是:相对Spring Security较为轻巧,使用起来自 ...
- SSM整合shiro框架相关配置文件
1.创建相关表 2.导入maven依赖 <properties><java.version>1.8</java.version><spring.version ...
- Spring集成Shiro框架实战
文章目录 一:什么是Shiro框架 二:Shiro框架简介 1.Shiro基础功能点介绍 2.Shiro的工作原理 3.Shiro的内部工作结构 4.Shiro的身份认证流程 三:Spring集成Sh ...
- shiro框架采取MD5+salt方式加密密码
1.Maven配置 <dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-s ...
- ehcache使用_Java 程序员如何使用 Shiro 框架
Java 程序员如何使用 Shiro 框架 一.架构 要学习如何使用Shiro必须先从它的架构谈起,作为一款安全框架Shiro的设计相当精妙.Shiro的应用不依赖任何容器,它也可以在JavaSE下使 ...
- SpringBoot2.0 整合 Shiro 框架,实现用户权限管理
GitHub源码地址:知了一笑 https://github.com/cicadasmile/middle-ware-parent 一.Shiro简介 1.基础概念 Apache Shiro是一个强大 ...
- shiro将session认证改成token认证_初步学习Shiro框架 第一集
1.什么是Shiro Apache Shiro™ is a powerful and easy-to-use Java security framework that performs authent ...
- 使用shiro框架的项目增加忘记密码功能遇到的一些问题
开发忘记密码功能遇到的问题 后端验证功能用的是shiro框架,当前端发送AJax请求到后端,如果在application.yml文件中没有将找回页面所需要调用的接口配置为匿名,那么这些接口不会不调用, ...
- shiro框架---shiro配置介绍(一)
接上一篇文章shiro框架-通过系统介绍shiro框架中的实现逻辑 项目已分享到GitHub上,如果需要的可以看下,springboot+shiro项目Git下载地址. shiro在springb ...
- Shiro的Java原生反序列化漏洞
参考: http://www.lmxspace.com/2019/10/17/Shiro-%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E8%AE%B0%E5%BD%95/ ...
最新文章
- 【怎样写代码】工厂三兄弟之工厂方法模式(三):解决方案 II
- python dict遍历_python入门
- HDU5692(线段树+dfs序)
- char、varchar、binary和varbinary的区别与联系
- 最新系统之家系统win11 32位官方版v2021.07
- linux自学_shell脚本for详解
- 城池俱坏,英雄安在?云龙几度相交代?想兴衰,^
- Python入门--元组的遍历,获取元组元素
- 程序员面试金典——3.7猫狗收养所
- RemoveDirectory 功能:删除文件夹
- AI人才供不应求:应届生年薪可达50万 没出校门已被抢光
- (day 52 - DFS) 剑指 Offer 68 - II. 二叉树的最近公共祖先
- 190126每日一句
- 【手写数字识别】基于matlab知识库手写体数字识别【含Matlab源码 311期】
- SolidWorks软件远程安装协助
- html制作图片幻灯片效果代码,【JS+CSS3】实现带预览图幻灯片效果的示例代码
- 2021年CKA考试真题(一)CKA考试介绍
- 求给定正整数m以内的素数之和
- Js 跳转页面和打开新窗口的方法
- 【鼠标手势】Mouselnc使用笔记/Mouselnc+AHK=无敌好用/鼠标手势分享
热门文章
- matlab做瑞利信道仿真,瑞利信道怎么用 matlab做仿真
- SAP VA01 消息 没有用于售达方 XXXXXX 的客户主记录存在
- RestClientException: Could not extract response: no suitable HttpMessageConverter found for response
- 给应用程序注入钩子程序
- html入门教程博客,HTML基础教程
- 5.4.3控制器设计 微程序控制器 微指令的设计
- 2811路由器系统导入到服务器,配置CISCO2811路由器的E1连接
- 在线文本字符串转十六进制工具
- [转载].程序匠人 - 程序调试(除错)过程中的一些雕虫小技
- 抽象代数之拉格朗日定理的证明