SpringBoot整合Shiro

【Shiro】使用org.crazycake依赖的ShiroConfig 整个Shiro专题中,这个部分是最早需要开始看的,主要先了解ShiroConfig都有哪些东西;由于这个项目使用的redis依赖是org.crazycake的shiro-redis,与我后面所用的不同,所以该部分只是简单的梳理了一下。PS:这里并没有使用到jwt,只是单纯的shiro+redis。因为之前的理解,全都作为注释写在了代码上,所以该篇的介绍主要都在代码中。整体来说,该部分内容并不难,如果感兴趣的大佬可以自行往下深入了解,如果多少还有点迷糊的小伙伴,消化消化继续往专题往下看😉。 阅读详情

(1)Shiro介绍

Shiro简介:Shiro是一个强大的简单易用的Java安全框架,主要用来更便捷的认证,授权,加密,会话管理。Shiro首要的和最重要的目标就是容易使用并且容易理解,通过Shiro易于理解的API,您可以快速、轻松地获得任何应用程序——从最小的移动应用程序最大的网络和企业应用程序。

Shiro的架构有三个主要概念:Subject, SecurityManager 和 Realms

Subject: 当前参与应用安全部分的主角。可以是用户,可以试第三方服务,可以是cron 任务,或者任何东西。主要指一个正在与当前软件交互的东西。所有Subject都需要SecurityManager,当你与Subject进行交互,这些交互行为实际上被转换为与SecurityManager的交互。

SecurityManager:安全管理员,Shiro架构的核心,它就像Shiro内部所有原件的保护伞。然而一旦配置了SecurityManager,SecurityManager就用到的比较少,开发者大部分时间都花在Subject上面。当你与Subject进行交互的时候,实际上是SecurityManager在背后帮你举起Subject来做一些安全操作。

Realms: Realms作为Shiro和你的应用的连接桥,当需要与安全数据交互的时候,像用户账户,或者访问控制,Shiro就从一个或多个Realms中查找。Shiro提供了一些可以直接使用的Realms,如果默认的Realms不能满足你的需求,你也可以定制自己的Realms。

(2)SpringBoot中使用Shiro

(1)环境的配置

这里连接数据库来进行账户名,密码的比对,采用mybatis框架

 <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-spring</artifactId>
            <version>1.4.1</version>
        </dependency>
 <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.0</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
   <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.12</version>
        </dependency>


        <dependency>
            <groupId>com.github.theborakompanioni</groupId>
            <artifactId>thymeleaf-extras-shiro</artifactId>
            <version>2.0.0</version>
        </dependency>

 

 

(2)pojo实体类,service层,mapper及相关配置文件xml的编写

(1)pojo层:

这里要和数据库中的字段相对应

package com.csh.springbootshiro.pojo;


import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class User {
    private int id;
    private String username;
    private String password;
    private String perms;
}

 相对应的数据库:

 (2)mapper及配置文件

package com.csh.springbootshiro.mapper;


import com.csh.springbootshiro.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;

@Mapper
@Repository
public interface UserMapper {

    public User findbyname(String name);


}

 对应的xml文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.csh.springbootshiro.mapper.UserMapper">
    <select id="findbyname" parameterType="String" resultType="User">
        select * from person where username=#{name}
    </select>

</mapper>

 (3)service层

package com.csh.springbootshiro.service;

import com.csh.springbootshiro.pojo.User;

public interface UserService {

    public User findbyname(String name);


}

 

package com.csh.springbootshiro.service;

import com.csh.springbootshiro.mapper.UserMapper;
import com.csh.springbootshiro.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;


@Service
public class UserServiceImpl implements UserService{

    @Autowired
    UserMapper userMapper;

    @Override
    public User findbyname(String name) {
       return userMapper.findbyname(name);
    }
}

(3)视图控制层(要有账户密码错误的反馈信息)和shiro配置类的编写

ShiroConfig配置类的编写:

package com.csh.springbootshiro.config;


import at.pollux.thymeleaf.shiro.dialect.ShiroDialect;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;

@Configuration
public class ShiroConfig {
    //创建 ShiroFilterFactoryBean


    @Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean(@Qualifier("defaultWebSecurityManager") DefaultWebSecurityManager defaultWebSecurityManager)
    {
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();

        shiroFilterFactoryBean.setSecurityManager(defaultWebSecurityManager);
        /*
添加Shiro内置过滤器,常用的有如下过滤器:
anon: 无需认证就可以访问
authc: 必须认证才可以访问
user: 如果使用了记住我功能就可以直接访问
perms: 拥有某个资源权限才可以访问
role: 拥有某个角色权限才可以访问
*/

        HashMap<String, String> map = new HashMap<>();//这里进行的是每个url的访问权限限制
//        map.put("/user/add","authc");
//        map.put("/user/update","authc");

        map.put("/user/add","perms[user:add]");
        map.put("/user/update","perms[user:update]");
        shiroFilterFactoryBean.setFilterChainDefinitionMap(map);
        shiroFilterFactoryBean.setLoginUrl("/tologin");//这里是点击登录是发送一个请求来到登录界面
        shiroFilterFactoryBean.setUnauthorizedUrl("/noauth");//无权访问是发送一个请求来到指定界面
        return shiroFilterFactoryBean;
    }
   //创建 DefaultWebSecurityManage

    @Bean
    public DefaultWebSecurityManager defaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm)
    {
        DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager();
        defaultWebSecurityManager.setRealm(userRealm);
        return defaultWebSecurityManager;
    }



    // 创建 realm 对象,在建个类来继承AuthorizingRealm这个类
    @Bean
    public UserRealm userRealm()
    {
        return new UserRealm();
    }

    @Bean
    public ShiroDialect getShiroDialect(){
        return new ShiroDialect();
    }

}

 UserReaml类:

package com.csh.springbootshiro.config;

import com.csh.springbootshiro.pojo.User;
import com.csh.springbootshiro.service.UserService;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.*;
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 org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;



public class UserRealm extends AuthorizingRealm {

    @Autowired
    UserService userService;

    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        System.out.println("执行了=>授权逻辑PrincipalCollection");
        SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
        Subject subject = SecurityUtils.getSubject();//总的来说,SecurityUtils.getSubject()是每个请求创建一个Subject, 并保存到ThreadContext的resources(ThreadLocal<Map<Object, Object>>)变量中,也就是一个http请求一个subject,并绑定到当前线程
        User user = (User) subject.getPrincipal();//SecurityUtils.getSubject().getPrincipal()获取封装的用户信息
        subject.getSession().setAttribute("loginuser",user);//登录之后才会显示相关的页面资源,游客访问的话只有一个登录按钮
        simpleAuthorizationInfo.addStringPermission(user.getPerms());
        return simpleAuthorizationInfo;
    }

    @Override
    //这里是在登录界面进行的
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        //AuthenticationToken authenticationToken拿到的是视图控制层传来的,UsernamePasswordToken 是用来存储用户和密码的
        System.out.println("执行了=>认证逻辑AuthenticationToken");
        UsernamePasswordToken usernamePasswordToken= (UsernamePasswordToken) authenticationToken;
        User user = userService.findbyname(usernamePasswordToken.getUsername());//在数据库中进行查找该用户
        if(user==null)
        {
            return null;//不存在该用户,返回null
        }
        else
        {
            return new SimpleAuthenticationInfo(user,user.getPassword(),"");//这里进行密码的判断,在视图控制层返回相关的信息
        }





    }
}

 controller:

package com.csh.springbootshiro.controller;


import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class MyController {

    @RequestMapping({"/","/index"})
    public String index(){
        return "index";
    }

    @RequestMapping("/tologin")
    public String login()
    {
        return "login";
    }

    @RequestMapping("/user/add")
    public String add()
    {
        return "user/add";
    }

    @RequestMapping("/user/update")
    public String update()
    {
        return "user/update";
    }


    @RequestMapping("/login")
    public String login(String username, String password, Model model)
    {
        //这里拿到了登录表单传来的用户名和密码
        Subject subject= SecurityUtils.getSubject();
        UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(username, password);
        try{
            subject.login(usernamePasswordToken);//来进行信息的匹配
            return "index";//登录成功
        }catch (UnknownAccountException e)//UnknownAccountException用户不存在,返回的null
        {
            model.addAttribute("msg","用户不存在");//反馈给前端的登录界面
            return "login";
        }catch (IncorrectCredentialsException e)//IncorrectCredentialsException 密码错误
        {
            model.addAttribute("msg","用户密码错误");
            return "login";
        }
    }

    @RequestMapping("/noauth")
    @ResponseBody
    public String noauth()
    {
        return "未经许可,不可授权";
    }

}

 (3)成果展示

 

 

 

 

SpringBoot之整合Shiro(最详细) pom.xml 2.3 创建前端页面 在webapp文件夹中创建index.jsp和login.jsp index.jsp login.jsp 2.4 配置视图信息 application.properties 2.5 解决IDEA冲突问题 JSP 与IDEA 与SpringBoot存在一定的不兼容,修改此配置即可解决 pom.xml 3.2 自定义Realm 在shiro文件夹下创建realm文件夹 3.3 Shiro配置 在config文件夹中创建ShiroConfig.java 3.4 启动测试 输入 阅读详情

相关推荐

Spring Boot整合Shiro

记录一次简单易懂的Spring Boot整合Shiro的过程,实现用户认证、授权、密码加密、权限管理功能。

Rhine 1万+

【SpringBoot整合系列】SpringBoot整合Shiro——权限控制

SpringBoot整合Shiro权限控制

低调做人,低调编码,神码都是浮云 2450

一篇文章带你搞定 SpringBoot 整合 Shiro

文章目录一、Shiro 和 SpringSecurity 比较二、原生的整合1. 环境搭建2. 创建 Realm3. 配置 ShiroConfig4. 配置 Controller三、使用 Shiro Starter 实现1. 环境搭建2. 配置 ShiroConfig3. 配置 Shiro 信息 一、Shiro 和 SpringSecurity 比较 在 Spring Boot 中做权限管理,一般来说,主流的方案是 Spring Security ,但是,仅仅从技术角度来说,也可以使用 Shiro。 一般来

南淮北安的博客 2592

springboot----shiro集成

springboot中集成shiro相对简单,只需要两个类:一个是shiroConfig类,一个是CustonRealm类。 ShiroConfig类: 顾名思义就是对shiro的一些配置,相对于之前的xml配置。包括:过滤的文件和权限,密码加密的算法,其用注解等相关功能。 CustomRealm类: 自定义的CustomRealm继承AuthorizingRealm。并且重写父类中的doGetA...

likunpeng6656201的博客 268

从零到一:DAMASK与ABAQUS联合仿真的环境配置艺术

本文详细介绍了在Ubuntu 16.04系统中配置DAMASK与ABAQUS2017联合仿真环境的完整流程,涵盖系统基础环境搭建、Python科学计算环境构建、DAMASK核心安装与配置,以及ABAQUS集成与联合调试。通过实战案例和高级调试技巧,帮助用户快速掌握有限元分析中的晶体塑性模拟技术。

weixin_29253711的博客 851

复用浏览器之跳过扫码登录

复用浏览器 1、通过命令启动浏览器:chrome --remote-debugging-port=9222(前提是退出所有的chrome浏览器) 2、启动浏览器之后,在地址栏输入127.0.01:9222,成功复用如下图所示:

qq_43911915的博客 2032

Spring Boot整合Apache Shiro权限认证框架(基础篇)

本文详细介绍了在SpringBoot项目中整合Apache Shiro实现认证和授权的完整流程。主要内容包括:1)创建SpringBoot项目并添加Shiro依赖;2)配置数据库和用户表;3)实现公共响应类和异常处理;4)创建Shiro核心组件(Realm、配置类);5)实现登录认证功能;6)通过权限控制实现接口访问限制。文章提供了完整的代码示例,包括前端页面交互和后端接口实现,并演示了权限验证效果。通过本文可以快速掌握Shiro在SpringBoot中的基本应用,为项目添加安全控制层。

沐雨橙风ιε的博客 1万+

LSTM预测股票数据---数据预处理

# 导入相应的模块 import pandas as pd import numpy as np import matplotlib.pyplot as plt import tensorflow as tf # 获取训练集 def get_train_data(data,batch_size = 60 ,time_step = 20,train_begin = 0,train_end = 58...

qq_35358021的博客 3358

【SpringBoot】Spring Boot 整合 Shiro

在 Spring Boot 中做权限管理,一般来说,主流的方案是 Spring Security ,但是,仅仅从技术角度来说,也可以使用 Shiro。 今天松哥就来和大家聊聊 Spring Boot 整合 Shiro 的话题! 一般来说,Spring Security 和 Shiro 的比较如下: Spring Security 是一个重量级的安全管理框架;Shiro 则是一个轻量级的安全管理框架 Spring Security 概念复杂,配置繁琐;Shiro 概念简单、配置简单 Spring S

to_real的博客 500

ESP32之 ESP-IDF + Clion 开发环境搭建(二)—— Linux版

本文介绍了 Linux 下,使用Clion IDE 用官方 ESP-IDF 开发包进行 ESP32 开发的环境搭建

Augtons 的博客 6095

ISO21434 组织网络安全管理(二)

为了实现网络安全工程,该组织建立并维护网络安全治理和网络安全文化,包括网络安全意识管理、能力管理和持续改进。这涉及到指定针对本文档的目标进行独立审计的特定于组织的规则和过程。 为了支持网络安全工程,该组织实施了网络安全的管理系统,包括管理工具和应用质量管理系统。

qq_42357877的博客 1322

Spring Boot整合Shiro + Springboot +vue

目录 02 Spring Boot整合Shiro p1.shiro概述 1 什么是Shiro 2 Shiro核心组件 p2.Shiro实现登录认证 AccountRealm.java QueryWrapper 类名和表名是一一对应的 mapper报错解决 测试 pom.xml p3.Shiro实现请求授权 配置类 ShiroConfig **编写认证和授权规则: controller p4.Shiro整合Thymeleaf --认证完成,开始授权 13:52

weixin_41290863的博客 4042

深度学习框架对比:AI开发如何选择

你是否遇到过这样的困惑:想做一个图像分类模型,朋友推荐PyTorch;公司要部署智能客服,同事说用TensorFlow;想快速验证想法,学长又提到Keras……深度学习框架种类繁多,功能重叠却各有侧重。本文将覆盖主流框架(PyTorch/TensorFlow/Keras/JAX/MXNet等),从开发者真实需求出发,总结选择框架的核心维度。本文将按照“认识框架→对比特性→实战选择”的逻辑展开:先通过生活比喻理解各框架特点,再用代码对比核心功能,最后结合真实场景给出选择建议。动态计算图。

AI 领航者的博客 1162

Springboot整合shiro

是一款主流的Java安全框架,不依赖任何容器,可以运行在Java SE和Java EE项目中,它的主要作用是对访问系统的用户进行身份认证、授权、会话管理、加密等操作。Shiro 就是用来解决安全管理的系统化框架。Shiro是基于session的身份认证和访问控制框架。RBAC是Role-Based Access Control(基于角色的访问控制)的缩写。它是一种广泛应用于安全管理中的访问控制模型。RBAC模型通过授予用户不同的角色,并将角色与权限进行关联,来管理对资源的访问。

chao的博客 2797

【nvidia-B200 生产环境】NVIDIA 570.124.06+Cuda12.8 Ubuntu22.04 nccl-test 一键部署脚本(免修改复制即用)

目录1. 初始化与日志记录2. 安装基础工具与配置更新3. NVIDIA 驱动安装 570.124.064. 安装 Mellanox OFED 24.10-2.1.8.05. 安装 CUDA 12.86. 安装 NCCL 和测试7. 配置 rc.local 和其他优化8. B200 单独步骤9. 最终测试与重启10. 完整生产脚本,复制即可直接使用总结 功能: 设置日志目录和日志文件路径。 使用 命令将标准输出和错误输出同时写入日志文件和终端。 记录脚本开始时间,并计算开始的秒数

jundao1997的专栏 2794

【心电信号】基于多种滤波去除心电信号基线漂移含Matlab源码

1 简介 心电信号可以用来检测和诊断心脏疾病,心电信号在采集时经常受到呼吸活动、身体运动和皮肤与电极接触不良等影响,因此会产生基线漂移,基线漂移的存在会降低心电信号的质量。所以,在大多数心电信号处理中,包括心律失常的识别、心率变化分析和连续血压测量等,去除基线漂移成为了至关重要的一步。心电信号具有非平稳、非线性的特性,传统的去除心电信号中基线漂移的方法在对心电信号进行去噪时常因去噪过度或者不完全,容易造成大量非线性特征信息的丢失,从而破坏了心电信号本身的动力学特性,这给后续的心电信号信息分析带来了不利影响

qq_59747472的博客 2207

springboot整合shiro相关依赖和配置整理

springboot整合shiro 一、shiro快速开始 去github下载shiro,找到samples/quickstart文件夹。用idea打开它,点进shiro.ini文件。这个时候idea会提示下载插件,下载它。 二、新建一个spring boot项目复制如下依赖 这些都是我整合好的,版本的话你可以自己控制。 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mav...

weixin_44105802的博客 3070

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

SpringBoot之整合Shiro

本文主要内容:SpringBoot整合Shiro ###Shiro基本介绍 1.基本概念:Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理 2.Shiro的三大核心组件:Subject, SecurityManager和Realms 1. Subject:是一个安全术语,其基本意思是“当前的操作用户”,称之为“用户”并不准确,因为“用户”一词通常跟人相关,但是Subject也可以是第三方进程、后台帐户(Daemon Account)、定时作业(Corn Job)或其他类似事

Fortuneteller的博客 290

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Springboot整合Shiro框架入门

Springboot中集成Shiro框架1、快速开始demo2、Springboot集成Shiro2.1、环境搭建2.2、shiro的拦截2.3、shiro的认证2.4、整合mybatis2.5、shiro进行授权2.6、shiro整合thymeleaf 1、快速开始demo 来到shiro的官网:shiro官方网站: 下载官方在git仓库上提供的源码,下载后解压: 官方提供了在多种场景下使用的demo,等一下会用到sample里面的东西。下面直接按官方推荐的10分钟入门demo进行测试。 创建一

qq_42640067的博客 2152

老版QQ原生表情gif动态

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

SpringBoot与Shiro整合

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

fangliangke的博客 6520

springboot整合shiro配置不拦截特定页面_Spring Boot 整合 Shiro ,两种方式全总结!...

点击“牧码小子”关注,和众多大牛一起成长!关注后,后台回复 java ,领取松哥为你精心准备的技术干货!在 Spring Boot 中做权限管理,一般来说,主流的方案是 Spring Security ,但是,仅仅从技术角度来说,也可以使用 Shiro。今天松哥就来和大家聊聊 Spring Boot 整合 Shiro 的话题!一般来说,Spring Security 和 Shiro 的比...

weixin_31207903的博客 3925

SpringBoot学习(六)-SpringBoot整合Shiro

Apache Shiro是一个强大且易用的Java安全框架 可以完成身份验证、授权、密码和会话管理 Shiro 不仅可以用在 JavaSE 环境中,也可以用在 JavaEE 环境中

小孔靠得住的博客 654
上一篇: SpringBoot中Spring Security 的使用
下一篇: SpringCloud的简单介绍
jakeonil
博客等级 码龄5年 1万+粉丝 60原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

jakeonil

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

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

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

打赏作者

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

抵扣说明:

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

余额充值