Shrio 安全框架

目录

前言

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 配置,默认为 trueenabled: trueweb:#开启 Shrio Web 配置,默认为 trueenabled: true#配置登录地址,默认为"login.jsp"loginUrl: /login#配置登录成功地址 默认为 /successUrl: /index# 配置未获取授权默认跳转地址unauthorizedUrl: /unauthorizedsessionManager:# 是否允许通过 Cookie,实现会话跟踪,默认为 true。sessionIdCookieEnabled: true#是否允许通过 URL 参数实现会话跟踪,默认为 true,如果网站支持 Cookie,可以关闭此选项
# thymeleaf
spring:thymeleaf:prefix: classpath:templates/suffix: .htmlmode: HTMLencoding: UTF-8cache: 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 {@Beanpublic 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;}@Beanpublic 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 {@Overridepublic void addViewControllers(ViewControllerRegistry registry) {registry.addViewController("index").setViewName("index");registry.addViewController("login").setViewName("login");}
}

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


总结

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

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

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

相关文章

信道复用技术

目录 一、频分复用FDM&#xff08;Frequency Division Multiplexing&#xff09; 二、波分复用 WDM&#xff08;Wavelength Division Multiplexing&#xff09; 三、时分复用TDM&#xff08;Time Division Multiplexing&#xff09; 四、统计时分复用 STDM&#xff08;Statisti…

双通道5V高细分步进电机驱动芯片应用于摇头机,X,Y控制,聚焦控制,CAMERA云台控制等产品上的芯片选型分析

双通道5V高细分步进电机驱动芯片GC6106&#xff0c;GC6107&#xff0c;GC6119&#xff0c;GC6151&#xff0c;GC6236&#xff0c;GC6225&#xff0c;GC6129&#xff0c;电压范围3~5.5V&#xff0c;最大持续电流可达0.6A左右。可应用于摇头机&#xff0c;X,Y控制&#xff0c;聚焦…

安装vue环境

1.Hello Vue.js <script src"https://cdn.staticfile.org/vue/2.7.0/vue.min.js"></script>/*引入js文件 */ <script> new Vue({ /* 创建一个对象&#xff0c;两个属性。 */ el: #app, data: { message: Hello Vue.js! }, methods: { details: f…

C++使用模板的注意事项

两点注意事项 自动推导类型&#xff0c;必须推导出一致的数据类型T&#xff0c;才可以使用模板必须要确定出T的数据类型&#xff0c;才可以使用 #include<iostream> using namespace std;//第一点必须一致的数据类型 template <class T> void myswap(T& a, T…

基于AIS数据的船舶密度计算与规律研究

参考文献&#xff1a;[1]陈晓. 基于AIS数据的船舶密度计算与规律研究[D].大连海事大学,2021.DOI:10.26989/d.cnki.gdlhu.2020.001129. 谢谢姐姐的文章&#xff01; 网格化AIS数据 网格化 AIS 数据是处理和分析船舶轨迹数据的一种有效方法&#xff0c;特别是当涉及到密度计算和…

C++_对C数据类型的扩展

结构体 c中定义结构体变量&#xff0c;可以省略struct关键字 c结构提重可以直接定义函数&#xff0c;谓之成员函数&#xff08;方法&#xff09; #include <iostream> using namespace std; struct stu {int num;char name[24];void price(void) {cout << "…

Vue3+Antd实现弹框显示内容并加入复制按钮

使用Vue3antd实现点击弹框出现内容并可复制内容的功能&#xff1a; HTML部分&#xff1a; <a-button type"primary" click"showModel">打开弹框 </a-button><!-- ok 是弹框中确定按钮的操作&#xff0c;cancel 是弹框中取消按钮的操作 --…

Redis数据已经删除了,为什么内存占用还是很高?

Redis数据已经删除了&#xff0c;为什么内存占用还是很高&#xff1f; Redis做了数据删除操作&#xff0c;为什么使用top命令时&#xff0c;还是显示Redis占了很多内存&#xff1f; 没做相关功课的人觉得这个问题有问题&#xff0c;删了数据还说占着内存&#xff0c;面试官不…

【学一点儿前端】真机调试本地公众号网页项目

前言 微信公众号网页开发的真机调试一直是很头疼的事情。 原因一 微信公众号配置的JS安全域名只有三个&#xff0c;一个大中型的公众号这三个JS安全域名都是生产的域名&#xff0c;不可能预留域名用于开发和调试。 原因二 在微信里面只有访问正确的安全域名才能调用wx.config用…

vuepress-----18、图片缩放

图片引入两种方式 地址 # 图片缩放插件 # 实战 md文件引入图片 <img class"zoom-custom-imgs" :src"$withBase(/favicon.ico)" alt"favicon">安装配置插件 vuepress/medium-zoom: {selector: img.zoom-custom-imgs,},效果展示

AI:89-基于卷积神经网络的遥感图像地物分类

🚀 本文选自专栏:人工智能领域200例教程专栏 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的核心代码,详细讲解供大家学习,希望可以帮到大家。欢迎订阅支持,正在不断更新…

MVCC是什么

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一波电子书籍资料&#xff0c;包含《Effective Java中文版 第2版》《深入JAVA虚拟机》&#xff0c;《重构改善既有代码设计》&#xff0c;《MySQL高性能-第3版》&…

ChibiOS简介1/5

ChibiOS简介1/5 1. 源由2. ChibiOS基础知识1/52.1 Chapter 1 - Introduction2.1.1 Priciple&#xff08;设计原则&#xff09;2.1.2 Fundamental requirements&#xff08;基本需求&#xff09; 2.2 Chapter 2 - Real Time Systems Concepts2.2.1 System&#xff08;系统&#…

flutter TextPainter 的用法

本文章基于 Flutter 3.16.2 Dart SDK 3.2.2。 TextPainter 是 Flutter 中用于在 Canvas 上绘制文本的类。它允许您在自定义的 CustomPainter 中使用 drawText 方法来绘制文本&#xff0c;并可以控制文本的位置、颜色、字体等属性。 import package:flutter/material.dart;cla…

【NEON】学习资料汇总

一、资料链接 Guide &#xff1a; http://www.heenes.de/ro/material/arm/DEN0018A_neon_programmers_guide_en.pdf csdn博文1&#xff0c;基础案例&#xff1a; https://blog.csdn.net/kakasxin/article/details/103912832? csdn博文2&#xff0c;内部函数&#xff1a; ht…

css 输入框动态特效

先上图 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>css 输入框动效</title><style>.inputBox {position: relative;width: 250px;}.inputBox input {width: 100%;padding: 10px…

使用git push太慢怎么办

使用git push太慢怎么办 修改host文件&#xff1a; windows 的路径应该在 C:\Windows\System32\drivers\etc\hosts 在host文件的最后一行加上 151.101.72.249 github.global.ssl.fastly.nethost不允许修改就复制一份&#xff0c;修改好了再替换掉&#xff0c;可能会让你输入…

028:简单的foreach

028:简单的foreach 总时间限制: 1000ms 内存限制: 65536kB 描述 编写MyForeach模板&#xff0c;使程序按要求输出 不得编写 MyForeach函数 #include <iostream> #include <string> using namespace std; // 在此处补充你的代码 void Print(string s) {cout <…

【面试经典150 | 二叉树】对称二叉树

文章目录 写在前面Tag题目来源解题思路方法一&#xff1a;递归方法二&#xff1a;迭代 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题涉及到的…

第6讲、Hyper-V体系结构和相关管理程序文件及服务:

1、Hyper-V的体系结构 1、CPU能力在服务器虚拟化实现中扮演着一个重要角色&#xff0c;Intel/AMD型号的CPU定义了一些权限 级别&#xff0c;称为ring。在传统模型中&#xff0c;ring0级别最高权限最大。Windows内核和设备驱动程序 使用这个级别…