Shrio 安全框架

news2024/11/27 12:34:32

目录

前言

1.介绍

2.整合 Shiro 到 Spring Boot

3.Shiro 相关配置

总结


前言

几乎所有涉及用户的系统都需要进行权限管理,权限管理涉及到一个系统的安全。Spring Boot 的安全框架整合方案中还有一个璀璨的明珠:Shrio。


1.介绍

Shiro是一款由Java 编写的安全框架,功能强大,入手容易。Shiro 提供了一套完的RABC模式的授权认证体系,可以对密码进行加密,并完成安全的会话管理。与SpringSecurity 相比显得功能较少,但是对于追求“小而美”的解决方案的开发者和项目来说Shiro使用起来更加得心应手。 

  1. 用于身份验证以及登录,检查用户是否拥有相应的角色权限。
  2. 进行权限验证,验证某个已登录认证的用户是否拥有某个具体的角色权限; 常的如:检验某个用户是否有对某些资源包括页面的访问和操作权限等。
  3. 进行会话管理,每当用户登录就是一次会话,在没有退出账号登录之前,用户的所有信息都在会话中存储。
  4. 对数据加密,保护数据的安全性,如密码加密存储到数据库,不是明文存储,更加安全。
  5. 对Web 支持,非常方便地集成到 Web 环境中
  6. 支持多线程并发验证。 

这里介绍 Shiro 的一些核心的概念,Shiro 主要由三部分组成: 

  1. Subject: 主体,外部应用会和 Subject 进行交互。Subject 会记录当前的用户,用在这里就是 Subject (主体),比如通过浏览器进行请求的用户。而 Subject 要通过 SecurityManager 进行认证授权。在代码层面,Subject 是一个定义了一些授权方法的接口 。
  2. Security Manager: 即安全管理器,它是 Shiro 的核心,将对所有的 Subject 进行安全管理。从代码层面上来说,Security Manager 是一个多继承接口,继承了Authenticator、Authorizer、SessionManager 这三个接口。
  3. Realm:是 Shiro 和安全应用之间的连接器,类似于一个安全相关的 DAO,在进行认证和授权时,Shiro 会从 Realm 中获取想要的数据

2.整合 Shiro 到 Spring Boot

新建一个 SpringBoot 项目 ,在 pom.xml 中添加如下配置:

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

3.Shiro 相关配置

在 applcation.yml 中编写相关配置。

shiro:
  # 开启 Shrio 配置,默认为 true
  enabled: true
  web:
    #开启 Shrio Web 配置,默认为 true
    enabled: true
  #配置登录地址,默认为"login.jsp"
  loginUrl: /login
  #配置登录成功地址 默认为 /
  successUrl: /index
  # 配置未获取授权默认跳转地址
  unauthorizedUrl: /unauthorized
  sessionManager:
  # 是否允许通过 Cookie,实现会话跟踪,默认为 true。
    sessionIdCookieEnabled: true
  #是否允许通过 URL 参数实现会话跟踪,默认为 true,如果网站支持 Cookie,可以关闭此选项
# thymeleaf
spring:
  thymeleaf:
   prefix: classpath:templates/
   suffix: .html
   mode: HTML
   encoding: UTF-8
   cache: false # 对于开发,最好禁用缓存

编写 ShiroConfig 文件,具体代码如下:

package org.example.config;

import org.apache.shiro.realm.Realm;
import org.apache.shiro.spring.web.config.DefaultShiroFilterChainDefinition;
import org.apache.shiro.spring.web.config.ShiroFilterChainDefinition;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.apache.shiro.realm.text.TextConfigurationRealm;
@Configuration
public class ShiroConfig {

    @Bean
    public Realm realm(){
        TextConfigurationRealm realm = new TextConfigurationRealm();
        realm.setUserDefinitions("freephp=123456,user\n admin=123456,admin");
        realm.setRoleDefinitions("user=read\n admin=read,write");
        return  realm;
    }
    @Bean
    public ShiroFilterChainDefinition shiroFilterChainDefinition(){
        DefaultShiroFilterChainDefinition chainDefinition = new DefaultShiroFilterChainDefinition();
        chainDefinition.addPathDefinition("/logout","logout");
        chainDefinition.addPathDefinition("/login","anon");//匿名访问
        chainDefinition.addPathDefinition("/doLogin","anon");//匿名访问
        chainDefinition.addPathDefinition("/**","authc");
        return chainDefinition;
    }
}

上面的代码中有两个方法,一个是 realm 方法,另一个是 shiroFilterChainDefinition 方法。realm 方法用于获取权限认证数据,例如此处存储了两个账号:freephp 和 admin。

然后再编写 Controller 文件,只做简单的逻辑判断,代码如下:

package org.example.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.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class UserController {
    @RequestMapping("/doLogin")
    public String doLogin(String username, String password, Model model){
        System.out.println("userName is"+username);
        UsernamePasswordToken token = new UsernamePasswordToken(username,password);
        Subject subject = SecurityUtils.getSubject();
        try {
            subject.login(token);
            return "index";
        }catch (AuthenticationException e){
            System.out.println(e.getCause());
            model.addAttribute("error","Username or Password is wrong!");
            return "login";
        }
    }
    @GetMapping("/admin")
    public String admin(){
        return "admin";
    }

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

}

上面的代码定义了三个接口,其中 doLogin 用于登录,使用 UsernamePasswordToken 类创建 token。然后根据账号和密码进行匹配判断,如果验证失败则返回 /dologin 页面并显示错误提示,如果验证成功则可以访问 index 页面。

登录页面和首页页面都需要单独编写,在 resources 目录下创建 templates 文件夹,然后分别创建 index.html 和 login.html。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
hi,test
</body>
</html>
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Login</title>
</head>
<body>
<form action="/doLogin" method="post">
    <label>username:</label>
    <input type="text" name="username"><br/>
    <label>password:</label>
    <input type="text" name="password"><br/>
    <div th:text>${error}</div>
    <input type="submit" value="登录"/>
 </form>
</body>
</html>

为了更好的加载上面的页面,编写一个 WebMvcConfig 来加载:

package org.example.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("index").setViewName("index");
        registry.addViewController("login").setViewName("login");
    }
}

访问之后,输入正确的账号和密码,则可以看到登录成功的页面,反之则提示登录失败。


总结

Shiro 的使用非常方便,只需实现最核心的 realm 定义和 shiroFilterChainDefinition 功能就可以很好地完成认证授权功能。除此之外,Shiro 还提供缓存功能,感兴趣的同学可以自行查阅官方文档进行学习。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1296110.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

除了Microsoft的账户密码之外,PIN也有满满的“安全感”,不复杂却更安全

本文介绍如何在Windows 11上更改你的PIN。本说明适用于所有Windows 11电脑&#xff0c;不考虑制造商&#xff08;戴尔、惠普、联想等&#xff09;。 如何在Windows 11上更改PIN 按照以下步骤在Windows 11上更改或创建电脑的PIN&#xff1a; 1、打开Windows设置。右键单击任务…

节省时间,提高效率:深入解析MyBatis Plus

1. MyBatis Plus 概述 将Mybatis 通用Mapper PageHelper 升级成 MyBatis Plus 1.1 简介 官网&#xff1a;https://baomidou.com/ 参考教程&#xff1a;https://baomidou.com/pages/24112f/ MyBatis-Plus&#xff08;简称 MP&#xff09;是一个 MyBatis 的增强工具&#…

记录 | 使用samba将ubuntu文件夹映射到windows实现共享文件夹

一、ubuntu配置 1. 安装 samba samba 是在 Linux 和 UNIX 系统上实现 SMB 协议的一个免费软件&#xff0c;由服务器及客户端程序构成。SMB&#xff08;Server Messages Block&#xff0c;信息服务块&#xff09;是一种在局域网上共享文件和打印机的一种通信协议。 sudo apt-…

解决 Xshell 无法使用 root 账户远程登录 Linux 的问题

文章目录 问题描述问题原因解决办法 笔者出问题时的运行环境&#xff1a; Red Hat Enterprise Linux 9.2 x86_64 Xshell 7 问题描述 笔者在新安装的 Red Hat Enterprise Linux 中发现一个问题。在 RHEL 安装完之后&#xff0c;无法在 Xshell 中使用 root 账户远程登录此 Lin…

光学式雨量监测站-雨量监测的得力助手

随着科技的发展&#xff0c;人们对天气的预测和监测越来越依赖现代化的设备。光学式雨量监测站作为一种雨量监测仪器&#xff0c;能够实现对降雨量的测量&#xff0c;为天气预报和气候研究提供数据支持。 一、光学式雨量监测站的工作原理 WX-YJ3 光学式雨量监测站主要利用光学…

软件测试卷王的自述,我难道真的很卷?

前言 前段时间去面试了一个公司&#xff0c;成功拿到了offer&#xff0c;薪资也从12k涨到了18k&#xff0c;对于工作都还没两年的我来说&#xff0c;还是比较满意的&#xff0c;毕竟一些工作3、4年的可能还没我高。 我可能就是大家说的卷王&#xff0c;感觉自己年轻&#xff…

探索AIGC未来:CPU源码优化、多GPU编程与中国算力瓶颈与发展

★人工智能&#xff1b;大数据技术;AIGC;Turbo;DALLE 3;多模态大模型&#xff1b;MLLM&#xff1b;LLM&#xff1b;Agent&#xff1b;Llama2&#xff1b;国产GPU芯片&#xff1b;GPU;CPU&#xff1b;高性能计算机&#xff1b;边缘计算&#xff1b;大模型显存占用&#xff1b;5G…

今日问题:解决最新Chrome和chromedriver版本对不上的问题

from selenium import webdriver #from .chrome.webdriver import WebDriver as Chrome from selenium.webdriver.common.by import By from time import sleep driver webdriver.Chrome()driver.get("https://www.baidu.com/") driver.maximize_window()#窗口最大化…

英文论文查重复率网址

大家好&#xff0c;今天来聊聊英文论文查重复率网址&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff1a; 英文论文查重复率网址 在撰写英文论文时&#xff0c;查重是确保论文原创性和质量的重要环节快码论文…

01.项目简介

开源数字货币交易所&#xff0c;基于Java开发的货币交易所 | BTC交易所 | ETH交易所 | 数字货币交易所 | 交易平台 | 撮合交易引擎。本项目基于SpringCloudAlibaba微服务开发&#xff0c;可用来搭建和二次开发数字货币交易所。 项目特色&#xff1a; 基于内存撮合引擎&#xf…

快速实现入门HarmonyOS开发

本文档适用于HarmonyOS应用开发的初学者。编写两个简单的页面&#xff0c;实现在第一个页面点击按钮跳转到第二个页面。开始前&#xff0c;请参考下载与安装软件、配置开发环境和运行HelloWorld&#xff0c;完成开发工具的安装和开发环境的配置。 开发Ability 概述&#xff1…

ZStack Cloud构建青州市中医院核心业务云平台

青州市中医院通过ZStack Cloud云平台构建云基础设施&#xff0c;实现对原有物理机和分布式存储平台的利旧和纳管&#xff0c;有效将HIS&#xff08;医院管理系统&#xff09;、PACS&#xff08;影像系统&#xff09;等核心业务系统进行统一管理&#xff1b;同时&#xff0c;借助…

批量AI人工智能写作软件下载【2024最新】

在当今数字化的浪潮中&#xff0c;人工智能技术为各行各业带来了颠覆性的变革。其中&#xff0c;AI在文案创作领域的应用尤为引人瞩目&#xff0c;而批量AI人工智能写作更是成为文案创作者们关注的热点。本文将深入探讨批量AI人工智能写作的概念、其在不同领域的应用&#xff0…

硬件开发笔记(十四):RK3568底板电路LVDS模块、MIPI模块电路分析、LVDS硬件接口、MIPI硬件接口详解

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/134634186 红胖子网络科技博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…

Windows故障排除 – 连接WiFi却无法上网

Windows故障排除 – 连接WiFi却无法上网 Windows Troubleshooting - Connecting WiFi but PC Cannot Browse Internet By JacksonML 有个同学买了一台崭新的D品牌游戏本&#xff0c;i7处理器&#xff0c;英伟达RTX系列独立显卡及15寸液晶显示器&#xff0c;可谓功能强大。但是…

做一个类似东郊到家预约按摩系统需要准备哪些资料?

开发预约按摩APP需要准备哪些资料&#xff1f; 一、开发前准备材料&#xff1a; 1&#xff0e;公司的营业执照&#xff1a;需要用这个公司来申请企业支付、做域名备案等。 2&#xff0e;域名、服务器&#xff1a;域名去万网注册&#xff0c;域名需要备案&#xff1b;前期服务器…

解决Idea右侧无Maven选项的问题

在创建 Spring / SpringBoot 项目的时候可能会遇到没有 Maven 选项的问题&#xff0c;如下图&#xff1a; 我们通常这样解决&#xff1a;

实时PPP提取电离层

1、使用RTMG-APP扣除卫星端和接收机端的频内偏差后的STEC和相位平滑伪距&#xff08;600历元初始化&#xff0c;因为相位平滑伪距累计电离层残差&#xff0c;一直平滑可能发散&#xff09;的STEC对比如下图&#xff1a; 2、1、使用RTMG-APP扣除卫星端和接收机端的频内偏差后的S…

042:el-table表格表头自定义高度(亲测好用)

第042个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使…

二叉树oj题总结

1.检查两颗树是否相同 https://leetcode.cn/problems/same-tree/ 分成子问题和结束条件 &#xff0c;这里用前序的思想解题&#xff08;先判断根&#xff0c;再左右子树&#xff09;&#xff0c;不然会很浪费时间。假如左右相等&#xff0c;最后根不同&#xff0c;白白比较了 …