Shiro安全框架

一、Shiro简介

二、Shiro架构图

三、Shiro涉及常见名词

四、Shiro配置文件详解

shiro.ini 文件放在 classpath 下 ,shiro 会自动查找。其中格式是 key/value 键值对配置。 INI 配置文件一般适用于用户少且不需要在运行时动态创建的 情景下使用。 ini 文件中主要配置有四大类: main , users , roles , urls 示例:

1 、 [main] main 主要配置 shiro 的一些对象,例如 securityManager , Realm , authenticator , authcStrategy 等等, , 例如:

2 2 、 [users] [users] 允许你配置一组静态的用户,包含用户名,密码,角色,一个用户 可以有多个角色,可以配置多个角色,例如:

3 、 [roles] [roles] 将角色和权限关联起来,格式为:角色名= = 权限字符串1 1 ,权限字符 串 2…..

4 4 、 [urls] 这部分配置主要在 web 应用中,格式为: url= 拦截器[ [ 参数] ] ,拦截器[ [ 参 数 ]…… ,例如:

五、认证实现

认证:验证用户是否合法 在 shiro 中,用户需要提供 principals (身份)和 credentials (凭证) 给 shiro

5 .1.principals 身份,即主体的标识属性,可以是任何东西,如用户名、邮箱等,唯一即可。 例如:用户名/ / 邮箱/ / 手机号等。 5 5 .2.credentials 凭证,即只有主体知道的安全值,如密码/ / 数字证书等。 最常见的 principals 和 credentials 组合就是用户名/ / 密码了。

5.3 实现步骤 5.3.1 导入jar包 5.3.2 从源码的示例项目quickstart中拷贝shiro.ini放到src下,并 配置 5.3.3 编写代码

 package com.sxt.test;​import org.apache.shiro.SecurityUtils;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.junit.Test;/*** 实现简单认证* @author Administrator**/public class AuthenticationTest {@Testpublic void testAuthentication(){//1.构建SecurityManager工厂IniSecurityManagerFactory smf = new IniSecurityManagerFactory("classpath:shiro.ini");//2.通过SecurityManager工厂获取SecurityManager实例SecurityManager sm = smf.getInstance();//3.将securityMananger设置到运行环境中SecurityUtils.setSecurityManager(sm);//4.获取subject实例Subject sub = SecurityUtils.getSubject();//5.创建用户名密码验证令牌TokenUsernamePasswordToken token = new UsernamePasswordToken("victor","123456");//6.进行身份验证sub.login(token);System.out.println(sub.isAuthenticated());}}​

六、JDBCRealm

Shiro默认使用自带的IniRealm,IniRealm从ini配置文件中读取用户的信息。 大部分情况下需要从系统的数据库中读取用户信息,所以需要使用 JDBCRealm或自定义Realm。 需求:使用JDBCRealm提供数据源,从而实现认证 实现步骤: 6.1建users表(表名、字段对应上) 6.2添加jar包(数据库驱动、数据库连接池、beanutils等) 6.3编写shiro.ini 6.4编写测试代码 【代码示例】

配置文件shiro.ini

 [main]#配置RealmjdbcRealm = org.apache.shiro.realm.jdbc.JdbcRealm​#配置数据源dataSource = com.mchange.v2.c3p0.ComboPooledDataSourcedataSource.driverClass = com.mysql.jdbc.DriverdataSource.jdbcUrl = jdbc:mysql://localhost:3306/projectdataSource.user = rootdataSource.password = 123456​jdbcRealm.dataSource = $dataSource​#将Realm注入给SecurityManagersecurityManager.realm = $jdbcRealm

七、如何自定义Realm

自定义Realm,可以注入给securityManager更加灵活的安全数据源(例如, JDBCRealm中表和字段都限定了) 通过实现Realm接口,或根据需求继承他的相应子类即可。 需求:使用自定义Realm提供数据源,从而实现认证 实现步骤: 6.1添加jar包 6.2编写自定义Realm 6.3编写shiro.ini 6.4编写测试类 【代码示例】

 [main]#配置RealmmyRealm = com.sxt.realm.MyRealm​#将Realm注入给SecurityManagersecurityManager.realm = $myRealm

自定义realm类继承 AuthenticatingRealm

 package com.sxt.realm;​import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;​import org.apache.shiro.authc.AuthenticationException;import org.apache.shiro.authc.AuthenticationInfo;import org.apache.shiro.authc.AuthenticationToken;import org.apache.shiro.authc.SimpleAuthenticationInfo;import org.apache.shiro.realm.AuthenticatingRealm;​import com.mysql.jdbc.Driver;​public class MyRealm extends AuthenticatingRealm {​@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {//使用JDBC,从数据库获取数据String principal = null;String credentials = null;ResultSet rs = null;Statement state = null;Connection conn = null;try {//1.注册驱动Driver driver = new Driver();DriverManager.registerDriver(driver);//2.获取连接对象String url="jdbc:mysql:///project";String user="root";String password="123456";conn = DriverManager.getConnection(url,user,password);//3.创建操作对象state = conn.createStatement();//4.执行sql语句String sql = "select userName,password from mylogin ";rs = state.executeQuery(sql);//5.处理结果集while(rs.next()){principal = rs.getString("userName");credentials = rs.getString("password");}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();} finally{try {if(rs!=null){rs.close();}if(conn!=null){conn.close();}if(state!=null){state.close();}} catch (Exception e2) {e2.printStackTrace();}}   SimpleAuthenticationInfo sai = new SimpleAuthenticationInfo(principal, credentials, "myRealm");return sai;}}

八、密码加密实现方案

对称非对称比较

8.3 凭证匹配器

在Realm接口的实现类AuthenticatingRealm中有credentialsMatcher属性。 意为凭证匹配器。常用来设置加密算法及迭代次数等。

shiro subject.getprincipal()为null_(变强、变秃)Java从零开始之Shiro安全框架相关推荐

  1. java监听所有端口_(变强、变秃)Java从零开始之zookeeper安装

    Zookeeper安装 1.安装单机版 1.安装linux.jdk 2.配置变量环境:export JAVA_HOME=/usr/local/jdk export CLASSPATH=.:$JAVA_ ...

  2. 谷歌提出「卷积+注意力」新模型,超越ResNet最强变体!

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 丰色 发自 凹非寺 量子位 报道 | 公众号 QbitAI Tran ...

  3. 谷歌提出「卷积+注意力」新模型,超越ResNet最强变体

    丰色 发自 凹非寺 量子位 报道 | 公众号 QbitAI Transformer跨界计算机视觉虽然已取得了一些不错的成绩,但大部分情况下,它还是落后于最先进的卷积网络. 现在,谷歌提出了一个叫做Co ...

  4. 【只有光头才能变强,文末有xx】分享一波Lambda表达式

    戳蓝字"CSDN云计算"关注我们哦! 作者 |  Java3y 责编 | 阿秃 前言 只有光头才能变强. 学了一下Java的函数式编程,给大家整理了一下,一起学习! 一.Lambd ...

  5. 梁宁:真正驱动你变强的,是痛苦

    思维方式 如何成为一个优秀的人? 我认为,想要变得更优秀,你需要学会"不满足".简单来说,就是对自己的现状不满足,不改变就会异常痛苦. 优秀需要努力,而努力是不舒服的事情,长期持续 ...

  6. 设计师如何在整理设计规范中变强

    设计规范的养成犹如航海的帆船要巩固好才能航行的更远,更稳. 背景 为什么要做设计规范?(why) 如果说工作两年我养成了什么习惯的话,那一定是在做任何需求之前,都先问问自己"为什么要做这件事 ...

  7. 山工kw什么意思_为什么有时开了空调,反而感觉车子动力会变强

    知乎视频​www.zhihu.com 车子开了空调,有时确实是可能给人感觉动力变强了,但其实是电脑在帮你多踩了一脚油门而已啦. 并不是发动机真的吃了兴奋剂,或者它吹的空调它凉快了,突然爆发出额外的动力 ...

  8. 5个能让你快速变强的自学网站,每天学习一点点,进步很明显

    你想要变强吗?想的话,就要学习了,毕竟学习才是变强的途径.那么怎么学习呢?去哪学习呢? 这里有5个能让你快速变强的自学网站,每天只要坚持学习一点点,进步会越来越明显,下面就一起来了解一下吧. 一.极客 ...

  9. 【第二期悬赏活动】RT-Thread 任务悬赏,一起来悄悄变强~

    为什么要参与开源项目? **参与贡献,成就自身.**在开源项目中做了什么贡献,包括写文档还是提交代码,或是做了什么社区工作,这些都是你最好的简历.让自己的能力得到增长的同时,有时候会帮助自己获得更多的 ...

最新文章

  1. 技术图文:双指针在求解算法题中的应用
  2. 数组公式基本功修炼之初步使用
  3. 2002: [Hnoi2010]Bounce 弹飞绵羊
  4. 用户中心 - 查询用户信息
  5. tensorflow 笔记 16:tf.pad
  6. 谈谈两种标准库类型---string和vector
  7. ARM指令 LDR 和 ADR的一些区别
  8. apache在线升级yum_基于Redis实现在线游戏积分排行榜 - phyger
  9. [19保研]中国科学院沈阳计算技术研究所教育中心2019年保研夏令营通知
  10. office2003安装包下载,专业版完整版官方原版!
  11. AtCoder Beginner Contest 240 D
  12. 剧本创作时的标准格式,让你的剧本轻松得到制片公司青睐
  13. java中的element_element是什么意思
  14. 电网企业 财务管理创新
  15. android系统版本卸掉,使用内置软件卸载最新版本的Android
  16. obs多推流地址_OBS如何进行多路推流
  17. matlab中使用simulink标准化输出图片
  18. 经验转行产品经理|纯经验分享
  19. python与会计数据_Python与财务【上】--数据采集篇
  20. 有苦有乐的算法 --- 判断一颗二叉树是否是完全二叉树、是否是平衡二叉树、是否是搜索二叉树

热门文章

  1. html界面等待状态,html 等待界面
  2. 【Python】comtypes模块Windows环境下使用批量转换成PDF文件
  3. .net core中使用GB2312编码
  4. BZOJ 4997 [Usaco2017 Feb]Why Did the Cow Cross the Road III
  5. POJ2398【判断点在直线哪一侧+二分查找区间】
  6. [算法 笔记]2014年去哪儿网 开发笔试(续)第一题BUG修正
  7. python屏幕的交互(读取输出信息)input,raw_input的区别
  8. WCF-001:WCF的发布
  9. 通用线程:POSIX 线程详解,第 2部分——称作互斥对象的小玩意
  10. vue报错:dependencies were not found: * element-ui in ./src/main.js * element-ui/lib/theme-chalk/inde