一.使用的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认证流程的更多相关文章

  1. 菜鸟手把手学Shiro之shiro授权流程

    一.首先我们从整体去看一下授权流程,然后再根据源码去分析授权流程.如下图: 流程如下: 1.首先调用 Subject.isPermitted*/hasRole*接口,其会委托给 SecurityMan ...

  2. Shiro第二篇【介绍Shiro、认证流程、自定义realm、自定义realm支持md5】

    什么是Shiro shiro是apache的一个开源框架,是一个权限管理的框架,实现 用户认证.用户授权. spring中有spring security (原名Acegi),是一个权限框架,它和sp ...

  3. Shiro learning - 认证流程(3)

    Shiro认证流程 在学习认证流程之前,你应该先了解Shiro的基本使用流程 认证 身份认证: 证明用户是谁.用户需要提供相关的凭证principals(身份标识)和Credentials (凭证,证 ...

  4. shiro框架学习-2-springboot整合shiro及Shiro认证授权流程

    1. 添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...

  5. JAVAEE——BOS物流项目10:权限概述、常见的权限控制方式、apache shiro框架简介、基于shiro框架进行认证操作

    1 学习计划 1.演示权限demo 2.权限概述 n 认证 n 授权 3.常见的权限控制方式 n url拦截权限控制 n 方法注解权限控制 4.创建权限数据模型 n 权限表 n 角色表 n 用户表 n ...

  6. Shiro之身份认证、与spring集成(入门级)

    目录 1. Shro的概念 2. Shiro的简单身份认证实现 3. Shiro与spring对身份认证的实现 前言: Shiro 可以非常容易的开发出足够好的应用,其不仅可以用在 JavaSE 环境 ...

  7. Shiro笔记(四)Shiro的realm认证

    认证流程: 1.获取当前Subject.调用SecurityUtils.getSubject(); 2.测试当前用户是否已经被认证,即是否已经登录,调用Subject的isAurhenticated( ...

  8. Java环境下shiro的测试-认证与授权

    Java环境下shiro的测试 1.导入依赖的核心jar包 <dependency> <groupId>org.apache.shiro</groupId> < ...

  9. shiro原理及其运行流程介绍

    shiro原理及其运行流程介绍 认证执行流程 1.通过ini配置文件创建securityManager 2.调用subject.login方法主体提交认证,提交的token 3.securityMan ...

随机推荐

  1. 图像处理笔记(二十):LAWS纹理滤波应用于缺陷检测

    LAWS纹理滤波 texture_laws(Image, 原图像 ImageTexture, 输出值,滤波后图像 FilterType, 过滤器类型 Shift, 灰度值转换,滤波后的灰度值可能会比较 ...

  2. java学习-IDEA相关使用

    1.配置git与github(用于将代码提交到GitHub) 添加自己的github账号 2.提交代码到github 登录https://github.com,即可看到刚刚提交到github的代码仓库 ...

  3. 搭建ASP.NET Core WebApi项目

    步骤 从“文件”菜单中选择“新建”>“项目” . 选择“ASP.NET Core Web 应用程序”模板,再单击“下一步” . 将项目命名为 NetCoreWebApi,然后单击“创建” . 选 ...

  4. 2017.12.21 学习vue的新得

    温故而知新,这句话说的真的有道理.每次回顾vue总会学到不一样的知识点,我就在想,我第一遍到底看了什么? 废话不多说,简要记录今天的所得: 1.v-if 与 v-show 同:都是条件渲染 异:渲染的 ...

  5. SpringBoot 逻辑异常统一处理

    构建项目 我们将逻辑异常核心处理部分提取出来作为单独的jar供其他模块引用,创建项目在parent项目pom.xml添加公共使用的依赖,配置内容如下所示: <dependencies> & ...

  6. SpringCloud之Hystrix服务降级(七)

    Hystrix设计原则 1.防止单个服务的故障,耗尽整个系统服务的容器(比如tomcat)的线程资源,避免分布式环境里大量级联失败.通过第三方客户端访问(通常是通过网络)依赖服务出现失败.拒绝.超时或 ...

  7. QQ聊天记录分析

    今天我们用R语言来处理一下.我们会用到一下技术:. (1)正则表达式 (2)词频统计 (3)文本可视化 (4)ggplot2绘图 (5)中文分词 一.数据处理 首先我们要讲QQ聊天记录导出成txt文件 ...

  8. 百度语音合成---前端vue项目

    ☞:官方文档 ☞:网页示例 具体步骤: 1.通过 socket.io 接收后端传过来的数据. 2.判断是否在播放声音.  如果没有则直接获取百度 token 播放声音 3.如果有,则存入数组.声音播放 ...

  9. 一句话CF

    目录 \(\bf {Round \ \#500 \ (Div. \ 1)}\) \(\bf {Round \ \#589 \ (Div. \ 2)}\) \(\bf {Avito \ Cool \ C ...

  10. [考试反思]1008csp-s模拟测试64:契机

    暴力没打满...有点垃圾... 考得稍绝望,啥也不会啊??? T3的测试点分治还写挂了... 其实就是没有沉下心好好的思考,在三道题上来回切换结果一个成型思路都没有 T2既然已经想到那一步了居然没有继 ...