Spring Boot2整合Shiro(1):身份认证

教你 Shiro 整合 SpringBoot,避开各种坑 最近搞了下 Shiro 安全框架,找了一些网上的博客文章,但是一到自己实现的时候就遇到了各种坑,需要各种查资料看源码以及各种测试。 那么这篇文章就教大家如何将 Shiro 整合到 SpringBoot 中,并避开一些小坑,这次实现了基本的登陆以及角色权限,往后的文章也讲解了其他的功能,如 《教你 Shiro + SpringBoot 整合 JWT》 附上源码:https://... 阅读详情

前言

本文主要介绍了在Spring Boot2项目中整合Shiro实现登录认证。本文假设读者已经对Shiro和基于RBAC的权限控制系统有了基本的认识。
本项目没有数据库,也就没有dao层,所有的用户和密码均在Service层采用硬编码。

特别提醒:因为代码块中的@符号在博客发布过程中会导致代码格式混乱,所以@都是用双斜杠注释了。

创建工程

通过idea的Spring Initializr新建工程spring-boot2-shiro-project,选择web模块即可。在项目根目录添加service、controller和config文件夹,项目目录如下图所示:
这里写图片描述

封装统一的返回值

这一步对于整合shiro不是必须的

为了在项目中返回统一的结果,我们新建一个泛型类,包含属性:结果代码code、结果信息message和结果数据data,其中data采用泛型,代码如下:

public class Result<T> {
    private ResultCodeEnum code;
    private String message;
    private  T data;

    public ResultCodeEnum getCode() {
        return code;
    }

    public Result() {
    }

    public Result setCode(ResultCodeEnum resultCode) {
        this.code = resultCode;
        return this;
    }

    public String getMessage() {
        return message;
    }

    public Result setMessage(String message) {
        this.message = message;
        return this;
    }

    public T getData() {
        return data;
    }

    public Result setData(T data) {
        this.data = data;
        return this;
    }
}

再新建一个枚举类ResultCodeEnum,列举所有的返回代码code:

public enum ResultCodeEnum {
    SUCCESS(200),//成功
    FAIL(400),//失败
    UNAUTHORIZED(401),//未认证(签名错误)
    NOT_FOUND(404),//接口不存在
    INTERNAL_SERVER_ERROR(500);//服务器内部错误

    public int code;

    ResultCodeEnum(int code) {
        this.code = code;
    }

    public int getCode() {
        return this.code;
    }
}

再建一个结果生成类ResultGenerator,减少重复代码,保证返回值的统一性

public class ResultGenerator {
    private static final String DEFAULT_SUCCESS_MESSAGE = "SUCCESS";

    //成功
    public static Result genSuccessResult() {
        return new Result()
                .setCode(ResultCodeEnum.SUCCESS)
                .setMessage(DEFAULT_SUCCESS_MESSAGE);
    }

    public static <T> Result<T> genSuccessResult(T data) {
        return new Result()
                .setCode(ResultCodeEnum.SUCCESS)
                .setMessage(DEFAULT_SUCCESS_MESSAGE)
                .setData(data);
    }

    public static Result genFailResult(String message) {
        return new Result()
                .setCode(ResultCodeEnum.FAIL)
                .setMessage(message);
    }

    public static Result genUnauthorizedResult() {
        return new Result()
                .setCode(ResultCodeEnum.UNAUTHORIZED)
                .setMessage("权限不足!");
    }
}

Hello World

新建IndexController

package top.zhaodongxx.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import top.zhaodongxx.result.Result;
import top.zhaodongxx.result.ResultGenerator;

/**
 * <P></P>
 *
 * @author zhaodong
 * @version v1.0
 * @email zhaodongxx@outlook.com
 * @since 2018/3/30 21:55
 */









@RestController
public class IndexController {

    @GetMapping("/helloworld")
    public Result helloWorld() {

        return ResultGenerator.genSuccessResult("helloworld");
    }
}

运行SpringBoot2ShiroProjectApplication.java即可启动该Spring Boot项目。
访问路径127.0.0.1:8080/helloworld
这里写图片描述
项目运行成功!

整合 Shiro

在Spring Boot2项目中整合Shiro主要分为四步

  • 导入Shiro
  • 创建Shiro配置文件,并在其中配置DefaultWebSecurityManager和ShiroFilterFactoryBean
  • 实现身份认证的具体逻辑Realm
  • 实现登录接口

导入 Shiro

Shiro提供了一个启动器来完成与 Spring Boot 的集成。

<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-spring-boot-starter</artifactId>
    <version>1.4.0</version>
</dependency>

配置 Shiro

因为本节只是介绍身份认证,所以只提供一个最简单的 Java Class 配置

package top.zhaodongxx.config;

import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.context.annotation.Bean;

/**
 * <P></P>
 *
 * @author zhaodong
 * @version v1.0
 * @email zhaodongxx@outlook.com
 * @since 2018/3/30 22:41
 */
@Configuration
public class ShiroConfig {
    /**
     * 自定义的Realm
     */
    @Bean(name = "myShiroRealm")
    public MyShiroRealm myShiroRealm(){
        MyShiroRealm myShiroRealm = new MyShiroRealm();
        return myShiroRealm;
    }
    @Bean
    public DefaultWebSecurityManager  securityManager(){
        DefaultWebSecurityManager securityManager =  new DefaultWebSecurityManager();
        设置realm.
        securityManager.setRealm(myShiroRealm());
        return securityManager;
    }
    @Bean(name = "shiroFilter")
    public ShiroFilterFactoryBean shiroFilterFactoryBean(DefaultWebSecurityManager securityManager) {
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        shiroFilterFactoryBean.setSecurityManager(securityManager);
        return shiroFilterFactoryBean;
    }
}

安全管理器DefaultWebSecurityManager是Shiro的核心模块,ShiroFilterFactoryBean用来配置需要被拦截的请求,被拦截下来的请求交给安全管理器管理。myShrioRealm在idea中现在还是红色的,因为我们还没有写。

自定义Shiro

新建一个服务,用来模拟从数据库中取出用户信息,


package top.zhaodongxx.service;

import org.springframework.stereotype.Service;

/**
 * @author zhaodong
 * @version v1.0
 * @email zhaodongxx@outlook.com
 * @since 2018/3/30 22:59
 */
@Service
public class ShiroService {

    public String getPasswordByUsername(String username){
        switch (username){
            case "liming":
                return "123";
            case "hanli":
                return "456";
            default:
                return null;
        }
    }
}

Realm 是控制认证和授权的核心部分,也是开发人员必须自己实现的部分。
自定义的Realm通过继承AuthorizingRealm类,实现它的两个方法:doGetAuthorizationInfo和doGetAuthenticationInfo实现自己的认证和授权逻辑,其中doGetAuthenticationInfo处理授权逻辑暂时不实现。

package top.zhaodongxx.shiro;

import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import top.zhaodongxx.service.ShiroService;

import javax.annotation.Resource;

/**
 *
 * @author zhaodong
 * @version v1.0
 * @email zhaodongxx@outlook.com
 * @since 2018/3/30 22:55
 */
public class MyShiroRealm extends AuthorizingRealm {

    @Resource
    public ShiroService shiroService;

    /**
     * 授权
     */
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
        return authorizationInfo;
    }

    /**
     * 登录认证
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        //获取用户账号
        String username = token.getPrincipal().toString();

        String password = shiroService.getPasswordByUsername(username);
        if (password != null) {
            AuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(
                    username,   //认证通过后,存放在session,一般存放user对象
                    password,   //用户数据库中的密码
                    getName());    //返回Realm名
            return authenticationInfo;
        }
        return null;
    }
}

实现登录接口

AuthenticationException是Shiro封装的异常,如果登录认证没有成功就会抛出这个异常。

package top.zhaodongxx.controller;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import top.zhaodongxx.result.Result;
import top.zhaodongxx.result.ResultGenerator;

/**
 *
 * @author zhaodong
 * @version v1.0
 * @email zhaodongxx@outlook.com
 * @since 2018/3/30 23:05
 */
@RestController
public class LoginController {
    @PostMapping("/doLogin")
    public Result doLogin(String username, String password) {

        Subject subject = SecurityUtils.getSubject();
        UsernamePasswordToken token = new UsernamePasswordToken(username, password);
        try {
            subject.login(token);
        } catch (AuthenticationException e) {
            token.clear();
            return ResultGenerator.genFailResult("登录失败,用户名或密码错误!");
        }
        return ResultGenerator.genSuccessResult("登录成功");
    }
}

测试

重新启动项目。

通过postman访问127.0.0.1:8080/doLogin?username=liming&password=1231,
登陆失败

这里写图片描述

访问127.0.0.1:8080/doLogin?username=liming&password=123,
登录成功
这里写图片描述

至此,通过Shiro实现了身份认证。

项目下载地址

参考资料

Spring Boot与Shiro整合全面指南 本文还有配套的精品资源,点击获取 简介:本指南详细介绍了如何将Apache Shiro安全框架与Spring Boot相结合,实现完整的权限管理和用户认证授权功能。通过整合步骤的详细说明,包括依赖引入、配置、编码实现认证授权逻辑、安全管理器配置以及前端集成等,旨在帮助开发者快速构建安全且高效的应用程序。文章还涵盖了认证流程、授权流程、异常处理、会话管理以及数据库设计等关键点... 阅读详情

相关推荐

深入解析达梦数据库核心技术:检查点、redo、undo、MVCC与内存缓存刷盘

MVCC 依赖 undo 日志:通过 undo 日志构建版本链,实现 “读不加锁”;刷盘依赖检查点:检查点批量清理脏页,redo 日志通过检查点释放空间;日志保障刷盘安全:redo 日志先行写入,确保未刷盘脏页可恢复;刷盘优化 MVCC 性能:优先刷冷区脏页,减少对高频访问数据的影响。例如,一个完整的 “查询 - 修改 - 提交 - 恢复” 流程中:查询时,MVCC 通过 undo 日志获取可见版本,无需等待锁;修改时,redo/undo 日志先记录,缓冲池生成脏页;

tangyuan12345678的博客 1415

Spring Boot2 整合 Shiro ,两种方式全总结!

前言:在 Spring Boot 中做权限管理,一般来说,主流的方案是 Spring Security ,但是,仅仅从技术角度来说,也可以使用 Shiro。 文章目录一、Spring Security 和 Shiro 的比较二、原生的整合2.1. 创建一个 Spring Boot 项目2.1. 加入 Shiro 相关的依赖2.2. 完整pom2.3. 自定义核心组件 Realm2.4. 配置 ...

Gblfy_Blog 685

BPMN2.0规范及流程引擎选型方案

本文主要简明扼要的介绍了BPMN2.0规范的内容,可让读者快速度的了解BPMN2.0所涵盖的主要内容和图形样式。也较为详细的阐述了如何绘制标准的流程图,以及在软件层面中如何实现业务流程功能,和技术选型。

比特桃 1万+

jeecgboot报错信息 Connection refused: no further information: /127.0.0.1:6379

jeecgboot报错信息 Connection refused: no further information: /127.0.0.1:6379 Caused by: io.lettuce.core*.RedisConnectionException*: Unable to connect to 127.0.0.1:6379 这么大个redis 没看见也是服了我自己了 记得启动Redis!!! 记得启动Redis!!! 记得启动Redis!!! 重要的事情说三遍!! ...

weixin_53603040的博客 2003

深入解析Apollo Lattice Planner:自动驾驶轨迹规划的核心算法与实践

本文深入解析了百度Apollo自动驾驶平台中的核心轨迹规划算法——Lattice Planner。文章详细阐述了其作为车辆“即时决策者”的工作原理,通过“采样-评估”的六步流程(Frenet坐标转换、状态采样、轨迹生成、硬约束过滤、代价函数打分及决策平滑),在复杂路况下实时规划出安全、舒适、高效的行驶轨迹。该算法是自动驾驶实现智能决策与精准控制的关键技术。

weixin_29090677的博客 829

芯片Tapeout前GDS Review | Calibre中如何切出gds中指定区域版图?

芯片Tapeout GDS Review 之Calibre中如何切出指定区域版图GDS

weixin_37584728的博客 1785

001 第一季SpringBoot2核心技术-基础入门:分类,概念,入门案例:主启动类、配置文件,bulid插件,自动配置原理:起步依赖、web依赖、包扫描、读取prop文件、热部署,boot项目

SpringBoot2学习路线说明 说明:SpringBoot2分为核心技术和响应式编程2大类。 SpringBoot2核心技术: SpringBoot2响应式编程: SpringBoot2核心技术 SpringBoot2响应式编程 SpringBoot2核心技术-基础入门 SpringBoot2核心技术-核心功能 ...

aa35434的博客 3058

Modbus通信从入门到精通_2_Modbus TCP通信详解及仿真(搭建ModbusTCP仿真环境:创建虚拟PLC并进行ModbusTCP通讯;寄存器与PLC中映射关系;适合理解如何编写上位机)

LocalPort”是PLC的端口,最终的设置如下图所示:(相关的设置都可以查看帮助文档)P#DB1.DBX0.0 BYTE28是以指针形式表示的DB1的DBX0.0开始(在使用的西门子Modbus tcp的程序块中设置的“MB_HOLD_REG”输出寄存器),其有28个字节(28个字节对应14个寄存器),4001是第一个寄存器,往后数14个即可。在上面的基础上,增加一个“DB1”的“组对象”,同时将“MW0”的组对象禁止(双击组对象,“Active”取消勾选),启动之后发现无法连接。

分享学习成长历程,Winter is coming! 1万+

Spring Boot2框架学习-基础入门

Spring Boot2框架学习-基础入门1. SpringBoot概念1.1. 什么是SpringBoot1.2. SpringBoot优点1.3. 微服务2. SpringBoot基础入门2.1. maven设置2.2. 入门案例2.2.1. 导入依赖2.2.2. 创建主程序2.2.3. 编写业务2.2.4. 测试和简化配置2.2.5. 简化部署3. Spring Boot的自动配置原理3.1. 依赖管理3.2. 自动配置3.3. 容器功能3.1.1. Configuration注解进行组件添加3.1.

Hide on bush 1380

【WRF数据介绍第二期】气象驱动场数据介绍及下载

【WRF数据介绍第二期】气象驱动场数据介绍及下载

WW、forever的博客 2160

2024年 Flutter 面试题大全(2024.6.28持续更新中)

2024年 Flutter 面试题大全(持续更新中)

Code Metaverse 6661

Spring Boot整合Shiro教程

Spring Boot整合Shiro教程 项目介绍 本项目是一个基于Spring Boot和Apache Shiro的安全框架整合示例。Apache Shiro是一个强大且灵活的开源安全框架,用于身份认证、授权、会话管理和加密。Spring Boot则是一个用于简化Spring应用初始搭建以及开发过程的框架。通过将两者结合,可以快速构建一个具备安全认证和授权功能的企业级应用。 项目快速启动 1. ...

gitblog_00326的博客 958

使用Simulink对固定翼无人机的自动起飞与降落进行仿真

本文介绍了基于Simulink的固定翼无人机自动起飞与降落控制系统设计方法。系统包含飞行器动力学模型、控制系统、环境模拟等模块,通过简化动力学方程描述无人机运动特性。详细说明了从创建模型、设置动力学方程、设计PID控制器(包括自动起飞和降落控制策略)到添加环境模拟的完整仿真流程。重点阐述了升降舵和发动机推力的控制律设计,以及性能评估要点。本方法可有效验证控制系统设计,优化飞行稳定性和安全性参数,为无人机自主控制提供仿真支持。

amy_mhd的博客 223

Spring Boot 整合 Shiro

Spring Boot 整合 Shiro 1. Shiro 简介 Apache Shiro 是一个强大的简单易用的 Java 安全框架,主要用来更便捷的认证、授权、加密、会话管理、与 Web 集成、缓存等; Shiro 使用起来小而简单; Shiro 依赖性低,不需要任何框架和容器,Shiro 不仅可以实现 Web 应用的权限管理,还可以实现 C/S 系统,分布式系统权限管理; Shiro 属于轻量框架。 2. Shiro 核心功能 1. 主要功能 Shiro 主要有三大功能模块: Subject:

beastars1的博客 258

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Spring Boot学习之Shiro

Apache Shiro 是一个Java 的安全(权限)框架。Shiro可以完成,认证,授权,加密,会话管理,Web集成,缓存等。Shiro官网。

缘友一世的博客 2711

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Spring Boot整合Shiro

1.Shiro 什么是Shiro 是一款主流的Java安全框架,不依赖任何容器,可以运行在Java SE和Java EE项目中,它的主要作用是对访问系 统的用户进行身份认证、授权、会话管理、加密等操作。 Shiro就是用来解决安全管理的系统化框架。 2 Shiro核心组件 用户、角色、权限 会给角色赋予权限,给用户赋予角色 1、UsernamePasswordToken, Shiro 用来封装用户登录信息,使用用户的登录信息来创建令牌Token。 2、SecurityManager, Shiro 的核心部分

liyanfang0310的博客 352

精雕软件(JDpaint) 5.5 绿色版

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

Spring Boot 整合Shiro

Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。

一米九的博客 405

spring boot整合shiro实现登录认证授权你

Java中使用shiro来进行来进行登录时的认证授权

qq_59776041的博客 4655

SpringBoot整合Shiro框架

目录 1、Shiro简介 1.1、Shiro是什么? 1.2、有哪些功能? 1.3、Shiro架构(外部) 2、快速入门(QuickStartShiro) 2.1、项目结构 2.2、导入shiro依赖,这是我的pom所有依赖。(pom.xml) 2.3、相关配置文件 (1)log4j.properties——官网 (2)shiro.ini——官网 (3)启动类 Quickstart——官网 3、SpringBoot集成Shiro框架 3.1SpringBoot整合Shir...

koko创作 8906

spring boot 整合shiro权限控制

spring boot 整合shiro权限控制。 这个项目demo做了精简整合,去掉一些重复不需要的代码,这个模块可以直接嵌入你的springboot项目系统中。

asdluoliu的博客 718

Spring Boot整合Shiro + JSP教程(用户认证,权限管理,图片验证码)

在此首先感谢**编程不良人**up主提供的视频教程 代码都是跟着up的视频敲的,遇到的一些问题也是通过优快云博主提供的教程解决的,在此也感谢那些提供bug解决方案的前辈们~ 项目完整代码已经发布到github上面,有需要的朋友可以自取 1.权限管理 1.1 什么是权限管理 ​ 涉及到用户参与的系统都要涉及权限管理,权限管理属于系统安全范畴。权限管理实现的是对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源。 ​ 权限管理包括 用户身份认证 和 授权 两部分.

Coding for freedom 1218

Spring Boot整合Shiro实现用户身份认证和权限认证

至于Shiro的概念和功能就不再过多赘述,这些在网上都能查到。我们直接进入整合Shiro的正题。 一、项目结构 二、数据库表准备 准备五张表:用户表(user_tb)、角色表(role_tb)、权限表(permissions_tb)、用户角色表(user_role)、角色权限表(role_permissions)。 我们往表中添加三个用户信息,两个用户角色admin和user,两种权限read和edit。 其中第一个用户分配admin角色,分配read、edit权限。 第二个用户分配user.

齐天小圣^O^ 的博客 1389

Shiro - 整合 Nacos 实现 Shiro 配置的动态刷新

Shiro 整合 Nacos 实现动态配置刷新 🔄 本文介绍了如何将 Apache Shiro 与 Nacos 配置中心集成,实现权限规则的热更新。主要内容包括: 背景分析:传统 Shiro 静态配置方式的局限性,如运维成本高、响应延迟等问题 解决方案:利用 Nacos 的配置管理能力实现动态权限控制 技术实现: 搭建 Spring Boot + Shiro 基础项目 设计动态配置监听机制 实现 Shiro 过滤器链的实时刷新 核心优势: 无需重启即可生效权限变更 支持多环境差异化配置 降低安全策略调整的

千淘万漉虽辛苦,吹尽狂沙始到金 1万+

Spring Boot2篇 - 十、Spring Boot 整合Shiro

十、Spring Boot 整合Shiro 10.1 什么是Shiro 10.1.1 Shiro简介 Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。 10.1.2 Shiro功能 基本功能如下 : Authentication:身份认证 / 登录,验证用户是不是拥有相应的身份; Authorization:授权,即权限验证,验证某个已

cV展示的学习园 333
上一篇: MySQL Workbench中PK,NN,UQ,BIN,UN,ZF,AI,G字段类型标识说明
下一篇: 使用Kettle实现数据实时增量同步
zhaodongxx
博客等级 码龄12年 116粉丝 26原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值