【Java漏洞】Shiro 漏洞:SpringBoot 整合 Shiro+IniRealm

news/2024/12/3 7:25:47/文章来源:https://www.cnblogs.com/o-O-oO/p/18583214

IniRealm

如果我们想在SpringBoot中进行使用Shiro, 那么我们肯定是需要围绕如下环节进行研究.

创建 pom.xml:

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.3</version>
</parent><dependencies><dependency> <!-- 导入 shiro-spring, 会自动引入 shiro-core, shiro-web --><groupId>org.apache.shiro</groupId><artifactId>shiro-spring</artifactId><version>1.4.1</version></dependency><dependency> <!-- springboot 没有提供对 shiro 的自动配置, shiro 的自动配置需手动完成 --><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency> <!-- 引入 thymeleaf 模板引擎 --><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency> <!-- 引入 lombok --><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency> <!-- 引入 druid-spring-boot-starter, 自动配置 Druid --><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.17</version></dependency><dependency> <!-- 会自动引入 mybatis, mybatis-spring, spring-boot-starter-jdbc --><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.2</version></dependency><dependency> <!-- 引入 mysql 扩展 --><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version></dependency><dependency> <!-- 引入 SpringBoot 测试依赖 --><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency>
</dependencies>

创建/resources/application.yml:

server: # 设置启动端口port: 80spring:thymeleaf: # 设置 thymeleaf 模板存放位置prefix: "classpath:/templates/"suffix: ".html"datasource:druid: # 设置数据库连接url: jdbc:mysql://localhost:3306/shiro?useSSL=true&characterEncoding=utf-8&useUnicode=trueusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Drivermvc:static-path-pattern: /static/** # 设置静态资源访问路径web:resources:static-locations: classpath:/static/** # 设置静态资源保存目录mybatis:mapper-locations: classpath:mappers/*.xml # 设置 mybatis mapper文件存放位置, 用于扫描type-aliases-package: com.heihu577.bean # 设置 JavaBean 存放位置定义com.heihu577.MainApp类:@SpringBootApplication
public class MainApp {public static void main(String[] args) {ConfigurableApplicationContext ioc = SpringApplication.run(MainApp.class, args);}
}

因为Shiro需要我们手动配置, 所以我们定义com.heihu577.config.ShiroAutoConfiguration类如下:

@Configuration
public class ShiroAutoConfiguration {@Beanpublic IniRealm getIniRealm() { // 先使用 IniReal 做演示IniRealm iniRealm = new IniRealm("classpath:shiro.ini");/* classpath:shiro.ini 文件内容如下:[users]heihuUser=heihuPass,sellerhacker=123456,ckmgradmin=admin888,admin[roles]seller=order-add,order-del,order-listckmgr=ck-add,ck-del,ck-listadmin=**/return iniRealm;}@Beanpublic SecurityManager getSecurityManager(IniRealm iniRealm) {DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager();defaultWebSecurityManager.setRealm(iniRealm); // 要想完成校验, 需要 Realm// SecurityUtils.setSecurityManager(defaultWebSecurityManager); // 设置 SecurityUtils 下的 SecurityManagerreturn defaultWebSecurityManager;}@Beanpublic ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); // 准备一个拦截器, 用于拦截用户请求shiroFilterFactoryBean.setSecurityManager(securityManager); // 进行数据校验的核心是 SecurityManager, 所以这里需要配置 SecurityManager// 配置拦截规则...HashMap<String,String> filterMap = new HashMap();filterMap.put("/", "anon"); // anon 匿名用户可访问filterMap.put("/login", "anon"); // 对 login.html 不拦截filterMap.put("/register", "anon"); // 对 register.html 不拦截filterMap.put("/user/login", "anon");filterMap.put("/**", "authc"); // authc 认证用户可访问filterMap.put("/static/**", "anon"); // 对 /static/** 都不拦截// user: 使用 RememberMe 用户可访问// perms: 对应权限可访问// role: 对应角色可访问shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap); // 将规则设置进来shiroFilterFactoryBean.setLoginUrl("/login"); // 设置默认的登录界面shiroFilterFactoryBean.setUnauthorizedUrl("/"); // 设置未授权访问的跳转URLreturn shiroFilterFactoryBean;}
}

随后定义com.heihu577.controller.PageController && com.heihu577.controller.UserController控制器如下:


@Controller
public class PageController {@RequestMapping(value = {"/"})public String index() {return "index"; // 跳转 thymeleaf 下的 index.html 模板引擎}@RequestMapping("/login")public String login() {return "login";}
}@Controller
@RequestMapping("/user")
public class UserController {@Resourceprivate UserServiceImpl userService; // 自动注入 userService@PostMapping("/login")public String login(String username, String password) {try {userService.login(username, password);System.out.println("登陆成功!");return "index"; // 登录成功去 index 页面.} catch (Exception e) { // 使用 try-catch 进行判断登录状态System.out.println("登录失败!");return "login"; // 登录失败去 login 页面, 若想要注入数据, 使用 Model 即可}}
}

定义两个模板如下:

<!-- index.html -->
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>主页</title>
</head>
<body><h1>Hello World!</h1>
</body>
</html>
<!-- login.html -->
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>登录表单</title>
</head>
<body><form action="/user/login" method="post">u: <input type="text" name="username"/><br>p: <input type="password" name="password"/><br><input type="submit"></form>
</body>
</html>

定义com.heihu577.service.UserServiceImpl如下:


@Service
public class UserServiceImpl {public void login(String username, String password)  throws Exception { // 登陆失败会抛出异常, 登陆成功没返回值UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(username, password);Subject subject = SecurityUtils.getSubject();subject.login(usernamePasswordToken); // 发送登录请求.}
}

最终可以实现用户登录, 判断账号密码是否正确. 当前为了学习方便, 使用了 IniRealm 进行演示, 其中思路如下.

而如果我们想要使用JdbcRealm, 那么我们则需要配置相应的Realm.

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

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

相关文章

【Java漏洞】Shiro 漏洞:SpringBoot 整合 Shiro+JdbcRealm

JdbcRealm 其中JdbcRealm需要创建如下表结构: CREATE TABLE `users`(id int primary key auto_increment,username varchar(60) not null unique,password varchar(60) not null,password_salt varchar(20) ); -- 创建五个用户如下 INSERT INTO `users`(username, password) VA…

【Java漏洞】Shiro 漏洞:基于 Java SE 基本使用

在pom.xml文件中进行引入依赖: <dependencies><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId><version>1.4.1</version></dependency> </dependencies>因为本次的Realm从文…

【Java漏洞】Shiro 漏洞:Shiro 核心组件

Shiro 的运行流程为如下:这里 Subject 的创建是由 SecurityUtils 进行创建的, 后面我们代码会给出案例, 官方给出的图如下:

【Java漏洞】Shiro 漏洞:权限管理

Shiro 的漏洞已爆出很多年, 我们只关心到了它如何触发, 有时并没有想过这个框架是干嘛的, 甚至没有分析过该框架的底层运行逻辑, 那么本篇文章, 让大家从开发者的角度, 来观察。 概念为了实现不同身份登录系统, 出现的功能模块不一样。这个需求叫做权限管理。 学生登录后, 出现…

读数据保护:工作负载的可恢复性02收集需求

收集需求1. 要点 1.1. 数据保护并不是IT里面最出彩的部分1.1.1. 让这个组织知道自己可能遭受哪些风险1.1.2. 与该组织内具有核心竞争力的IT产品通常没有什么联系1.2. 做数据保护所需的资源通常很昂贵,而且这些资源并不会体现在该组织卖给客户的最终产品里1.2.1. 没人会情愿为这…

怎么去除img之间存在的间隔缝隙?

在前端开发中,img 元素之间出现间隔缝隙通常是由几个原因造成的,以下列出常见原因及解决方法: 1. 默认的 inline-block 行为:原因: img 元素默认是 inline-block 元素。inline-block 元素会受到空格和换行符的影响,这些空格和换行符会被渲染成一个空格,从而导致元素之间出…

window10安装子系统wsl2

启用linux子系统 打开控制面板 点击程序点击 启用或关闭 Windows 功能勾选 适用于 Linux 的 Windows 子系统 然后点击确定[Haima的博客] http://www.cnblogs.com/haima/

免费实时翻译软件-MTtranslator

MTtranslator 基于win11的实时字幕(Live Captions),利用本地大模型(Helsinki-NLP/opus-mt-en-zh)实现实时翻译功能。功能特点仅支持英文到简体中文翻译该应用专为实时字幕翻译设计,支持从英文到简体中文的转换。离线操作翻译完全离线进行,保证隐私安全。但翻译质量仅供参…

Educational Codeforces Round 172 (Rated for Div. 2)

A. Greedy Monocarp题目大意:给你n个箱子,每个箱子有ai枚硬币,现在有一个人会进行若干次操作:每次拿走硬币最多的箱子,直到他的硬币总和大于等于k。 你可以在一些箱子内增加一些硬币,使得这个人拿走的硬币数量最小,问你最少需要加多少枚硬币。思路: 看数据范围,ai<…

HCIP-15 BGP路由反射器

为解决IBGP水平分割问题可以采用全互联的IBGP连接,但是该方式需要维护大量的IBGP对等体关系,为此可以部署RR来减少IBGP对等体关系的数量。 RR的设定打破了IBGP水平分割规则,为了防止路由环路产生,BGP增加了Originator_ID、Cluster_ID两个路径属性。目录中转AS中的IBGP问题路…

财务知识-期末常用会计分录

财务知识-期末常用会计分录

Rancher容器云管理平台

Rancher容器云管理平台 一、主机硬件说明序号 硬件 操作及内核1 CPU 4 Memory 4G Disk 100G CentOS72 CPU 4 Memory 4G Disk 100G CentOS73 CPU 4 Memory 4G Disk 100G CentOS74 CPU 4 Memory 4G Disk 100G CentOS7二、主机配置 2.1 主机名 # hostnamectl set-hostname rancher…