菜鸟手把手学Shiro之shiro认证流程
一.使用的spring boot +mybatis-plus+shiro+maven来搭建项目框架
<!--shiro-->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.4.0</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.4.0</version>
</dependency>
2.写一个登录页面(登录页面代码就自己随便写一个form表单提交到controller就行)

3.在controller中创建userLogin方法,创建UsernamePasswordToken,获取subject,通过subject.login来进行登录认证。
@Slf4j
@RestController
@RequestMapping("/sys-user")
public class SysUserController { /**
* 用户登录
* @param userName
* @param password
*/
@PostMapping(value = "/login")
public ServerResponse userLogin(@RequestParam String userName, @RequestParam String password)
{
//1.获取token
UsernamePasswordToken token = new UsernamePasswordToken(userName,password);
//2.获取subject
Subject subject = SecurityUtils.getSubject();
//3.进行登录
try {
subject.login(token);
log.info("subject:"+subject.getPrincipal().toString());
return ServerResponse.createBySuccessMessage("登录成功!");
}catch (Exception e)
{
log.error("登录失败,用户名[{}]", userName, e);
token.clear();
return ServerResponse.createByErrorMessage(e.getMessage());
}
}
以上就是一个基本的登录流程,下面就继续分析subject.login()方法,到底怎么实现登录认证的,在后续中逐步分析如何使用自定义的Realm和CredentialsMatcher密码比较器.
首先,我们从外部来看 Shiro 吧,即从应用程序角度的来观察如何使用 Shiro 完成工作。如下图:(引用自《跟我学shiro教程》)

4.通过代码跟踪可以发现,subject.login()方法又调用了securityManager.login()方法,因此我们还需要一个注册一个securityManager的bean交给spring去管理

5.创建一个config的package,便于管理,项目结构如下

6.创建一个ShiroConfig的类,用来配置shiro相关的bean,首先使用@Configuration注解表明这是一个配置类,并注册一个securityManager的bean,发现传入参数是一个MyRealm的类,这个类就是我们需要自己去定义的Realm类

//配置核心安全事务管理器
/**
* securityManager
* @param authRealm ,@Qualifier表明了哪个实现类才是我们所需要的
* @return
*/
@Bean(name="securityManager")
public SecurityManager securityManager(@Qualifier("myRealm") MyRealm authRealm) { DefaultSecurityManager securityManager = new DefaultWebSecurityManager(); //设置Realm
securityManager.setRealm(authRealm);
securityManager.setRememberMeManager(rememberMeManager());
return securityManager;
}
//配置自定义的权限登录器
@Bean
public MyRealm myRealm()
{
MyRealm myRealm = new MyRealm();
myRealm.setCredentialsMatcher(new CredentialsMatcher());
return myRealm;
}
7.创建类Realm类并继承AuthorizingRealm类,然后通过token中的Principal(即用户名)去查询数据库中User,然后再把查询到的用户信息(包括密码)返回AuthorizationInfo


自定义MyRealm类继承thorizingRealm类,并且重写doGetAuthenticationInfo方法

public class MyRealm extends AuthorizingRealm{
@Autowired
private SysUserServiceImpl sysUserService;
//授权
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
return null;
}
//认证
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
/**获取用户输入的用户信息*/
String userName = (String)token.getPrincipal();
QueryWrapper<SysUser> queryWrapper = new QueryWrapper<SysUser>();
queryWrapper.eq("username",userName);
SysUser user = sysUserService.getOne(queryWrapper);
if(user == null)
{
throw new UnknownAccountException("该用户不存在");
}
if(user.getStatus() != null && Const.UserStatusEnum.DISABLE.getCode().equals(user.getStatus()))
{
throw new LockedAccountException("该账号被锁定,请联系管理员!");
}
//把user信息放在session中
SecurityUtils.getSubject().getSession().setAttribute(Const.CURRENT_USER,user);
return new SimpleAuthenticationInfo(user,user.getPassword(), ByteSource.Util.bytes(userName),getName());
}
}
如果身份认证失败就会捕获AuthenticationException,常见的如下:
DisabledAccountException(禁用的帐号)
LockedAccountException(锁定的帐号)
UnknownAccountException(错误的帐号)
ExcessiveAttemptsException(登录失败次数过多)
IncorrectCredentialsException (错误的凭证)
ExpiredCredentialsException(过期的凭证)等
如果身份认证通过后就要进行密码认证


自定义一个CredentialsMatcher类继承SimpleCredentialsMatcher类,并且重写doCredentiaIsMatch方法

以上就是shiro的基本登录认证流程,如有不当之处还望大家多多指教。
菜鸟手把手学Shiro之shiro认证流程的更多相关文章
- 菜鸟手把手学Shiro之shiro授权流程
一.首先我们从整体去看一下授权流程,然后再根据源码去分析授权流程.如下图: 流程如下: 1.首先调用 Subject.isPermitted*/hasRole*接口,其会委托给 SecurityMan ...
- Shiro第二篇【介绍Shiro、认证流程、自定义realm、自定义realm支持md5】
什么是Shiro shiro是apache的一个开源框架,是一个权限管理的框架,实现 用户认证.用户授权. spring中有spring security (原名Acegi),是一个权限框架,它和sp ...
- Shiro learning - 认证流程(3)
Shiro认证流程 在学习认证流程之前,你应该先了解Shiro的基本使用流程 认证 身份认证: 证明用户是谁.用户需要提供相关的凭证principals(身份标识)和Credentials (凭证,证 ...
- shiro框架学习-2-springboot整合shiro及Shiro认证授权流程
1. 添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...
- JAVAEE——BOS物流项目10:权限概述、常见的权限控制方式、apache shiro框架简介、基于shiro框架进行认证操作
1 学习计划 1.演示权限demo 2.权限概述 n 认证 n 授权 3.常见的权限控制方式 n url拦截权限控制 n 方法注解权限控制 4.创建权限数据模型 n 权限表 n 角色表 n 用户表 n ...
- Shiro之身份认证、与spring集成(入门级)
目录 1. Shro的概念 2. Shiro的简单身份认证实现 3. Shiro与spring对身份认证的实现 前言: Shiro 可以非常容易的开发出足够好的应用,其不仅可以用在 JavaSE 环境 ...
- Shiro笔记(四)Shiro的realm认证
认证流程: 1.获取当前Subject.调用SecurityUtils.getSubject(); 2.测试当前用户是否已经被认证,即是否已经登录,调用Subject的isAurhenticated( ...
- Java环境下shiro的测试-认证与授权
Java环境下shiro的测试 1.导入依赖的核心jar包 <dependency> <groupId>org.apache.shiro</groupId> < ...
- shiro原理及其运行流程介绍
shiro原理及其运行流程介绍 认证执行流程 1.通过ini配置文件创建securityManager 2.调用subject.login方法主体提交认证,提交的token 3.securityMan ...
随机推荐
- [七年技术总结系列][理论篇]-RBAC权限模型由浅入深
权限部分将分两章介绍,第一章由浅入深介绍权限理论知识及应用,第二章介绍具体实现.后期再讲述中间件的使用时,还会插入一些权限内容,本质上属于中间件的应用. 权限模块是业务系统最常见.最基本的子集.本章假 ...
- pytest5-使用conftest.py实现多文件共享fixture
一个测试工程下是可以有多个conftest.py的文件,一般在工程根目录放一个conftest.py起到全局作用.在不同的测试子目录也可以放conftest.py,作用范围只在该层级以及以下目录生效. ...
- 00jmeter安装相关
1.官网下载安装包:http://jmeter.apache.org/ 下载最新版本: 2.将下载后的zip文件解压 3. jdk与jmeter的环境变量配置(以下变量如果没有则新建,如果已存在则直接 ...
- [AHOI2002]网络传输
这道题根据题意,易知k的幂与p的二进制形式有关系,然后再一波高精度即可.(这里我用$n.k$代替了$k.p$) #include <iostream> #include <cstdi ...
- 百万年薪python之路 -- 面向对象之继承
面向对象之继承 1.什么是面向对象的继承 继承(英语:inheritance)是面向对象软件技术当中的一个概念. 通俗易懂的理解是:子承父业,合法继承家产 专业的理解是:子类可以完全使用父类的方法和属 ...
- (day27)subprocess模块+粘包问题+struct模块+ UDP协议+socketserver
目录 昨日回顾 软件开发架构 C/S架构 B/S架构 网络编程 互联网协议 socket套接字 今日内容 一.subprocess模块 二.粘包问题 三.struct模块 四.UDP 五.QQ聊天室 ...
- 设计模式(六)Prototype模式
Prototype模式就是不根据类来生成实例,而是根据实例来生成新实例.至于为什么不能根据类来生成实例,在最后会讲到. 还是根据实例程序来理解这种设计模式吧. 下面是实例代码. package Big ...
- 设计模式(二十一)Proxy模式
在面向对象编程中,“本人”和“代理人”都是对象.如果“本人”对象太忙了,有些工作无法自己亲自完成,就将其交给“代理人”对象负责. 示例程序的类图. 示例程序的时序图.从这个时序图可以看出,直到调用pr ...
- Docker在Linux上 基本使用
简介 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任 ...
- Ambari 集群时间同步配置教程
本文原始地址:https://sitoi.cn/posts/27560.html 步骤 在时间同步主节点创建 ntp.conf 文件 在时间同步从节点上创建 ntp.conf 文件 修改所有节点时区 ...