Shiro
安全框架
:简单说对访问权限进行控制,安全性包括用户认证
和用户授权
。用户认证
一般要求用户提供用户名和密码,系统通过校验两者来完成认证。
用户授权
指验证某个用户是否有权限执行某个操作。
一般来说,系统会为不同的用户分配不同的角色,而每个角色对应一系列权限。
1.什么是Shiro
Shiro是apache的一个开源框架,将软件系统的安全认证相关的功能抽取出来,实现用户身份认证,权限授权,加密,会话管理等,组成一个通用的安全认证框架。
1.1 Shiro模块内容具体意义
- Subject
即“当前操作用户”,不仅指“人”,也可以是“第三方进程”、“后台账户”。仅仅意味“当前跟软件交互的东西”。
Subject代表当前用户的安全操作,SecurityManager则管理所有用户的安全操作。
- SecurityManager
shiro框架的核心,shiro通过SecurityManager来管理内部组件实例,并通过它提供安全管理的各种服务。
- Realm
Realm是Shiro与应用安全数据 间的“桥梁”或者“连接器”。
1.2 Shiro中的认证
1.2.1 认证
身份认证,就是判断一个用户是否为合法用户的处理过程。
1.2.2 shiro中认证的关键对象
- Subject 主体
访问系统的用户,主体可以是用户、进程等,即进行认证的都称为主体。 - Principal 身份信息
是主体Subject进行身份认证的标识,标识具有唯一性,如用户名、手机号、邮箱等。一个主体可以有多个身份,但必须有一个主身份。credential
:凭证信息
是主体自己知道的安全信息,如:密码、证书等。
1.3 认证流程图
2.Shiro入门demo
先创建一个maven项目。
大体4步
1.加入shiro的jar包
2.加入扫描路径—自定义的ini文件,因为这个demo不连接数据库
3.创建ini虚拟数据库文件
4.编写测试类shiroTest.java
2.1 导shiro的jar包
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.5.3</version>
</dependency>
<!--必須要,不然日志文件報錯-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.25</version>
<scope>test</scope>
</dependency>
2.2 扫描路径
这是为了让idea知道模拟数据库文件的路径在哪里,因为项目不连接数据库
<!--等下的ini文件直接放resources,这是指明路径-->
<resources>
<resource>
<directory>/src/main/resources</directory>
</resource>
</resources>
2.3 创建ini文件
这个文件编码格式为:UTF-8、ANSI。
2.4 测试类shiroTest
public class TestShiro {
public static void main(String[] args) {
System.out.println("shiro简单入门测试------");
//1.创建安全管理器对象
DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
//2.给安全管理器对象设置realm(引入安全数据的文件)
//就是把自己定义好的realm文件加进来,用来验证规则,就加入到我们的安全管理器中
defaultSecurityManager.setRealm(new IniRealm("classpath:shiro.ini"));
//3.安全工具设置安全管理器
//即把安全管理器加入到安全工具中去
SecurityUtils.setSecurityManager(defaultSecurityManager);
//4.通过安全工具获取用户主体 主体可以使scanner传入的,也可以页面传入的
Subject subject = SecurityUtils.getSubject();
//------------------以上相当于我们的后端验证
//把配置文件上的用户信息获取出来放入令牌中
//5.这个就是我们的令牌(里面带着我们的信息) 即相当于前端传过来的信息
UsernamePasswordToken token = new UsernamePasswordToken("yty","123123");
//目前安全管理器里的信息和第5步中的令牌的信息 没有 联系在一起
System.out.println("没有认证之前。。。。。。。");
System.out.println(subject.isAuthenticated());//判断subject有没有认证
//只需要一个subject.login(token);即可联系起来
//开始认证
System.out.println("进行认证-----------");
subject.login(token);
System.out.println(subject.isAuthenticated());
}
}
结果:
如果传过来的密码和ini文件密码不一致就会报错。
密码不一致,报错!