【WEEK13】 【DAY3】Shiro第三部分【中文版】

news2024/11/13 7:59:37

2024.5.22 Wednesday
接上文【WEEK13】 【DAY2】Shiro第二部分【中文版】

目录

  • 15.4.登录拦截
    • 15.4.1.修改ShiroConfig.java
    • 15.4.2.新建login.html页面
    • 15.4.3.修改MyController.java
    • 15.4.4.再次修改ShiroConfig.java
    • 15.4.5.重启
  • 15.5.用户认证
    • 15.5.1.修改MyController.java
    • 15.5.2.修改login.html
    • 15.5.3.重启
    • 15.5.4.修改UserRealm.java
    • 15.5.5.重启
      • 15.5.5.1.输入正确用户名和密码
      • 15.5.5.2.输入错误用户名
      • 15.5.5.3.输入错误密码

15.4.登录拦截

15.4.1.修改ShiroConfig.java

package com.P40.config;

import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

@Configuration
public class ShiroConfig {
    //ShiroFilterFactoryBean
    @Bean
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager defaultWebSecurityManager){
        ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
        //要配置什么:点击进入ShiroFilterFactoryBean源码查看
        //设置安全管理器
        bean.setSecurityManager(defaultWebSecurityManager);

        //添加shiro的内置过滤器
        Map<String,String> filterMap = new LinkedHashMap<>();
        filterMap.put("/user/add","authc");
        filterMap.put("/user/update","authc");
        //仅在此处修改add和update页面的访问权限后,重启项目,点击add或update都将被拦截,显示404错误,希望跳转到登录页面

        bean.setFilterChainDefinitionMap(filterMap);
        return bean;
    }

    //DefaultWebSecurityManager
    ...
}
- anon: 无需认证就可以访问
- authc: 必须认证了才能访问
- user: 必须拥有记住我功能才能用
- perms: 拥有对某个资源的权限才能访问
- role: 拥有某个角色权限

15.4.2.新建login.html页面

在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>登录</h1>

<hr>
<form action="">
    <p>用户名:<input type="text" name="username"></p>
    <p>密码:<input type="text" name="password"></p>
    <p><input type="submit"></p>
</form>
</body>
</html>

15.4.3.修改MyController.java

添加访问login页面的方法

package com.P40.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class MyController {

    @RequestMapping({"/", "/index"})
    public String toIndex(Model model){
        model.addAttribute("msg","hello, Shiro");
        return "index";
    }

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

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

    @RequestMapping("/toLogin")
    public String toLogin(){
        return "login";
    }
}

15.4.4.再次修改ShiroConfig.java

使用通配符,跳转登录页

package com.P40.config;

import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.LinkedHashMap;
import java.util.Map;

@Configuration
public class ShiroConfig {
    //ShiroFilterFactoryBean
    @Bean
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager defaultWebSecurityManager){
        ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
        //要配置什么:点击进入ShiroFilterFactoryBean源码查看
        //设置安全管理器
        bean.setSecurityManager(defaultWebSecurityManager);

        //添加shiro的内置过滤器
        /*
        anon: 无需认证就可以访问
        authc: 必须认证了才能访问
        user: 必须拥有记住我功能才能用
        perms: 拥有对某个资源的权限才能访问
        role: 拥有某个角色权限
         */
        //登录拦截
        Map<String,String> filterMap = new LinkedHashMap<>();
//        filterMap.put("/user/add","authc");
//        filterMap.put("/user/update","authc");
        //仅在此处修改add和update页面的访问权限后,重启项目,点击add或update都将被拦截,显示404错误,希望跳转到登录页面
        filterMap.put("/user/*","authc");   //也可以使用通配符实现(替代上两行的/user/add和/user/update)
        bean.setFilterChainDefinitionMap(filterMap);

        //如果没有权限,则需要跳转到登录页
        bean.setLoginUrl("/toLogin");   //设置登录的请求
        return bean;
    }

    //DefaultWebSecurityManager
    @Bean(name = "securityManager") //给这个类起别名,便于ShiroFilterFactoryBean调用
    public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){    //获取UserRealm,但是这里好像不需要使用注解,可以直接调用
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        //默认的DefaultWebSecurityManager类的类名是defaultWebSecurityManager,只是在这里修改成securityManager

        //关联UserRealm
        securityManager.setRealm(userRealm);
        return securityManager;
    }

    //创建realm对象,需要自定义类
    @Bean
    public UserRealm userRealm(){
        return new UserRealm();
    }

    //创建时顺序是相反的(从real->DefaultWebSecurityManager->ShiroFilterFactoryBean)
}

15.4.5.重启

在首页点击add或者update后跳转到登录页
http://localhost:8080/toLogin
在这里插入图片描述

15.5.用户认证

15.5.1.修改MyController.java

package com.P40.controller;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.UnknownAccountException;
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.RequestMapping;

@Controller
public class MyController {

    @RequestMapping({"/", "/index"})
    public String toIndex(Model model){
        model.addAttribute("msg","hello, Shiro");
        return "index";
    }

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

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

    @RequestMapping("/toLogin")
    public String toLogin(){
        return "login";
    }


    @RequestMapping("/login")
    public String login(String username, String password, Model model){
        //获取当前的用户
        Subject subject = SecurityUtils.getSubject();

        //封装用户的登录数据
        UsernamePasswordToken token = new UsernamePasswordToken(username,password);

        //执行登录的方法,没有异常则成功了,选中代码后Ctrl+Alt+T添加try catch
        try {
            subject.login(token);
            return "index";
        } catch (UnknownAccountException e) {   //用户名不存在
            model.addAttribute("msg","用户名错误");
            return "login";
        } catch (IncorrectCredentialsException e) {   //密码错误
            model.addAttribute("msg","密码错误");
            return "login";
        }
    }
}

15.5.2.修改login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>登录</h1>

<hr>
<p th:text="${msg}" style="color: cadetblue"></p>

<form th:action="@{/login}">
    <p>用户名:<input type="text" name="username"></p>
    <p>密码:<input type="text" name="password"></p>
    <p><input type="submit"></p>
</form>
</body>
</html>

15.5.3.重启

任意输入一组用户名和密码
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
说明执行了
在这里插入图片描述

15.5.4.修改UserRealm.java

package com.P40.config;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.subject.Subject;

//UserRealm是一个bean
//自定义的UserRealm,必须要继承AuthorizingRealm方法,然后implement methods(alt+insert)
public class UserRealm extends AuthorizingRealm {
    //授权
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        System.out.println("do doGetAuthorizationInfo 授权");
        return null;
    }

    //认证
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        System.out.println("do doGetAuthorizationInfo 认证");

        //用户名,密码————数据读取
        String name = "root";
        String password = "1";
        UsernamePasswordToken userToken = (UsernamePasswordToken) authenticationToken;

        if (!userToken.getUsername().equals(name)){
            return null;    //抛出UnknownAccountException异常(自动的)
        }

        //密码认证,shiro运行
        return new SimpleAuthenticationInfo("",password,"");
    }
}

15.5.5.重启

任选add或update点击,自动跳转到登录页面。

15.5.5.1.输入正确用户名和密码

在这里插入图片描述
提交后返回到首页,此时add页面和update页面均可访问
在这里插入图片描述
在这里插入图片描述

15.5.5.2.输入错误用户名

在这里插入图片描述
在这里插入图片描述

15.5.5.3.输入错误密码

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

【css】引入背景图时候,路径写入@会报错

看报错信息 我的写法 解决办法 在前面加个~

个体因果效应估计|EDVAE:用于个体治疗效果估计的反事实推理中的解开潜在因素模型

【摘要】根据观察数据估计个体治疗效果&#xff08;ITE&#xff09;是一项至关重要但具有挑战性的任务。解缠结表示已用于将代理变量分为混杂变量、工具变量和调整变量。然而&#xff0c;根据观测数据准确地进行反事实推理来识别 ITE 仍然是一个悬而未决的问题。在本文中&#…

6. Spring面试题汇总

Java全栈面试题汇总目录-CSDN博客 1. 什么是Spring框架? Spring是一种轻量级开发框架&#xff0c;旨在提高开发人员的开发效率以及系统的可维护性。 我们一般说Spring框架指的都是Spring Framework&#xff0c;它是很多模块的集合&#xff0c;使用这些模块可以很方便地协助…

每周打靶VulnHub靶机-LOOZ_ 1

Looz: 1 靶机传送门 Not that hard and not that easy, it’s always straightforward if you can imagine it inside your mind. 没有那么难也没有那么容易&#xff0c;只要你能在脑海中想象出来&#xff0c;它总是很简单的 1.信息搜集 使用nmap进行域内存活主机扫描发现targ…

A10 vThunder镜像-eveng pnetlab镜像下载

A10 vThunder 是由 A10 Networks 发布的。A10 Networks 是一家专注于应用交付控制器&#xff08;ADC&#xff09;、负载均衡、安全和基于云的应用交付解决方案的公司。A10 vThunder 系列产品包括虚拟应用交付控制器&#xff08;ADC&#xff09;和其他虚拟化网络功能&#xff0c…

html 段落与排版标记 Web前端开发技术、详细文章(例如)

段落与排版标记 网页的外观是否美观&#xff0c;很大程度上取决于其排版。在页面中出现大段的文字&#xff0c;通常采用分段进行规划&#xff0c;对换行也有极其严格的划分。本节从段落的细节设置入手&#xff0c;利用段落与排版标记自如地处理大段的文字。 段落p标记 在HTM…

展厅设计对企业有哪些作用

1、增强品牌形象 企业展厅对于增强企业品牌形象、提升企业的知名度和市场竞争力具有显著作用和意义。展厅作为企业对外的窗口&#xff0c;是客户和访客了解企业的第一印象。通过独特的设计风格和精心的展示布局&#xff0c;企业可以将自身的核心价值和文化理念巧妙地融入到展厅…

ip地址怎么改成自己想要的地区

在数字化时代&#xff0c;IP地址不仅代表着我们在网络世界中的身份标识&#xff0c;更是与地理位置紧密相连的要素。然而&#xff0c;有时出于隐私保护、网络优化或特定访问需求&#xff0c;我们可能希望更改IP地址至心仪的地区。本文将为您详细介绍如何实现这一目标。 IP地址通…

Mac安装 Intellij IDEA,亲测有效M1、M2可用

引言 最近开始学习使用spring boot写一个简单的后端项目&#xff0c;使用Intellij IDEA软件&#xff0c;Intellij IDEA为新用户提供了30天的免费试用。 方案 1.官网下载Intellij IDEA IntelliJ IDEA – the Leading Java and Kotlin IDE 或者直接网盘连接下载&#xff1a;…

轻松驾驭文件重命名,一键批量导出位置与名称至表格,让文件管理更高效便捷!

无论是工作还是生活&#xff0c;我们都需要与各种各样的文件打交道。有时&#xff0c;为了快速查找或整理文件&#xff0c;我们可能需要记录它们的位置和名称。但面对海量的文件&#xff0c;手动记录不仅耗时耗力&#xff0c;还容易出错。那么&#xff0c;有没有一种方法能够轻…

ES6中的Map和WeakMap你能分清吗?这里教会你

Map和WeakMap都是ES6中新增的数据结构&#xff0c;用于存储键值对。他们之间有什么区别&#xff0c;本文给大家详细讲述下&#xff0c;并附上示例代码。 一、什么是Map和WeakMap&#xff1f; 在JavaScript中&#xff0c;Map和WeakMap都是用来存储键值对的数据结构。 Map是一…

vue.js对接海康威视摄像头web开发包

一、登录海康开放平台下载web开发包&#xff0c;下载需要先登录海康账号&#xff0c;没有的需先注册一个。 这里的appkey、ip、port、secret 和cameraIndexCodeasd是自己去申请的 appkey: "****", ip: "****", port: **, secret: "****", //必填…

区块链钱包如果丢失了私钥或助记词,资产还能恢复吗?

如果你丢失了区块链钱包的私钥或助记词&#xff08;通常是用于恢复钱包的短语或种子&#xff09;&#xff0c;那么你的资产在大多数情况下是无法恢复的。私钥是访问和控制你在区块链上资产的唯一凭证&#xff0c;而助记词&#xff08;如BIP39标准中的12、18、24个单词的短语&am…

科技产业园3D探秘:未来科技之城的奇幻之旅

在数字时代的浪潮中&#xff0c;科技产业园区成为了推动城市经济发展、科技创新的重要引擎。 当我们打开科技产业园的3D可视化模型&#xff0c;仿佛穿越时空&#xff0c;来到了一个充满奇幻色彩的科技世界。在这里&#xff0c;高楼大厦鳞次栉比&#xff0c;绿色植被点缀其间&am…

1673. 找出最具竞争力的子序列

题目 给定一个整数数组 nums 和一个正整数 k&#xff0c;返回长度为 k 且最具竞争力的 nums 子序列。 数组的子序列是从数组中删除一些元素&#xff08;可能不删除元素&#xff09;得到的序列。 在子序列 a 和子序列 b 第一个不相同的位置上&#xff0c;如果 a 中的数字小于…

【C语言】结构体内存对齐:热门面试话题

&#x1f525;引言 书接上文&#xff0c;我们了解关于结构体的基本知识&#xff0c;这篇将深入剖析结构体中一个重要的知识点:内存对齐 关于内存对齐是属于热门面试话题&#xff0c;对此单独放在一篇来分享 &#x1f308;个人主页&#xff1a;是店小二呀 &#x1f308;C语言笔记…

uniapp宠物咖门店连锁会员制宠物寄养系统 微信小程序-

随着人们生活水平的提高&#xff0c;越来越多的人喜欢给自己或是家里的老人小孩养一只可爱的宠物&#xff0c;满足宠物的需要也就成为了许多爱宠人士每天苦恼的事情&#xff0c;去哪可以选购到健康合格的宠物食品&#xff1f;去哪能给宠物看病&#xff1f;去哪能给脏了的宠物美…

Nat Hum Behav | 人类前额叶皮层非空间注意力的因果相位依赖性控制

摘要 非空间注意力是一种基本的认知机制&#xff0c;它使个体能够将意识的焦点从无关刺激转向与行为目标相关的感觉信息上。有人提出了一种关于注意力是由前额叶皮层中缓慢兴奋性波动的持续相位所调节的假设&#xff0c;但这一假设存在争议且尚未达成共识。在这里&#xff0c;…

Rust Tarui 中的 Scrcpy 客户端,旨在提供控制安卓设备的鼠标和按键映射,类似于游戏模拟器。

Scrcpy-mask 为了实现电脑控制安卓设备&#xff0c;本人使用 Tarui Vue 3 Rust 开发了一款跨平台桌面客户端。该客户端能够提供可视化的鼠标和键盘按键映射配置。通过按键映射实现了实现类似安卓模拟器的多点触控操作&#xff0c;具有毫秒级响应速度。该工具可广泛用于电脑控…

亚信安慧AntDB数据库采集技术创新:ACC从Java到Go的转型之路

传统的指标采集方法通常使用一些命令行工具&#xff0c;如top、free等来获取系统的性能数据。然而&#xff0c;这种方法存在一些缺点。首先&#xff0c;这些命令行工具输出的数据格式通常是文本形式&#xff0c;需要进行解析和处理才能得到有用的信息&#xff0c;这增加了开发者…