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

news/2024/12/3 8:09:58/文章来源:https://www.cnblogs.com/o-O-oO/p/18583228

我们日常的记住密码功能, 实现思路如下:

可以看到, 是基于COOKIE进行操作的.

Shiro对页面访问的权限分为三个级别:

未认证 - 可访问的页面, 例如: 登录入口.html, 注册入口.html
记住我 - 可访问的页面, 例如: 个人信息.html
已认证 - 可访问的页面, 例如: 转账.html

而大概的流程如下:

为了方便测试, 我们修改/resource/templates/login.html文件内容如下:

<form action="/user/login" method="post">u: <input type="text" name="username"/><br>p: <input type="password" name="password"/><br>记住我: <input type="checkbox" name="rememberMe"><br><span th:text="${msg}" style="color:red"></span><input type="submit">
</form>

因为rememberMe是基于Cookie的, 所以我们需要在SecurityManager中增加CookieManager, 那么我们在ShiroAutoConfiguration中进行定义:

@Bean
public CookieRememberMeManager getRememberMeManager() { // 支持 RememberMe, 并设置 CookieCookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager();SimpleCookie simpleCookie = new SimpleCookie("rememberMe"); // 让服务器检查 rememberMe 键, 这里必须设置simpleCookie.setMaxAge(60); // 60 秒后过期cookieRememberMeManager.setCookie(simpleCookie);return cookieRememberMeManager;
}@Bean
public SecurityManager securityManager(MyRealm myRealm, EhCacheManager ehCacheManager) { // 定义 SecurityManagerDefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();securityManager.setRealm(myRealm);securityManager.setCacheManager(ehCacheManager);securityManager.setSessionManager(getDefaultSessionManager());securityManager.setRememberMeManager(getRememberMeManager()); // 设置 RememberMeManagerreturn securityManager;
}

随后我们在UserController::login页面中进行接收rememberMe传递来的数据:

@PostMapping("/login")
public ModelAndView login(String username, String password, @RequestParam(defaultValue = "false", required = false) String rememberMe) {ModelAndView modelAndView = new ModelAndView();try {userService.checkLogin(username, password, rememberMe); // 传递给 userServicemodelAndView.setViewName("index");} catch (Exception e) {modelAndView.addObject("msg", "登陆失败!");modelAndView.setViewName("login");} finally {return modelAndView;}
}

那么UserServiceImpl::checkLogin的定义如下:

public void checkLogin(String username, String password, String rememberMe) throws Exception {Subject subject = SecurityUtils.getSubject();UsernamePasswordToken token = new UsernamePasswordToken(username, password);if ("on".equals(rememberMe)) { // 如果选中, 那么直接设置 rememberMe 为 truetoken.setRememberMe(true);}subject.login(token);
}

随后我们在ShiroAutoConfiguration中进行配置ShiroFilter的具体页面的权限分配:

@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();shiroFilterFactoryBean.setSecurityManager(securityManager);Map<String, String> hashMap = new HashMap<>();hashMap.put("/", "user"); // 设置为 记住我 访问/*** anon 未认证可访问* user 记住我可访问 (已认证也可以访问)* authc 已认证可访问* perms 必须具备具体的权限才可以进行访问* logout 退出登录*/hashMap.put("/login", "anon"); // login 支持匿名访问hashMap.put("/static/**", "anon"); // static 下的内容随便访问hashMap.put("/logout", "logout"); // 访问则退出登录hashMap.put("/kFind", "authc, perms[sys:k:find]"); // 当前用户已登录, 并且存在 sys:k:find 权限才允许访问shiroFilterFactoryBean.setFilterChainDefinitionMap(hashMap);shiroFilterFactoryBean.setLoginUrl("/login");shiroFilterFactoryBean.setUnauthorizedUrl("/");return shiroFilterFactoryBean;
}

假设我们SESSION默认设置为1000毫秒就失效, 也就是1秒后就失效.

那么这个案例, 当我们wangwu登录后 (勾选记住我), 主页面是可以进行访问的 (因为设置了记住我), 但是功能模块却访问不了 (因为设置了已认证). 如图:

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

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

相关文章

【Java漏洞】Shiro 漏洞:SpringBoot 整合 Shiro+授权

用户登陆成功之后, 要进行响应的操作就需要有对应的权限; 在进行操作之前对权限进行检查 - 授权. 权限控制通常有两类做法: 不同身份的用户登录,不同的操作菜单(没有权限的菜单不显示) 对所有用户显示所有菜单,当用户点击菜单以后再验证当前用户是否有此权限,如果没有则提…

【Java漏洞】Shiro 漏洞:SpringBoot 整合 Shiro+Shiro 加密

加密的过程如下:研究这部分内容, 我们需要将数据库中Password值都改为MD5处理后的值, 过程如下: mysql> SELECT * FROM tb_users; +---------+----------+----------+---------------+ | user_id | username | password | password_salt | +---------+----------+----------…

【Java漏洞】Shiro 漏洞:SpringBoot 整合 Shiro+退出登录

在我们的ShiroAutoConfiguration::ShiroFilterFactoryBean中, 我们增加如下代码: @Bean public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();shiroFilte…

【Java漏洞】Shiro 漏洞:SpringBoot 整合 Shiro+自定义 Realm

在真正的项目中, 我们不会使用Shiro提供的JdbcRealm, 而是使用自定义Realm, 配合我们的MyBatis, 以及自定义表结构进行联合使用.表结构定义 那么下面我们来定义这些表:-- 用户信息表 CREATE TABLE `tb_users`(user_id int unsigned primary key auto_increment,username varcha…

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

IniRealm 如果我们想在SpringBoot中进行使用Shiro, 那么我们肯定是需要围绕如下环节进行研究. 创建 pom.xml: <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.3&l…

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