菜鸟手把手学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 ...
随机推荐
- 01--Java语言概述与开发环境 最适合入门的Java教程
Java 程序运行机制 编译型语言: 使用专门的编译器,针对特定平台(操作系统)将某种高级语言源代码一次性"翻 译"成可被该平台硬件执行的机器码(包括机器指令和操作数),并包装成该 ...
- BeetleX服务网关之服务发现与泛域名路由
在新版本的服务网关中提供了服务发现和泛域名路由解决功能,服务发现可以在无须配置的情况下实现服务自动注册到网关中解脱对服务配置的繁琐工作:而泛域名路由则可以针对不同的域名制定不同的负载规则. 使用con ...
- 使用jquery插件uploadfive、jcrop实现头像上传
1.html页面部分代码:(实现选着图片时,jcrop能够刷新图片) <script type="text/javascript"> $(function(){ $(& ...
- 开根号 HYSBZ - 3211
区间修改+区间查询(线段树板子题) 另外因为1e9内的数开5次根号必定为1或0,所以我们可以提前打表i<=sqrt[1e9], s[i]=sqrt(i).这样每次改值不必再调用系统的sqrt: ...
- Tomcat项目部署
一 之前一直是在ecplise 利用tomcat插件的形式启动项目,这里可以通过选择server.xml和context files两种方式这里选择这两者方式,都是会在tomcat/bin下产生对应的 ...
- 【java基础】为什么重写toString()方法?
不得不说,有很多java初学者写java实体类的时候,并没有真正理解重写toString() 方法,可能是口头知道也可能是跟风随带添加toString() 方法,并没有真正理解其意义,如果真要被问起来 ...
- Lost My Music:倍增实现可持久化单调栈维护凸包
题目就是求树上每个节点的所有祖先中(ci-cj)/(dj-di)的最小值. 那么就是(ci-cj)/(di-dj)的最大值了. 对于每一个点,它的(ci,di)都是二维坐标系里的一个点 要求的就是祖先 ...
- CSPS模拟 94
以后干脆不要在准备提交的代码里放调试信息. 再也不忘删printf可是memset还是看不见... T1 玄学错误,不想研究.skyh帮我研究出来了.HACKDATA:1 1 T2 傻逼做法. 发现一 ...
- 卡特兰数&&prufer序列&&BSGS水题集
首先说一下BSGS的一个坑点: 解方程A^x≡B(mod p) 需要特判一个东西=>A%p==B%p==0? 如果相等的话puts("1")反之则无解. 因为如果A%p=0, ...
- python爬虫-携程-eleven参数
携程-eleven分析 一.eleven的位置 通过对旁边栈的分析,它是在另一个js文件中调用的.那个js文件是一个自调用的函数,所以我们可以直接copy下来,用浏览器执行看看 执行运行是会报错的,u ...