1、前言
在使用shiro之前,我们要先了解一下权限和认证这两个概念
首先权限管理属于安全管理的范畴,简单来说就是对用户的访问进行控制,你是什么身份才能访问对应级别的数据
认证可以这样理解:判断一个用户是否是合法用户的这个处理的过程就叫做身份认证,最常用的是通过用户名和密码进行身份认证,如果你的用户名和密码在数据库中存在,则表示合法,否则不合法
2、shiro的介绍和作用
Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。
简单来说就是以前咱们手写的认证和授权等等的代码,shiro都给写好封装在一起了,我们只需要按照这个框架提供的API集成到我们的项目中去就行了。
目前市面上通用的权限管理框架有很多,比如Spring Security,OAuth2等等,但是shiro对比起来没有框架的依赖,任何平台都能使用,简单够用。
3、shiro的架构理解
Subject:主体,可以是用户也可以是程序
Security Manager:安全管理器(只要使用shiro框架那么这个对象都是必不可少的)
Realm:用户认证和授权的时候 和数据库交互的对象(可以看作为数据源,这里面干的事情就是从数据库查询数据 封装成token然后取进行认证和授权)
Authenticator:认证器(主要做主体认证、简单说就是用来登陆的时候做身份校验的)
Authrizer:授权器(简单的说就是用来主体授权的)
Principal:用户名(用户信息的封装)
Credential:认证凭证(理解为密码)
4、shiro的权限模型
模型可以理解为一个套路,这个套路就是我们在开发的时候,如果遇到一个项目中有多张不同的身份(角色)使用该系统时,而且不同身份还拥有不同访问权限的时候,我们在设置数据库时候的套路
用户表
用户id 用户名 ....
角色表
角色id 角色名字 角色描述
用户角色表
用户id 角色id
权限资源表
权限资源id 权限名字 权限的描述 type(per|res) resName resPath 显示区域的编码
角色权限表
角色id 权限的id
通用理解为:
5、认证的执行流程
6、授权的执行流程
7、shiro的第一个HelloWorld
7.1、导包
<!--导入shiro的包-->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-all</artifactId>
<version>1.3.2</version>
</dependency>
7.2、在resource下创建模拟数据库的文件shiro.ini
[users]
xbb=123
pkq=123
shiro.ini必须是下面的格式
如果idea默认以txt打开ini文件时会报错,两种解决办法
第一种: 让系统默认用打开properies文件的形式去打开ini文件
第二种:安装如下插件
注意:在shiro.ini中必须要写出users,如果写成user会出现如下错误:
Exception in thread "main" org.apache.shiro.authc.AuthenticationException: Authentication failed for token submission [org.apache.shiro.authc.UsernamePasswordToken - xbb, rememberMe=false]. Possible unexpected error? (Typical or expected login exceptions should extend from AuthenticationException).
at org.apache.shiro.authc.AbstractAuthenticator.authenticate(AbstractAuthenticator.java:214)
at org.apache.shiro.mgt.AuthenticatingSecurityManager.authenticate(AuthenticatingSecurityManager.java:106)
at org.apache.shiro.mgt.DefaultSecurityManager.login(DefaultSecurityManager.java:270)
at org.apache.shiro.subject.support.DelegatingSubject.login(DelegatingSubject.java:256)
at com.qf.App.main(App.java:28)
Caused by: java.lang.IllegalStateException: Configuration error: No realms have been configured! One or more realms must be present to execute an authentication attempt.
at org.apache.shiro.authc.pam.ModularRealmAuthenticator.assertRealmsConfigured(ModularRealmAuthenticator.java:161)
at org.apache.shiro.authc.pam.ModularRealmAuthenticator.doAuthenticate(ModularRealmAuthenticator.java:264)
at org.apache.shiro.authc.AbstractAuthenticator.authenticate(AbstractAuthenticator.java:198)
... 4 more
7.3、编写测试代码完成用户的认证
public static void main( String[] args ) {
//获取SecurityManagerFactory
IniSecurityManagerFactory iniSecurityManagerFactory = new IniSecurityManagerFactory("classpath:shiro.ini");
//通过SecurityManagerFactory获得securityManager
SecurityManager securityManager = iniSecurityManagerFactory.createInstance();
//将securityManager添加到运行环境中去
SecurityUtils.setSecurityManager(securityManager);
//获取当前操作的主体
Subject subject = SecurityUtils.getSubject();
//将用户名和密码放进去测试
//这里的username和password是从前端传来的
//创建token
UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken("xbb","123");
//传递token进行登录校验(在shiro的内部进行校验)
subject.login(usernamePasswordToken);
System.out.println("登录后用户的认证状态:"+subject.isAuthenticated());
subject.logout();
System.out.println("注销后用户的认证状态"+subject.isAuthenticated());
}
8、登录认证源码的解读