返回顶部
首页 > 资讯 > 后端开发 > Python >shrio中hashedCredentialsMatcher密码匹配示例详解
  • 778
分享到

shrio中hashedCredentialsMatcher密码匹配示例详解

2024-04-02 19:04:59 778人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

类图如下: SimpleCredentialsMatcher是明文匹配,也是shrio框架默认的比对方式,网上的例子多是此方式。实际项目中,数据库中的密码一般是密文,此时密码的匹配

类图如下:

在这里插入图片描述

SimpleCredentialsMatcher是明文匹配,也是shrio框架默认的比对方式,网上的例子多是此方式。实际项目中,数据库中的密码一般是密文,此时密码的匹配需使用HashedCredentialsMatcher完成。

处理过程

在controller中通过Subject的login(token)将接收过来用户账号和密码(明文)交给shrio框架,示例代码如下

在这里插入图片描述

其次通过HashedCredentialsMatcher告诉shrio使用加密方式;

在这里插入图片描述

最后通过AuthorizingRealm,将数据库中获取的密码,告诉shrio框架,shrio处理完成后返回处理结果。

在这里插入图片描述

示例代码

数据库创建表user,结构如下:


CREATE TABLE `user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) DEFAULT NULL,
  `psw` varchar(200) DEFAULT NULL,
  `user_right` varchar(300) DEFAULT NULL,
  `create_time` date DEFAULT NULL,
  `salt` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`)
) 

在dao完成根据登录名获取实体对象和增加用户两个方法,略过。service代码如下,保存代码时,密码使用sha256加密,盐随机获取20位随机数


@Service("UserService")
public class UserServiceImpl extends ServiceImpl<UserDao, UserEntity> implements UserService {

    @Override
    public UserEntity getUserByname(String loginName) {
        return baseMapper.queryByUserName(loginName);
    }

    @Override
    public boolean save(UserEntity user) {
        user.setCreateTime(new Date());
        String salt = RandomStringUtils.randomAlphanumeric(20);
        user.setPsw(new Sha256Hash(user.getPsw(), salt).toHex());//sha256加密
        user.setSalt(salt);
        try {
            baseMapper.insert(user);
            return true;
        } catch (Exception e) {
            return false;
        }
    }
}

controller代码如下


@RestController
public class UserController {
    @Autowired
    private UserService userService;
    
    @PostMapping("/login")
    public Map<String, Object> login(@RequestParam Map<String, Object> params) {
        String username=params.get("username").toString();
        String passWord=params.get("password").toString();
        String result = "已登录";
        Subject currentUser = SecurityUtils.getSubject();
        UsernamePasswordToken token = new UsernamePasswordToken(username, password);
        if (!currentUser.isAuthenticated()) {
            try {
                currentUser.login(token);// 会触发com.shiro.config.MyShiroRealm的doGetAuthenticationInfo方法
                result = "登录成功";
            } catch (UnknownAccountException e) {
                result = "用户名错误";
            } catch (IncorrectCredentialsException e) {
                e.printStackTrace();
                result = "密码错误";
            }
        }
        return R.ok(result);
    }

    @GetMapping("/loGout")
    public void logout() {
        Subject currentUser = SecurityUtils.getSubject();
        UserEntity user = (UserEntity)currentUser.getPrincipal();
        System.out.println(user.getName());
        currentUser.logout();
    }

    @RequestMapping("/user/add")
    public String add(@RequestBody UserEntity user) {
        userService.save(user);
        System.out.println("新增用户");
        return "hello";
    }
}

使用ShiroConfig 代替xml配置文件方式


@Configuration
public class ShiroConfig {
    @Bean
    public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        //设置自定义的securityManager
        shiroFilterFactoryBean.setSecurityManager(securityManager);
        //设置默认登录的url,身份认证失败会访问该URL
        shiroFilterFactoryBean.setLoginUrl("/login");
        //设置成功,会访问该url
        shiroFilterFactoryBean.setSuccessUrl("/success");
        //设置未授权界面,权限认证失败会访问该url
        shiroFilterFactoryBean.setUnauthorizedUrl("/notRole");
        //进行拦截器配置
        Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
        // <!-- authc:所有url都必须认证通过才可以访问; anon:所有url都都可以匿名访问-->
        filterChainDefinitionMap.put("/WEBjars/**", "anon");
        filterChainDefinitionMap.put("/login", "anon");
        filterChainDefinitionMap.put("/", "anon");
        filterChainDefinitionMap.put("/front/**", "anon");
        filterChainDefinitionMap.put("/user/add", "perms[add]");
        filterChainDefinitionMap.put("/admin/**", "authc");
        filterChainDefinitionMap.put("/user/**", "authc");
        //主要这行代码必须放在所有权限设置的最后,不然会导致所有 url 都被拦截 剩余的都需要认证
        filterChainDefinitionMap.put("/**", "authc");
        //配置logout过滤器
        filterChainDefinitionMap.put("/logout","logout");       shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
        return shiroFilterFactoryBean;
    }
    @Bean
    public SecurityManager securityManager() {
        DefaultWebSecurityManager defaultSecurityManager = new DefaultWebSecurityManager();
        defaultSecurityManager.setRealm(customRealm());
        return defaultSecurityManager;
    }

    @Bean
    public CustomRealm customRealm() {
        CustomRealm customRealm = new CustomRealm();
        //SimpleCredentialsMatcher明文匹配,hashedCredentialsMatcher加盐匹配
        customRealm.setCredentialsMatcher(hashedCredentialsMatcher());
        return customRealm;
    }

    @Bean
    public HashedCredentialsMatcher hashedCredentialsMatcher() {
        HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher();
        hashedCredentialsMatcher.setHashAlgorithmName("SHA-256");
        hashedCredentialsMatcher.setHashIterations(1);
        return hashedCredentialsMatcher;
    }

}

Realm中代码如下:


public class CustomRealm extends AuthorizingRealm {
    @Autowired
    private UserService userService;
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
       //授权部分代码略
        return null;
    }

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        String loginName = (String) authenticationToken.getPrincipal();

        UserEntity user= userService.getUserByname(loginName);
        if (user == null) {  // 没找到帐号 
            throw new UnknownAccountException();
        }

        // 交给AuthenticatingRealm使用CredentialsMatcher进行密码匹配
        SimpleAuthenticationInfo authenticationInfo =
                new SimpleAuthenticationInfo(user, user.getPsw(), ByteSource.Util.bytes(user.getSalt()),getName());

        return authenticationInfo;
    }

测试,使用张三登录

在这里插入图片描述

在这里插入图片描述

以上就是shrio中hashedCredentialsMatcher密码匹配示例详解的详细内容,更多关于shrio中hashedCredentialsMatcher密码匹配的资料请关注编程网其它相关文章!

--结束END--

本文标题: shrio中hashedCredentialsMatcher密码匹配示例详解

本文链接: https://lsjlt.com/news/137929.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • shrio中hashedCredentialsMatcher密码匹配示例详解
    类图如下: SimpleCredentialsMatcher是明文匹配,也是shrio框架默认的比对方式,网上的例子多是此方式。实际项目中,数据库中的密码一般是密文,此时密码的匹配...
    99+
    2024-04-02
  • Rust模式匹配示例详解
    目录函数斐波那契数列函数小结函数 今天学习的内容是 Rust 中的函数。 函数,和 if 条件控制,while、loop、for 循环控制,在底层都是使用跳转实现的,所以函数也属于流...
    99+
    2022-11-13
    Rust 模式匹配 Rust 模式
  • AndroidIntentFilter的匹配规则示例详解
    目录前言一、Activity的调用模式1、显式调用2、隐式调用二、IntentFilter匹配规则详解1、Action的匹配规则2、category的匹配规则3、data的匹配规则d...
    99+
    2022-12-09
    Android IntentFilter匹配规则 Android IntentFilter
  • 全面详解JS正则中匹配技巧及示例
    目录引言组名匹配具名组匹配解构赋值替换前瞻后顾捕获分组补充$&,&n知识点总结引言 在做项目的时候难免会遇到很多奇葩解析字符串的需求,简单的字符串通过内置方法就能解...
    99+
    2023-01-04
    JS正则匹配技巧 JS正则匹配
  • Python+FuzzyWuzzy实现模糊匹配的示例详解
    目录1. 前言2. FuzzyWuzzy库介绍2.1 fuzz模块2.2 process模块3. 实战应用3.1 公司名称字段模糊匹配3.2 省份字段模糊匹配4. 全部函数代码在日常...
    99+
    2024-04-02
  • java暴力匹配及KMP算法解决字符串匹配问题示例详解
    目录要解决的问题?一、暴力匹配算法一个图例介绍KMP算法二、KMP算法算法介绍一个图例介绍KMP算法  代码实现要解决的问题? 一、暴力匹配算法 一个图例介绍KMP算法 St...
    99+
    2024-04-02
  • python OpenCV实现图像特征匹配示例详解
    目录目标Brute-Force匹配器的基础使用ORB描述符进行Brute-Force匹配什么是Matcher对象?带有SIFT描述符和比例测试的Brute-Force匹配基于匹配器的...
    99+
    2023-05-17
    python OpenCV图像特征匹配 python OpenCV
  • 如何在Python中隐藏和加密密码示例详解
    目录前言maskpass()安装:askpass():advpass():base64()在输入时间内隐藏用户密码总结前言 有多种 Python 模块用于隐藏用户输入的密码,其中一个...
    99+
    2024-04-02
  • C语言解决堆栈括号匹配问题示例详解
    目录首先构建栈调用匹配函数代码调用1.括号匹配问题就是当遇到{( [这些左括号的时 将括号字符入栈 2.当遇到右括号时判断栈顶元素是不是与左括号匹配如果匹配就出栈 如果不匹配就直接结...
    99+
    2024-04-02
  • Java实现字符串匹配的示例代码
    目录java实现字符串匹配暴力匹配KMP算法java实现字符串匹配 暴力匹配 private static int violence(String str1, String str...
    99+
    2024-04-02
  • Match在java中匹配的示例分析
    这篇文章将为大家详细讲解有关Match在java中匹配的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言的代表,实现了...
    99+
    2023-06-14
  • Java 括号匹配问题案例详解
    目录前言例题算法思想算法举例代码栈类括号匹配核心算法完整代码运行结果前言 括号匹配问题算是栈应用中比较经典的问题了,在数据结构的书中还有各种考试中会出现。最近刷题的时候也遇到了,就想...
    99+
    2024-04-02
  • Vue中babel.config.js配置示例详解
    目录1 概述2 Babel 的工作原理2.1 如何设置?2.2 @babel/core @babel/cli @babel/preset-env 到底做了哪些事情3 插件Polyfi...
    99+
    2023-02-01
    vue babel.config.js配置 babel.config.js
  • Android Java实现余弦匹配算法示例代码
     Java实现余弦匹配算法 最近在做一个通讯交友的项目,项目中有一个这样的需求,通过用户的兴趣爱好,为用户寻找推荐兴趣相近的好友。其实思路好简单,把用户的兴趣爱好和其...
    99+
    2022-06-06
    JAVA 示例 余弦 算法 Android
  • Android中IntentFilter匹配规则的示例分析
    这篇文章将为大家详细讲解有关Android中IntentFilter匹配规则的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。IntentFilter的匹配规则IntentFilter的使用假如我们...
    99+
    2023-05-30
    android
  • oracle数据匹配merge into的实例详解
    oracle数据匹配merge into的实例详解 前言:  很久之前,估计在2010年左右在使用Oralce,当时有个需求就是需要对两个表的数据进行匹配,这两个表的数据结构一致,一个是正式表,...
    99+
    2024-04-02
  • Java中正则表达式匹配过程实例详解
    目录下面是Java正则表达式的语法字符:正则表达式简单的匹配过程:(1) 基础匹配过程(2)贪婪模式(3)非贪婪模式 (4)零宽度匹配过程总结正则表达式:定义字符串的模式,...
    99+
    2024-04-02
  • java 中模式匹配算法-KMP算法实例详解
    java 中模式匹配算法-KMP算法实例详解朴素模式匹配算法的最大问题就是太低效了。于是三位前辈发表了一种KMP算法,其中三个字母分别是这三个人名的首字母大写。简单的说,KMP算法的对于主串的当前位置不回溯。也就是说,如果主串某次比较时,当...
    99+
    2023-05-31
    java kmp ava
  • c++元编程模板函数重载匹配规则示例详解
    目录前言开始模板函数重载匹配规则模板匹配规则使用最后前言 模板元编程,是一个听起来非常硬核的概念,会感觉这个东西非常的难,是大佬才能掌握的内容。而事实上,他也确实不简单(手动狗头)...
    99+
    2023-01-13
    c++元编程模板函数 c++ 模板函数匹配规则 c++ 模板函数重载匹配
  • FlutterRSA加密解密的示例代码
    目录对称加密非对称加密第一步、首先pubspec.yaml中添加依赖第二步、获取公钥私钥文件第三步、在pubspec.yaml文件中添加公钥私钥文件。第四步、实现Encrypt加密解...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作