广告
返回顶部
首页 > 资讯 > 精选 >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://www.lsjlt.com/news/252557.html(转载时请注明来源链接)

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 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+
    2022-11-12
  • Springboot整合Shiro怎么实现登录与权限校验
    这篇文章主要介绍“Springboot整合Shiro怎么实现登录与权限校验”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Springboot整合Shiro怎么实现登录与权限校验”文章能帮助大家解决问...
    99+
    2023-06-30
  • springboot整合shiro实现登录验证授权的过程解析
    springboot整合shiro实现登录验证授权,内容如下所示: 1.添加依赖: <!-- shiro --> <dependency> ...
    99+
    2022-11-13
  • springboot如何整合shiro实现登录验证授权的过程解析
    本篇文章为大家展示了springboot如何整合shiro实现登录验证授权的过程解析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。springboot整合shiro实现登录验证授权,内容如下所示:1...
    99+
    2023-06-29
  • Springboot整合Shiro实现登录与权限校验详细解读
    目录Springboot-cli 开发脚手架系列简介前言1. 环境2. 简介3. Realm配置4. 核心配置5. 接口编写6. 网页资源7. 效果演示8. 源码分享Springbo...
    99+
    2022-11-13
  • 如何在SpringBoot中使用Shiro怎么实现一个邮件验证码登录功能
    如何在SpringBoot中使用Shiro怎么实现一个邮件验证码登录功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。导入依赖(pom.xml)  &...
    99+
    2023-06-06
  • SpringBoot整合kaptcha实现图片验证码功能
    目录栗子配置文件SpringBoot项目中pom.xml文件项目代码项目结构SpringBootVerifyCodeApplication.javaVerifyCodeConfig....
    99+
    2022-11-13
  • SpringSecurity整合springBoot、redis实现登录互踢功能
    背景 基于我的文章——《SpringSecurity整合springBoot、redis token动态url权限校验》。要实现的功能是要实现一个用户不可以同时在两台设备上登录,有两...
    99+
    2022-11-12
  • SpringBoot整合微信登录功能的实现方案
    目录1. OAuth2解决什么问题?2. 微信扫描登录2.1 添加必要的依赖2.2 application.properties 添加配置2.3 登录请求2.4 前端1. OAuth...
    99+
    2022-11-12
  • Go怎么整合captcha实现验证码功能
    这篇“Go怎么整合captcha实现验证码功能”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Go怎么整合captcha实现验...
    99+
    2023-07-05
  • Springboot整合第三方登录功能的实现示例
    springboot 项目的pom文件引入依赖 <dependency> <groupId>me.zhyd.oauth</groupId>...
    99+
    2022-11-13
  • 怎么在SpringBoot中利用Shiro实现一个密码登录功能
    怎么在SpringBoot中利用Shiro实现一个密码登录功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。导入依赖(pom.xml) <!--...
    99+
    2023-06-06
  • SpringSecurity整合springBoot、redis实现登录互踢功能的示例
    这篇文章主要介绍了SpringSecurity整合springBoot、redis实现登录互踢功能的示例,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。背景要实现的功能是要实现...
    99+
    2023-06-15
  • Springboot+SpringSecurity怎么实现图片验证码登录
    本文小编为大家详细介绍“Springboot+SpringSecurity怎么实现图片验证码登录”,内容详细,步骤清晰,细节处理妥当,希望这篇“Springboot+SpringSecurity怎么实现图片验证码登录”文章能帮助大家解决疑惑...
    99+
    2023-06-30
  • springboot验证码生成及验证功能怎么实现
    这篇“springboot验证码生成及验证功能怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“springboot验证...
    99+
    2023-07-06
  • nodejs怎么实现登陆验证功能
    这篇文章主要介绍“nodejs怎么实现登陆验证功能”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“nodejs怎么实现登陆验证功能”文章能帮助大家解决问题。登陆验证需要提交数据,一种使用form表单提...
    99+
    2023-06-30
  • 使用golang怎么实现一个登录验证码功能
    这篇文章将为大家详细讲解有关使用golang怎么实现一个登录验证码功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。golang适合做什么golang可以做服务器端开发,但golang很适合...
    99+
    2023-06-06
  • spring boot结合kaptcha怎么实现一个验证码登陆功能
    本篇文章给大家分享的是有关spring boot结合kaptcha怎么实现一个验证码登陆功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。引入kaptcha所需要的jar包,我...
    99+
    2023-05-31
    springboot ptc kaptcha
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作