首页 > 其他分享 >28.shiro的总结(同springsecurity对比)

28.shiro的总结(同springsecurity对比)

时间:2024-04-12 15:46:21浏览次数:12  
标签:return 28 springsecurity public user new shiroFilterFactoryBean shiro

image
image
image


来看具体例子中shiro的应用:
首先 三个核心组件

  1. Subject 当前和软件交互的任何事件
  2. SecurityManager 管理所有Subject,SecurityManager 是 Shiro 架构的核心,配合内部安全组件共同组成安全伞
  3. Realms:用于进行权限信息的验证,我们自己实现。Realm 本质上是一个特定的安全 DAO:它封装与数据源连接的细节,得到Shiro 所需的相关的数据 在配置 Shiro 的时候,你必须指定至少一个Realm 来实现认证(authentication)和/或授权(authorization)

下面一个例子
用mybatis数据库储存用户信息 然后通过shiro
可以认证授权 对应用户对应显示跳转页面

首页面:
<!DOCTYPE html>
这里的用的语法就是thymeleaf 和shiro结合thymeleaf
<html lang="en" xmlns:th="http://www.thymeleaf.org"
      xmlns:shiro="http://www.thymeleaf.org/thymeleaf-extras-shiro">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
这个用来没登陆就显示登录 登录了就不显示 通过 session储存的
<h2 th:if="${session.success==null}">
    <a th:href="@{/user/login}">登录</a>
</h2>
是否拥有权限 此处的user:add 对应的就是数据表中的perms 
拥有参数访问权限
<div shiro:hasPermission="user:add">
    <a th:href="@{/user/add}">add</a>
</div>
<br>
<div shiro:hasPermission="user:update">
    <a th:href="@{/user/update}">update</a>
</div>
<br>
<div shiro:hasPermission="user:delete">
    <a th:href="@{/user/delete}">delete</a>
</div>
</body>
</html>
跳转的登陆页面
<!DOCTYPE html>
<html lang="en"  xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
显示个信息是否登录了
<p th:text="${msg}" style="color: rebeccapurple"></p>
form表单提交信息
<form th:action="@{/subject}">
 用户名:<input name="username"><br>
 密码:<input name="pwd"><br>
<input type="submit" placeholder="提交">
</form>
</body>
</html>
controller层中接受form表单提交信息
  @RequestMapping("/subject")
    public String subject(String username, String pwd, Model model) {
        //获取当前用户
//SecurityUtils是一个抽象的工具类,它主要用于执行安全相关的操作,并简化框架的使用
        Subject subject = SecurityUtils.getSubject();
        //封装用户登录数据 标记
        UsernamePasswordToken token = new UsernamePasswordToken(username, pwd);
        try {
            subject.login(token);
            return "user/First"; //成功标记跳转首页
        } catch (UnknownAccountException e) {
         //用户不存在
            model.addAttribute("msg", "用户名错误");
            return "user/login";
        } catch (IncorrectCredentialsException e) {
         //密码错误
            model.addAttribute("msg", "密码错误");
            return "user/login";

        }
springmvc config配置
此处就是配置了个过滤器
@Configuration
public class ShiroConfig {
 //过滤器
//    shiroFilterFactoryBean是整个Shiro的入口点,用于拦截需要安全控制的请求进行处理
    @Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean(@Qualifier("getDefaultWebSecurityManager") DefaultWebSecurityManager defaultWebSecurityManager) {
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        shiroFilterFactoryBean.setSecurityManager(defaultWebSecurityManager);        //Shiro内置过滤器
        /**
         * anon 无需认证
         * authc 需要登陆
         * user 必须存在用户
         * roles 角色
         * perms 拥有参数访问权限
         * */
        Map<String, String> filterLinkedHashMap = new LinkedHashMap<>();
        filterLinkedHashMap.put("/user/delete", "perms[user:delete]");
 // perms对应数据表字段 
        filterLinkedHashMap.put("/user/add", "perms[user:add]");
        filterLinkedHashMap.put("/user/update", "perms[user:update]");
        filterLinkedHashMap.put("/user/*", "authc");
       //setFilterChainDefinitionMap方法是ShiroFilterFactoryBean`类的一个方法,用于设置过滤器链定义映射 shiroFilterFactoryBean.setFilterChainDefinitionMap(filterLinkedHashMap);
        //未授权跳转
        shiroFilterFactoryBean.setUnauthorizedUrl("/Noauth");
        //需要登陆的页面跳转到login.html页面
        shiroFilterFactoryBean.setLoginUrl("/login");
        return shiroFilterFactoryBean;
    }
   重点重点
   //安全管理器
    @Bean
    public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm) {
        DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager();
        //关联userRealm
        defaultWebSecurityManager.setRealm(userRealm);
        return defaultWebSecurityManager;
    }

    //关联一个自定义的Realm
    @Bean
    public UserRealm userRealm() {
        return new UserRealm();
    }

    @Bean
    //整合thymeleaf和shiro
    public ShiroDialect getShiroDialect(){
        return new ShiroDialect();
    }
}
   
UserRealm:
//自定义的Realm 本质上是一个特定的安全 DAO
public class UserRealm extends AuthorizingRealm {
    @Autowired
    UserService userService;
   //授权
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        Subject subject = SecurityUtils.getSubject();
        User principal = (User) subject.getPrincipal();
        info.addStringPermission(principal.getPerms());

        return info;
    }

    //认证
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        UsernamePasswordToken usernamePasswordToken= (UsernamePasswordToken) token;
        //配合数据库
		这里就是调用了mapper中service层
        User user = userService.query(usernamePasswordToken.getUsername());
        if(user==null){
            return null;
        }
       // 这个就是登陆后 session储存
        Subject successsor = SecurityUtils.getSubject();
        Session session = successsor.getSession();
        session.setAttribute("success",user);


        //密码认证 shiro会做
        //SimpleAuthorizationInfo对象可以添加角色和字符串权限
        // 然后这些角色和权限会被用于判断用户是否有权限执行特定的操作或访问特定的资源

        //Object principal, Object credentials, String realmName 三个参数
        return new SimpleAuthenticationInfo(user,user.getPwd(),"");
    }
}

image

标签:return,28,springsecurity,public,user,new,shiroFilterFactoryBean,shiro
From: https://www.cnblogs.com/gaodiyuanjin/p/18131315

相关文章

  • ISOM3028-高级计算机编程
    ISOM3028-高级计算机编程2023/2024第001节___________________________________________________________________________注意:提交硬拷贝(打印格式)和软拷贝。1.对于硬拷贝,您需要提交样本输入和输出。你需要提到作者姓名,即您的姓名和学生号。2.对于软拷贝,请压缩所有类和程序文件并......
  • 超大容量 | 瑞芯微RK3588J工业核心板新增16GB DDR + 128GB eMMC配置!
    作为瑞芯微的金牌合作伙伴,创龙科技在2023年9月即推出搭载瑞芯微旗舰级处理器RK3588J的全国产工业核心板——SOM-TL3588。 SOM-TL3588工业核心板是基于瑞芯微RK3588J/RK3588高性能处理器设计的四核ARMCortex-A76+四核ARMCortex-A55全国产工业核心板,Cortex-A76核心主频高达2.......
  • 28_库的制作与使用
    库的制作与使用介绍​ 库是一种可执行的二进制文件,是编译好的代码。使用库可以提高开发效率。在Linux下有静态库和动态库。因此编译出来的体积就比较大。​ 静态库在程序编译的时候会被链接到目标代码里面。所以程序在运行的时候不再需要静态库了。因此编译出来的体积......
  • Leetcode反转字串541/翻转字串的单词151/实现 strStr方法28/重复的子字符串459
    前言Leetcode541/151/28一、541题(反转字符串)题目描述:给定一个字符串s和一个整数k,从字符串开头算起,每计数至2k个字符,就反转这2k字符中的前k个字符。如果剩余字符少于k个,则将剩余字符全部反转。如果剩余字符小于2k但大于或等于k个,则反转前k个字符,其余......
  • TPS54628DDA 光电耦合
    TPS54628DDA规格信息:制造商:TexasInstruments产品种类:开关稳压器RoHS:是安装风格:SMD/SMT封装/箱体:SO-PowerPad-8输出电压:0.76Vto5.5V输出电流:6A输出端数量:1Output最大输入电压:18V拓扑结构:Buck最小输入电压:4.5V开关频率:650kHz最小工作温度:......
  • LED数显屏驱动/点阵数显驱动芯片-VK1640A SSOP28,适用于麦克风,血氧仪,仪器仪表等产LED
    产品品牌:永嘉微电/VINKA产品型号:VK1640A封装形式:SSOP28概述VK1640A是一种数码管或点阵LED驱动控制专用芯片,内部集成有数据锁存器、LED驱动等电路。SEG脚接LED阳极,GRID脚接LED阴极,可支持8SEGx16GRID的点阵LED显示。适用于小型LED显示屏驱动。采用SSOP28的封装形式。LJQ357特......
  • ORA-01652 无法通过128 (在表空间 TEMP中)扩展temp段
    1,同事说执行sql报错同事在plsql里面执行sql报错,报错信息:ora-01652无法通过128(在表空间TEMP中)扩展temp段,如下图所示: 2,查看报错sql语句Sql比较长,而且无法扩展temp字段,那么基本推断可能有如下2种情况:(1)oracle的temp临时表空间太小了;(2)一个性能非常差的笛卡尔积的带全表扫描......
  • ORA-01652: 无法通过 128 (在表空间 TEMP 中) 扩展 temp 段
    1、报错信息ORA-01652:无法通过128(在表空间TEMP中)扩展temp段2、原因临时表空间满了3、解决办法3.1添加临时表空间的数据文件altertablespaceTEST_TEMPadddatafile'+DATA/ZYGLZXDB/F5324C63FB43C214E0536E9ECE0A6F9E/TEMPFILE/test_temp_01.dbf'size30g;注意:临时......
  • 2849: 【广度优先】【优先队列】游戏装备
     题目描述小未在玩一款武侠游戏,游戏里PK不仅要有高超的操作和智慧,还要有很牛的装备。现在他进入了一个副本,副本里面有极品15星的装备宝箱,但是从副本入口到宝箱有很多条路,当然不可能轻轻松松的拿到极品装备。一路上会随机刷出各种攻击力很强的怪物。它会攻击小未的角色,当然也......
  • 使用SPI+DMA控制算法驱动WS2812
    1、ws2812b是一款集控制电路与发光电路于一体的智能外控LED光源,采用单线归0码协议,每个像素点的三基色颜色可实现256级亮度显示。速率能达到1024pixel×30fps/s,故被广泛用于各种需要大量使用RGB灯的场合。2、不同厂商生产的ws2812存在不同的时序要求,下图是一款最常见的ws2812b......