返回顶部
首页 > 资讯 > 精选 >springboot怎么整合shiro实现多验证登录功能
  • 364
分享到

springboot怎么整合shiro实现多验证登录功能

2023-06-08 07:06:57 364人浏览 薄情痞子
摘要

这篇“SpringBoot怎么整合shiro实现多验证登录功能”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“springbo

这篇“SpringBoot怎么整合shiro实现多验证登录功能”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“springboot怎么整合shiro实现多验证登录功能”文章吧。

1. 首先新建一个shiroConfig shiro的配置类,代码如下:

@Configurationpublic class SpringShiroConfig {        @Bean    public SecurityManager securityManager(Collection<Realm> realms) {        DefaultWEBSecurityManager sManager = new DefaultWebSecurityManager();        sManager.setRealms(realms);        return sManager;    }    @Bean    public ShiroFilterFactoryBean shiroFilterFactory(SecurityManager securityManager) {        ShiroFilterFactoryBean sfBean = new ShiroFilterFactoryBean();        sfBean.setSecurityManager(securityManager);        //如果是匿名访问时,访问了不能访问的资源跳转的位置        sfBean.setLoginUrl("/index");        //定义map指定请求过滤规则(哪些资源允许匿名访问,哪些必须认证访问)        LinkedHashMap<String, String> map = new LinkedHashMap<>();        //静态资源允许匿名访问:"anon" 静态资源授权时不能写static下面所有的开放,要将static下面的所有文件夹一个一个的开放,templates同理        //map的key可以为文件的位置,也可以为请求的路径        map.put("/bower_components    @Override    public void setCredentialsMatcher(CredentialsMatcher credentialsMatcher) {                HashedCredentialsMatcher matcher = new HashedCredentialsMatcher();        //这里是设置加密方式        matcher.setHashAlGorithmName("MD5");        //这里是设置加密的次数        matcher.setHashIterations(2);        super.setCredentialsMatcher(matcher);    }        @Override    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {        return null;    }        @Override    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {        //先判断这个是否是来及这个令牌的数据:我们这儿分为了UsernamePassWordToken(shiro给我们提供的。)、UserPhoneToken        if (!(authenticationToken instanceof UsernamePasswordToken)) {            return null;        }        //获取controller传过来的数据        UsernamePasswordToken upToken = (UsernamePasswordToken) authenticationToken;        //upToken.setRememberMe(true);shiro默认为false,是是否记住我的功能        //这儿为用户提交的username        String username = upToken.getUsername();        //去数据更加name取到用户的信息        User user = userDao.findUserByUserName(username);        //判断数据库是否有这用户        if (user == null) {            throw new UnknownAccountException();        }        //判断用户的状态是否被禁用(数据库的字段)        if (user.getState() == 0) {            throw new LockedAccountException();        }        //这儿是取到用户信息中的盐值,盐值要转换为ByteSource这个类型才能使用        ByteSource credentialsSalt = ByteSource.Util.bytes(user.getSalt());        //这儿是将这个用户的信息交给shiro(user为用户对象,user.getPassword()是要加密的对象,credentialsSalt为盐值,getName()当前对象)        SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user, user.getPassword(), credentialsSalt, getName());        return info;    }}

3. 此时用户的账号密码登录已经可以使用了controller代码如下:

@RequestMapping("userPasswordLogin")    @ResponseBody    public JSONResult userPasswordLogin(String username, String password) {        Subject subject = SecurityUtils.getSubject();        UsernamePasswordToken token = new UsernamePasswordToken(username, password);        subject.login(token);        return new jsonResult("login Ok");    }

4. 我们现在来实现短信验证码登录实现:

4.1 先写UserPhoneToken,我放在l和springShiroConfig同一目录下:

@Componentpublic class UserPhoneToken extends UsernamePasswordToken implements Serializable {    private static final long serialVersionUID = 6293390033867929958L;    // 手机号码    private String phoneNum;    //无参构造    public UserPhoneToken(){}        //获取存入的值    @Override    public Object getPrincipal() {        if (phoneNum == null) {            return getUsername();        } else {            return getPhoneNum();        }    }    @Override    public Object getCredentials() {        if (phoneNum == null) {            return getPassword();        }else {            return "ok";        }    }    public UserPhoneToken(String phoneNum) {        this.phoneNum = phoneNum;    }    public UserPhoneToken(final String userName, final String password) {        super(userName, password);    }    public String getPhoneNum() {        return phoneNum;    }    public void setPhoneNum(String phoneNum) {        this.phoneNum = phoneNum;    }    @Override    public String toString() {        return "PhoneToken [PhoneNum=" + phoneNum + "]";    }}

4.2 在写shiroUserPhoneRealm,代码如下:

@Servicepublic class ShioUserPhoneRealm extends AuthorizingRealm {    @Autowired    private UserDao userDao;    @Override    public void setCredentialsMatcher(CredentialsMatcher credentialsMatcher) {        //这儿的CredentialsMatcher的new的对象必须是AllowAllCredentialsMatcher        CredentialsMatcher matcher = new AllowAllCredentialsMatcher();        super.setCredentialsMatcher(matcher);    }    @Override    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {        return null;    }        @Override    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {        UserPhoneToken token = null;        if (authenticationToken instanceof UserPhoneToken) {            token = (UserPhoneToken) authenticationToken;        }else {            return null;        }        //获取我发送验证码是存入session中的验证码和手机号        String verificationCode = (String) SecurityUtils.getSubject().getSession().getAttribute("verificationCode");        String phone = (String) SecurityUtils.getSubject().getSession().getAttribute("phone");        //获取controller传过来的数据        String verificationCode1 = (String) token.getPrincipal();        //去数据库根据手机号查询用户信息        User user = userDao.findUserByUserPhone(phone);        if (StringUtils.isEmpty(verificationCode)) {            throw new ServiceException("网络错误");        }        //比对手机号        if (!verificationCode.equals(verificationCode1)) {            throw new ServiceException("验证码不正确");        }        if (user == null) {            throw new UnknownAccountException();        }        if (user.getState() == 0) {            throw new LockedAccountException();        }        return new SimpleAuthenticationInfo(user,phone,getName());    }}

4.3 手机号码登录验证已经基本完成:controller代码如下:

@PostMapping("verificationCodeLogin")    @ResponseBody    public JsonResult verificationCodeLogin(String password) {        Subject subject = SecurityUtils.getSubject();        UserPhoneToken token = new UserPhoneToken(password);        subject.login(token);        return new JsonResult("login OK");    }

使用过程中遇到的bug

1.

org.apache.shiro.authc.UnknownAccountException: Realm [cn.tedu.wxacs.service.impl.ShioUserPhoneRealm@768d8431] was unable to find account data for the submitted AuthenticationToken [org.apache.shiro.authc.UsernamePasswordToken - 张三, rememberMe=false].

出现这个问题是我的是因为Realm中的某个实现类没有加注解,我这儿演示时是应为ShiroUserRealm为加@Service注解

2.

org.apache.shiro.authc.AuthenticationException: Authentication token of type [class org.apache.shiro.authc.UsernamePasswordToken] could not be authenticated by any configured realms.  Please ensure that at least one realm can authenticate these tokens.

这儿出现的问题是应为我的ShioUserRealm的AuthenticationInfo方法的User user = userDao.findUserByUserName(username);这行代码出现的问题,debug的时候就发现这一句执行后就保错

原因:是因为我的application.yml文件中没有写dao对应的mapper文件的路径

3. 在ShioUserPhoneRealm的doGetAuthenticationInfo方法的new SimpleAuthenticationInfo(user,phone,getName())这个位置后就报错是应为ShioUserPhoneRealm的这个方法中你没有将new的对象设置为AllowAllCredentialsMatcher();

@Override    public void setCredentialsMatcher(CredentialsMatcher credentialsMatcher) {        //这儿的CredentialsMatcher的new的对象必须是AllowAllCredentialsMatcher        CredentialsMatcher matcher = new AllowAllCredentialsMatcher();        super.setCredentialsMatcher(matcher);    }

以上就是关于“springboot怎么整合shiro实现多验证登录功能”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网精选频道。

--结束END--

本文标题: springboot怎么整合shiro实现多验证登录功能

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

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

猜你喜欢
  • springboot怎么整合shiro实现多验证登录功能
    这篇“springboot怎么整合shiro实现多验证登录功能”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“springbo...
    99+
    2023-06-08
  • springboot中怎么利用shiro实现多验证登录功能
    springboot中怎么利用shiro实现多验证登录功能,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。 首先新建一个shiroConfig shiro的配置类...
    99+
    2023-06-20
  • springboot整合shiro多验证登录功能的实现(账号密码登录和使用手机验证码登录)
    1. 首先新建一个shiroConfig shiro的配置类,代码如下: @Configuration public class SpringShiroConfig { ...
    99+
    2024-04-02
  • Springboot整合Shiro怎么实现登录与权限校验
    这篇文章主要介绍“Springboot整合Shiro怎么实现登录与权限校验”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Springboot整合Shiro怎么实现登录与权限校验”文章能帮助大家解决问...
    99+
    2023-06-30
  • springboot整合shiro实现登录验证授权的过程解析
    springboot整合shiro实现登录验证授权,内容如下所示: 1.添加依赖: <!-- shiro --> <dependency> ...
    99+
    2024-04-02
  • springboot如何整合shiro实现登录验证授权的过程解析
    本篇文章为大家展示了springboot如何整合shiro实现登录验证授权的过程解析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。springboot整合shiro实现登录验证授权,内容如下所示:1...
    99+
    2023-06-29
  • vue+springboot+shiro+jwt实现登录功能
    目录1.导入依赖2.JWTToken 替换 Shiro 原生 Token3.JWT token 工具类,提供JWT生成、校验、获取token存储的信息4.JWTFilter请求拦截5...
    99+
    2024-04-02
  • springboot整合shiro实现记住我功能
    前言 上一篇 文章我们完成了在 thymeleaf 模板引擎中使用 shiro 标签,也就是根据不同的用户身份信息,前端页面来显示不同的页面内容。本篇文章我们来完成在登录页面的记住我...
    99+
    2024-04-02
  • Springboot整合Shiro实现登录与权限校验详细解读
    目录Springboot-cli 开发脚手架系列简介前言1. 环境2. 简介3. Realm配置4. 核心配置5. 接口编写6. 网页资源7. 效果演示8. 源码分享Springbo...
    99+
    2024-04-02
  • SpringBoot整合kaptcha实现图片验证码功能
    目录栗子配置文件SpringBoot项目中pom.xml文件项目代码项目结构SpringBootVerifyCodeApplication.javaVerifyCodeConfig....
    99+
    2024-04-02
  • 如何在SpringBoot中使用Shiro怎么实现一个邮件验证码登录功能
    如何在SpringBoot中使用Shiro怎么实现一个邮件验证码登录功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。导入依赖(pom.xml)  &...
    99+
    2023-06-06
  • Go怎么整合captcha实现验证码功能
    这篇“Go怎么整合captcha实现验证码功能”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Go怎么整合captcha实现验...
    99+
    2023-07-05
  • SpringSecurity整合springBoot、redis实现登录互踢功能
    背景 基于我的文章——《SpringSecurity整合springBoot、redis token动态url权限校验》。要实现的功能是要实现一个用户不可以同时在两台设备上登录,有两...
    99+
    2024-04-02
  • Express + Session 实现登录验证功能
    1. 写在前面 当我们登录了一个网站,在没有退出登录的情况下,我们关闭了这个网站 ,过一段时间,再次打开这个网站,依然还会是登录状态。这是因为,当我们登录了一个网站,服务器会保存我们的登录状态,直到我们退出...
    99+
    2022-06-04
    功能 Express Session
  • java实现登录验证码功能
    本文实例为大家分享了java实现登录验证码功能的具体代码,供大家参考,具体内容如下 登录验证码 登录验证是大多数登录系统都会用到的一个功能,它的验证方式也是有很多种,例如登录验证码,...
    99+
    2024-04-02
  • Go整合captcha实现验证码功能
    目录1 captcha概述2 实现代码(使用内存缓存)2.1 后端代码2.2 前端代码2.3 注意点3 自定义Store(使用Redis缓存)3.1 自定义对象并实现Store抽象3...
    99+
    2023-03-01
    Go captcha实现验证码功能 Go captcha验证码 Go captcha
  • SpringBoot整合微信登录功能的实现方案
    目录1. OAuth2解决什么问题?2. 微信扫描登录2.1 添加必要的依赖2.2 application.properties 添加配置2.3 登录请求2.4 前端1. OAuth...
    99+
    2024-04-02
  • Vue3实现登录表单验证功能
    目录一.实现思路与效果图二.实现具体过程三.完整代码与效果图一.实现思路与效果图 使用async-validator 插件,阿里出品的 antd 和 ElementUI 组件库中表单...
    99+
    2024-04-02
  • Springboot整合第三方登录功能的实现示例
    springboot 项目的pom文件引入依赖 <dependency> <groupId>me.zhyd.oauth</groupId>...
    99+
    2024-04-02
  • 登录校验之滑块验证码完整实现(vue + springboot)
    文章目录 前言一、实现效果二、实现思路三、实现步骤1. 后端 java 代码1.1 新建一个拼图验证码类1.2 新建一个拼图验证码工具类1.3 新建一个 service 类1.4 新建一个 controller 类1.5 登录接口 ...
    99+
    2023-08-18
    vue.js spring boot java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作