当前位置: 首页 > news >正文

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

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@Beanpublic 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@Beanpublic 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//关联UserRealmsecurityManager.setRealm(userRealm);return securityManager;}//创建realm对象,需要自定义类@Beanpublic 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 catchtry {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 {//授权@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {System.out.println("do doGetAuthorizationInfo 授权");return null;}//认证@Overrideprotected 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.输入错误密码

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

相关文章:

  • SSL证书制作及nginx部署
  • 局域网传文件怎么操作?轻松实现文件共享!
  • 用Python的PyAutoGUI库控制鼠标滚轮
  • 深度学习之基于TensorFlow人脸表情识别
  • 用C语言把一棵普通二叉树安排得明明白白
  • 【重学C++】02 脱离指针陷阱:深入浅出 C++ 智能指针
  • 掌握Edge浏览器的使用技巧
  • HarmonyOS开发之DevEco Studio安装
  • 前端面试项目细节重难点(已工作|做分享)
  • 循环双链表算法库构建
  • 解决 VSCode 编辑器点击【在集成终端中打开】出现新的弹框
  • HD哈默纳科行星减速机:工业传动领域的卓越之选
  • 云原生技术:开启你的数字王国
  • Windows系统C盘空间优化进阶:磁盘清理与Docker日志管理
  • GMSSL学习笔记
  • 【Linux系统编程】快速查找errno错误码信息
  • cookie和session
  • Intervention/image 图片处理扩展包的安装和使用
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • java8-模拟hadoop
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • js
  • JS字符串转数字方法总结
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • react-native 安卓真机环境搭建
  • Spring框架之我见(三)——IOC、AOP
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • 从setTimeout-setInterval看JS线程
  • 计算机在识别图像时“看到”了什么?
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 实现简单的正则表达式引擎
  • 协程
  • 应用生命周期终极 DevOps 工具包
  • 转载:[译] 内容加速黑科技趣谈
  • scrapy中间件源码分析及常用中间件大全
  • #define 用法
  • #pragam once 和 #ifndef 预编译头
  • #window11设置系统变量#
  • (1)(1.13) SiK无线电高级配置(六)
  • (2024,LoRA,全量微调,低秩,强正则化,缓解遗忘,多样性)LoRA 学习更少,遗忘更少
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (SpringBoot)第二章:Spring创建和使用
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (附源码)ssm高校实验室 毕业设计 800008
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (三)终结任务
  • (算法二)滑动窗口
  • (已解决)什么是vue导航守卫
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...
  • .Net各种迷惑命名解释
  • .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)
  • .net连接oracle数据库