⑤【Shiro】SpringBoot整合Shiro,实现登录认证

Shiro登录的使用以及原理(一) 好久没写博客了,这段时间对最近项目做个总结,先从登入下手,话不多说直奔主题,Shiro的登录使用以及原理。 一、Shiro主要作用 shiro主要的作用就是实现用户登录(认证,授权,加密等),用户登录后的用户信息存储(缓存),用户登出等。 二、登录的使用 在使用登录的时候,最常见的一串代码就是获取Subject,然后对Token进行login(); // 得到subject然后对创建用户名/密码身份验证 Subject subject = SecurityUtils.ge... 阅读详情

在这里插入图片描述

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~
个人主页:.29.的博客
学习社区:进去逛一逛~

在这里插入图片描述


目录结构

目录结构:

在这里插入图片描述




Maven坐标导入

pom.xml:

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.1.RELEASE</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-spring-boot-web-starter</artifactId>
            <version>1.9.0</version>
        </dependency>
        <!--mybatis-plus-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.0.5</version>
        </dependency>
        <!--mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.46</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>



准备用于登录校验的数据

创建表结构,插入数据:

CREATE DATABASE IF NOT EXISTS `shirodb` CHARACTER SET utf8mb4;
USE `shirodb`;
CREATE TABLE `user` (
`id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '编号',
`name` VARCHAR(30) DEFAULT NULL COMMENT '用户名',
`pwd` VARCHAR(50) DEFAULT NULL COMMENT '密码',
`rid` BIGINT(20) DEFAULT NULL COMMENT '角色编号',
PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='用户表';

# e8e2ea5deb7e981462ab88c2b7e3f19a 是123456789经过MD5加盐三次机密后的结构,加的盐为"salt"
insert into user values(1, '.29.', 'e8e2ea5deb7e981462ab88c2b7e3f19a', 1);



数据库表对应的实体类

User:

/**
 * @author .29.
 * @create 2024-03-17 10:53
 */
//lombok组件注解,提供构造器以及Getter、Setter
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private Integer id;
    private String name;
    private String pwd;
    private Integer rid;
}



SpringBoot配置文件

applicaition.yml:

# mybatis-plus配置
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  mapper-locations: classpath:mapper/*.xml
spring:
  # 数据库连接配置
  datasource:
    type: com.zaxxer.hikari.HikariDataSource
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/shirodb?characterEncoding=utf-8&useSSL=false
    username: root
    password: abc123
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8



MyBatis-Plus操作数据库的Mapper接口

UserMapper:

/**
 * @author .29.
 * @create 2024-03-17 10:55
 @Repository注解用于标识一个类作为数据访问层(DAO)的组件,类似于@Component,但可以将底层数据访问技术(如 JDBC、Hibernate 等)所抛出的异常转换为 Spring 的数据访问异常(DataAccessException),这样在上层代码中可以统一处理数据访问异常。
 */
@Repository
public interface UserMapper extends BaseMapper<User> {
}




Service层,提供一个根据name查询用户的业务方法

Service接口:

/**
 * @author .29.
 * @create 2024-03-17 10:56
 */
public interface UserService {
    //用户登录
    User getUserInfoByName(String name);
}

Service实现类:

/**
 * @author .29.
 * @create 2024-03-17 10:57
 */
@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserMapper userMapper;

    /**
     * 根据name查询用户的业务方法
     * @param name
     * @return
     */
    @Override
    public User getUserInfoByName(String name) {
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("name", name);
        User user = userMapper.selectOne(queryWrapper);
        return user;
    }
}



自定义Realm,实现自定义登录认证

MyRealm:

/**
 * @author .29.
 * @create 2024-03-17 11:01
 */
@Configuration
public class MyRealm extends AuthorizingRealm {//自定义Realm需要继承AuthorizingRealm
    @Autowired
    private UserService userService;

    /**
     * 自定义授权方法,这里暂时不需要设置,直接返回null
     * @param principalCollection
     * @return
     */
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        return null;
    }

    /**
     * 自定义登录认证方法
     * @param authenticationToken
     * @return
     * @throws AuthenticationException
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        //从token中获取用户身份信息
        String name = authenticationToken.getPrincipal().toString();
        //查询数据库中的用户信息
        User user = userService.getUserInfoByName(name);
        //判断并将数据封装进进行登录认证的对象,进行返回
        if(user != null && name.equals(user.getName())){
            //创建实现了校验逻辑的对象,传入校验数据,交给shiro底层进行认证
            SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(
                    authenticationToken.getPrincipal()
                    , user.getPwd()
                    , ByteSource.Util.bytes("salt")
                    , name
            );
            return info;
        }
        return null;
    }
}




控制层,使用Shiro进行登录认证

myController:

/**
 * @author .29.
 * @create 2024-03-17 11:27
 */
@Controller
@RequestMapping("/myController")
public class MyController {

    @GetMapping("/userLogin")
    @ResponseBody
    public String userLogin(String name, String pwd){
        //获取subject对象
        Subject subject = SecurityUtils.getSubject();
        //封装请求数据至token
        UsernamePasswordToken token = new UsernamePasswordToken(name, pwd);
        //调用login方法进行登录认证
        try{
            subject.login(token);
            System.out.println("登陆成功!");
            return "登陆成功";
        }catch (AuthenticationException e){
            e.printStackTrace();
            System.out.println("登陆失败!");
            return "登陆失败";
        }
    }
}




Shiro配置类,使自定义Realm生效,设置拦截范围

ShiroConfig:

/**
 * @author .29.
 * @create 2024-03-17 11:14
 */
@Configuration
public class ShiroConfig {
    @Autowired
    private MyRealm myRealm;

    //配置SecurityManager
    @Bean
    public DefaultWebSecurityManager defaultWebSecurityManager(){
        //创建DefaultWebSecurityManager对象(安全管理器)
        DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager();
        //创建加密对象,设置属性
        HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher();
        hashedCredentialsMatcher.setHashAlgorithmName("MD5"); //使用什么加密算法?
        hashedCredentialsMatcher.setHashIterations(3);        //循环加密几次?
        myRealm.setCredentialsMatcher(hashedCredentialsMatcher); //为自定义Realm设置加密对象
        defaultWebSecurityManager.setRealm(myRealm);             //将自定义Realm存入安全管理器
        return defaultWebSecurityManager; //返回安全管理器
    }

    //配置Shiro内置过滤器拦截范围
    @Bean
    public DefaultShiroFilterChainDefinition defaultShiroFilterChainDefinition(){
        //创建拦截器定义对象
        DefaultShiroFilterChainDefinition filter = new DefaultShiroFilterChainDefinition();

        //配置不认证也能访问的资源(参数anon代表无需认证)
        filter.addPathDefinition("/myController/userLogin","anon");
        filter.addPathDefinition("/login","anon");
        //配置需要认证访问的资源(参数authc代表需要认证)
        filter.addPathDefinition("/**","authc");

        return filter;
    }



测试登录认证功能

启动项目,访问地址传递参数:

在这里插入图片描述





在这里插入图片描述

Springboot基础学习之(十七):通过Shiro实现用户得到登录认证和授权 springboot项目:通过shiro实现用户的认证和授权服务 设置网页的访问权限,不同的网页是具有不同的权限的用户才能够访问的 阅读详情

相关推荐

手把手教你Shiro整合JWT实现登录认证

Component/*** 限定这个realm只能处理JwtToken*/@Override}/*** 授权(授权部分这里就省略了)*/@Override// 获取到用户名,查询用户权限}/*** 认证*/@Override// 获取token信息// 校验token:未校验通过或者已过期if (!throw new AuthenticationException("token已失效,请重新登录");}//用户信息。

Huangjiazhen711的博客 6368

Shiro(二)——shiro 登录流程、整合 SSM + Shiro、Shiro 密码加密(编码方式、密码加盐)、JdbcRealm(采取哪个数据作盐)、自定义访问数据库或字段、多 Realm 配置

Shiro(二)—— 一、shiro 登录流程 1、shiro 登录流程 二、整合 SSM + Shiro 在 SS SHiro 的基础上导入 mybatis。 1、依赖导入 所有依赖: 2、Spring 配置文件 这里是原有配置代码的基础上添加新的进去,而不是只有这个: 这里注释,因为这一块可以通过注解去注释: 然后 MyRealm 添加注解: 然后自己添加一个实体类,写一个查询方法,接着修改 MyRealm: 到这里为止,就算整合完成了。 三、Shiro 密码加密 1、编码方式 2、密码

qq_41824825的博客 1486

Spring Boot 整合 Shiro 实现 Token 的登录和认证

Spring Boot 2.X 实战--Shiro (Token)登录和验证 主要介绍了 Spring Boot 整合 Spring Security 实现 Token 的登录和认证,这一小节中,我们将实现 Spring Boot 整合 Shiro 实现 Token 的登录和认证。 目录结构 1)Apache Shiro 简介 2)Shiro 项目配置 2.1)项目配置 3)开始...

u011202388的博客 6415

一文读懂 Shiro 登录认证全流程

一起跟着源码看 Shiro 的登录认证流程

csdn565973850的博客 6632

SpringBoot+Shiro+Jwt实现登录认证——最干的干货

1. 概述 1.1 SpringBoot 这个就没什么好说的了,能看到这个教程的,估计都是可以说精通了SpringBoot的使用 1.2 Shiro 一个安全框架,但不只是一个安全框架。它能实现多种多样的功能。并不只是局限在web层。在国内的市场份额占比高于SpringSecurity,是使用最多的安全框架 可以实现用户的认证和授权。比SpringSecurity要简单的多。 1.3 Jwt 我的理解就是可以进行客户端与服务端之间验证的一种技术,取代了之前使用Session来验证的不安全性

守夜人爱吃兔子的博客 1721

Springboot 整合 Shiro 实现登录认证和权限校验

shiro介绍: Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。 三个核心组件:Subject, SecurityManager 和 Realms. Subject:即“当前操作用户”。但是,在Shiro中,Sub...

古小龙 1489

Springboot整合Shiro之认证

  Shiro是我们常用的一个权限管理框架,我们之前已经详细的给大家介绍过了Shiro的基础知识,不太清楚的可以参考下 https://blog.youkuaiyun.com/qq_38526573/category_9284714.html 此文,本文的重点是来介绍下在SpringBoot环境下我们怎么来使用Shiro。 一、添加相关依赖 本案例中我们使用SpringDataJPA和Thymeleaf来配合...

波波烤鸭的博客 2万+

NC65实现Restful接口开发及调试

NC65实现Restful接口开发及调试

linzhongshu的专栏 2143

springboot(十四):springboot整合shiro-登录认证和权限管理

这篇文章我们来学习如何使用Spring Boot集成Apache Shiro。安全应该是互联网公司的一道生命线,几乎任何的公司都会涉及到这方面的需求。在Java领域一般有Spring Security、Apache Shiro等安全框架,但是由于Spring Security过于庞大和复杂,大多数公司会选择Apache Shiro来使用,这篇文章会先介绍一下Apache Shiro,在结合Spri

纯洁的微笑 9万+

Clawdbot完 整安装与使⽤指南(保姆级教程)

Clawdbot 是⼀款开源个⼈ AI 智能体(Personal AI Agent),核⼼优势为本地部署+系统级执⾏+全渠道交互,可通过聊天⼯具(Telegram/WhatsApp 等)下达指令,⾃动完成⽂件整理、代码部署、⽇程同步等任务,所有数据本地存储,隐私零泄露。截⾄2026年 1 ⽉,GitHub 星标突破 4 万+,⽀持 Windows/Mac/Linux/云服务器多平台。

A1609926242的博客 1604

ADS交叉耦合振荡器VCO仿真

本文主要参考视频中如何使用进行ADS交叉耦合振荡器仿真和分析,由于视频中有诸多错误和视频清晰度较低,虽然视频博主及时改正,为了节省学习时间,可以直接参考本文。

qq_32589131的博客 5421

Shiro实现登录认证以及整合到Springboot3

Shiro实现登录认证以及整合到Springboot3

LIPAH的博客 3241

RK3588 Ubuntu 20.04 编译 eglinfo 踩坑实录:从 Python 环境配置到 Mali 驱动调试

本文详细解析了在RK3588平台上使用Ubuntu 20.04编译eglinfo的全过程,包括Python环境配置、waf构建系统升级、Mali驱动调试等关键步骤。通过系统级软链接方案、驱动状态诊断和EGL环境验证技巧,帮助开发者快速解决常见问题,构建可靠的图形调试环境。

weixin_29158047的博客 373

springboot整合shiro实现登录认证授权以及退出

文章目录springboot整合shiro实现登录认证授权以及退出shrio简介环境准备创建一个springboot的项目导入相关的依赖springboot整合shiro的依赖thymleaf的依赖创建首页创建controllershiro重要概念拦截器拦截请求创建配置类修改首页登录页面登录认证授权退出 springboot整合shiro实现登录认证授权以及退出 shrio简介 shiro是一个权限管理框架,用于实现登录认证以及授权。 环境准备 创建一个springboot的项目 这里我创建的是最简单的we

dream_follower的博客 2827

Meta开源Ego-Exo4D数据集:如何用1400小时多模态视频训练你的AI模型

Meta开源的Ego-Exo4D数据集包含1400小时多模态视频,涵盖第一人称和第三人称视角、眼动追踪、IMU传感器等多种模态,是AI模型训练的宝贵资源。本文详细介绍了从数据集下载、预处理到模型训练的全流程,帮助研究者高效利用这一多模态数据集进行AI模型开发。

weixin_29159441的博客 342

ESP32-C3模组上实现蓝牙BLE配网功能(1)

ESP32-C3模组上实现蓝牙BLE配网功能(1)

phmatthaus的专栏 2279

SpringBoot + Shiro + Jwt 实现登录认证,代码分析

前言 花了几天了解Shiro框架(也不算太深入),根据网上资料做了一个Demo:SpringBoot 2.2.9.RELEASE+ Shiro + Jwt 实现登录认证。 1、这个Demo关注 登录授权(比较通用),基本不涉及权限控制,因为权限控制设计到具体业务。所以可以本Demo可以根据自身实际情况稍加修改,就可以作为前后端分离项目的登录模块。 2、本博客适用于对Shiro和Jwt有了解,起码对于几个关键的类的作用及方法有了解,下面我不会展开,只会对Demo的思路和代码做分析。 思路分析

passerbyYSQ 6028

AUTOSAE软件配置-达芬奇( DaVinci Configurator)从新建工程开始

方法1,直接使用案例工程,一般SIP包会有一个创建好的案例工程,在这样的路径YOUR_SIP_DIR/Applications/SipAddon/StartApplication下面直接打开这个*.dpa文件即可看到已经预先做好的工程:但是,这个也不是全的,也不一定完全正确,至少MCAL是没有配置好的(MCAL是IC厂商提供的,并不归属SIP包的一部分)。这样就需要你自己去配置你想要的模块,修改里面的错误。

m0_49148264的博客 2935

springboot整合shiro实现登录验证

springboot整合shiro实现登录验证 今天第一次接触springboot,本来是要学习springboot和shiro整合的,但是由于springboot结构还不太了解,所以先来了解一下springboot。 springboot可以快速创建一个机遇spring的项目,而且让这个项目跑起来只需要很少的配置就可以了,主要有以下核心功能: 1.独立运行的spring项目:springboo...

c1225992531的博客 8559

倍福--手动加入第三方伺服的配置

客户在没有硬件情况下,希望手动配置硬件,添加第三方驱动器,本文介绍其操作流程 目 录 软硬件版本 3 1.1. 倍福Beckhoff 3 1.1.1. 控制器硬件 3 1.1.2. 控制软件 3 操作步骤 3 2.1. 添加电机XML文件 3 2.2. 创建EtherCAT 3 2.3. 添加新建项 3 2.4. 选择型号 4 2.5. 关联NC轴 5 软硬件版本 1.1. 倍福Beckhoff 1.1.1. 控制器硬件 TwinCAT控制制器,PC或者EPC,包括: 嵌入式控制器:CX5020-

weixin_41883890的博客 5324

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【Shiro】Springboot整合Shiro实现登录和注册

【Shiro】Springboot整合Shiro实现登录和注册简单了解Shiro基本概念内部结构框架JPARealm:通过 JPA 进行验证的 RealmShiro 配置注册登录退出登录拦截器判断是否登录前台判断是否登录 简单了解Shiro 基本概念 Subject:主体,代表当前‘用户’ 。这个用户不一定是一个具体的人,与当前应用交互的任何东西都是Subject,如网络爬虫,机器人等;即一个抽...

weixin_44823875的博客 2525

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

SpringBoot与Shiro整合

本文章介绍了Spring boot下shiro与thymeleaf、mybatis的整合过程,Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理

fangliangke的博客 6520

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

SpringBoot整合Shiro + JWT实现用户认证

SpringBoot整合Shiro + JWT实现用户认证   登录和用户认证是一个网站最基本的功能,在这篇博客里,将介绍如何用SpringBoot整合Shiro + JWT实现登录及用户认证   Shiro相较于Spring Security而言是一款轻量级的安全框架,使用它我们可以不在数据库中设计权限相关的表,如果我们只需要处理匿名可访问接口和登录后可访问接口,那么使用Shiro将会很方便。在之前的博客里,我介绍了Spring Security的使用,以及JWT的由来等,有需要的可以传送: 【全网最细致

qq_44709990的博客 4654

【SpringSecurity】springboot整合SpringSecurity实现登录校验与权限认证

关于安全方面的两个主要区域是“认证”和“授权”(或者说是访问控制),一般来说,Web应用的安全性包括用户认证(Authentication)和用户授权(Authorization)两个部分,这两点也是SpringSecurity重要核心功能。(1)用户认证指的是:验证某个用户是否为系统中的合法主体,也就是说用户能否访问该系统。用户认证一般要求用户提供用户名和密码。系统通过校验用户名和密码来完成认证过程。通俗点说就是系统认为用户是否能登录。(2)用户授权指的是验证某个用户是否有权限执行某个操作。在一个系统中,

weixin_44823875的博客 4390

SpringBoot整合Shiro实现登录认证和权限授权

Shiro是一个功能强大、灵活的,开源的安全框架,主要可以帮助我们解决程序开发中认证和权限等问题。基于拦截器做的权限系统,权限控制的粒度有限,为了方便各种各样的常用的权限管理需求的实现,我们有必要使用比较好的安全框架。 早期Spring security 作为一个比较完善的安全框架比较火,但是Springsecurity学习成本比较高,于是就出现了shiro安全框架,学习成本降低了很多,而且基本的功能也比较完善。 Shiro的架构 1、Subject:主题。被验证的对象,一般指的当前用户对象。但是不仅

ChuaWi98的博客 1097

SpringBoot整合Shiro登录认证和授权(附demo)

SpringBoot整合Shiro登录认证和授权 废话不多说,直接上代码: 代码有点多,想直接拿demo的直接拉到底 ps:demo忘了在哪拿的了,在他的基础上改了一些 步骤一:pom.xml导入依赖jar包 &amp;amp;lt;dependencies&amp;amp;gt; &amp;amp;lt;dependency&amp;amp;gt; &amp;amp;lt;groupId&amp;amp;gt;org.springfram

weixin_43538859的博客 3102
上一篇: ④【Shiro】Shiro框架进行敏感信息加密
下一篇: ⑥【Shiro】使多个自定义Realm规则生效。
.29.
.29. 2022 社区之星年度评选TOP 30 2022 社区之星年度评选TOP 30
博客等级 码龄5年 1万+粉丝 203原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

.29.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值