shiro的学习(一)

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、登录认证源码的解读

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

发布了11 篇原创文章 · 获赞 6 · 访问量 194

猜你喜欢

转载自blog.csdn.net/X_Q_B_J/article/details/104506893