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

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

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) VALUES('zhangsan', '123456');
INSERT INTO `users`(username, password) VALUES('lisi', '123456');
INSERT INTO `users`(username, password) VALUES('wangwu', '123456');
INSERT INTO `users`(username, password) VALUES('zhaoliu', '123456');
INSERT INTO `users`(username, password) VALUES('chenqi', '123456');CREATE TABLE `user_roles`(id int primary key auto_increment,username varchar(60) not null,role_name varchar(100) not null
);
-- 给这五个用户分别增加如下角色
-- admin 系统管理人员
-- cmanager 库管人员
-- xmanager 销售人员
-- kmanager 客服人员
-- zmanager 行政人员
INSERT INTO `user_roles`(username, role_name) VALUES('zhangsan', 'admin');
INSERT INTO `user_roles`(username, role_name) VALUES('lisi', 'cmanager');
INSERT INTO `user_roles`(username, role_name) VALUES('wangwu', 'xmanager');
INSERT INTO `user_roles`(username, role_name) VALUES('zhaoliu', 'kmanager');
INSERT INTO `user_roles`(username, role_name) VALUES('chenqi', 'zmanager');CREATE TABLE `roles_permissions`(id int primary key auto_increment,role_name varchar(100) not null,permission varchar(100) not null
);
-- admin 具备所有权限
INSERT INTO `roles_permissions`(`role_name`,`permission`) VALUES("admin", "*");
-- 库管人员具备的权限
INSERT INTO `roles_permissions`(`role_name`,`permission`) VALUES("cmanager", "sys:c:save");
INSERT INTO `roles_permissions`(`role_name`,`permission`) VALUES("cmanager", "sys:c:delete");
INSERT INTO `roles_permissions`(`role_name`,`permission`) VALUES("cmanager", "sys:c:update");
INSERT INTO `roles_permissions`(`role_name`,`permission`) VALUES("cmanager", "sys:c:find");
-- 销售人员具备的权限
INSERT INTO `roles_permissions`(`role_name`,`permission`) VALUES("xmanager", "sys:c:find");INSERT INTO `roles_permissions`(`role_name`,`permission`) VALUES("xmanager", "sys:x:save");
INSERT INTO `roles_permissions`(`role_name`,`permission`) VALUES("xmanager", "sys:x:delete");
INSERT INTO `roles_permissions`(`role_name`,`permission`) VALUES("xmanager", "sys:x:update");
INSERT INTO `roles_permissions`(`role_name`,`permission`) VALUES("xmanager", "sys:x:find");INSERT INTO `roles_permissions`(`role_name`,`permission`) VALUES("xmanager", "sys:k:save");
INSERT INTO `roles_permissions`(`role_name`,`permission`) VALUES("xmanager", "sys:k:delete");
INSERT INTO `roles_permissions`(`role_name`,`permission`) VALUES("xmanager", "sys:k:update");
INSERT INTO `roles_permissions`(`role_name`,`permission`) VALUES("xmanager", "sys:k:find");
-- 客服人员所具备的权限
INSERT INTO `roles_permissions`(`role_name`,`permission`) VALUES("kmanager", "sys:k:update");
INSERT INTO `roles_permissions`(`role_name`,`permission`) VALUES("kmanager", "sys:k:find");
-- 行政人员
INSERT INTO `roles_permissions`(`role_name`,`permission`) VALUES("zmanager", "sys:*:find");

当前表结构如果想要查询具体用户是否具有某种权限的话, 关系如下:

那么此时我们修改ShiroAutoConfiguration类代码如下:

@Configuration
public class ShiroAutoConfiguration {
//    @Bean
//    public IniRealm getIniRealm() { // 先使用 IniReal 做演示
//        IniRealm iniRealm = new IniRealm("classpath:shiro.ini");
//        return iniRealm;
//    }@Beanpublic JdbcRealm getJdbcRealm(DataSource dataSource) {JdbcRealm jdbcRealm = new JdbcRealm();jdbcRealm.setDataSource(dataSource); // druid-spring-boot-starter 已经配置好了, 直接引用即可jdbcRealm.setPermissionsLookupEnabled(true); // 默认开启认证功能, 需手动开启授权功能return jdbcRealm;}@Beanpublic SecurityManager getSecurityManager(JdbcRealm ream) {DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager();defaultWebSecurityManager.setRealm(ream); // 要想完成校验, 需要 Realm// SecurityUtils.setSecurityManager(defaultWebSecurityManager); // 设置 SecurityUtils 下的 SecurityManagerreturn defaultWebSecurityManager;}@Beanpublic ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();shiroFilterFactoryBean.setSecurityManager(securityManager);HashMap<String,String> filterMap = new HashMap();filterMap.put("/", "anon");filterMap.put("/login", "anon");filterMap.put("/register", "anon");filterMap.put("/user/login", "anon");filterMap.put("/**", "authc");filterMap.put("/static/**", "anon");shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap); // 将规则设置进来shiroFilterFactoryBean.setLoginUrl("/login"); // 设置默认的登录界面shiroFilterFactoryBean.setUnauthorizedUrl("/"); // 设置未授权访问的跳转URLreturn shiroFilterFactoryBean;}
}

修改完具体Realm后, 我们的功能也成功生效了.

Shiro 标签使用

当我们登录成功后, 需要显示当前用户信息, 以及对应的权限功能入口, Shiro 提供了一套标签, 可以应用于 Thymeleaf, jsp 中。

当前我们的环境是 Thymeleaf, 所以我们必须在pom.xml中导入依赖:


<dependency> <!-- 引入 shiro 标签依赖 --><groupId>com.github.theborakompanioni</groupId><artifactId>thymeleaf-extras-shiro</artifactId><version>2.1.0</version>
</dependency>

随后我们需要在我们的配置类中定义一个Bean:

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

随后我们在具体模板中进行声明引用即可:


<html lang="en" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">

修改/resources/templates/index.html文件内容如下:

<!DOCTYPE html>
<html lang="en" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
<head><meta charset="UTF-8"><title>主页</title>
</head>
<body>
<shiro:guest>欢迎游客访问 | <a href="/login">登录</a> <!-- 当用户没有登录时会显示该内容 -->
</shiro:guest>
<shiro:user>欢迎用户名为: <shiro:principal/> 的用户访问! <br><!-- 当前已经登陆成功的状态, 会显示该内容 <shiro:principal/> 获取当前用户名 --><hr>当前用户角色为:<shiro:hasRole name="admin"> 超级管理员</shiro:hasRole> <!-- 判断当前的角色 --><shiro:hasRole name="cmanager"> 库管人员</shiro:hasRole><shiro:hasRole name="xmanager"> 销售人员</shiro:hasRole><shiro:hasRole name="kmanager"> 客服人员</shiro:hasRole><shiro:hasRole name="zmanager"> 行政人员</shiro:hasRole><hr><br>当前所拥有的权限为:<br><hr>仓库管理<ul><shiro:hasPermission name="sys:c:save"><li><a href="#">入库</a></li></shiro:hasPermission><shiro:hasPermission name="sys:c:delete"><li><a href="#">出库</a></li></shiro:hasPermission><shiro:hasPermission name="sys:c:update"><li><a href="#">更新仓库</a></li></shiro:hasPermission><shiro:hasPermission name="sys:c:find"><li><a href="#">查找仓库</a></li></shiro:hasPermission></ul><hr>销售管理<ul><shiro:hasPermission name="sys:x:save"><li><a href="#">保存订单</a></li></shiro:hasPermission><shiro:hasPermission name="sys:x:delete"><li><a href="#">删除订单</a></li></shiro:hasPermission><shiro:hasPermission name="sys:x:update"><li><a href="#">更新订单</a></li></shiro:hasPermission><shiro:hasPermission name="sys:x:find"><li><a href="#">查询订单</a></li></shiro:hasPermission></ul>客户管理<ul><shiro:hasPermission name="sys:k:save"><li><a href="#">新增客户</a></li></shiro:hasPermission><shiro:hasPermission name="sys:k:delete"><li><a href="#">删除客户</a></li></shiro:hasPermission><shiro:hasPermission name="sys:k:update"><li><a href="#">修改客户</a></li></shiro:hasPermission><shiro:hasPermission name="sys:k:find"><li><a href="#">查询客户</a></li></shiro:hasPermission></ul>
</shiro:user>
</body>
</html>

不同用户登录效果:

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

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

相关文章

【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…

《痞子衡嵌入式半月刊》 第 112 期

痞子衡嵌入式半月刊: 第 112 期这里分享嵌入式领域有用有趣的项目/工具以及一些热点新闻,农历年分二十四节气,希望在每个交节之日准时发布一期。 本期刊是开源项目(GitHub: JayHeng/pzh-mcu-bi-weekly),欢迎提交 issue,投稿或推荐你知道的嵌入式那些事儿。 上期回顾 :《…