Shiro 实现免密登陆

需求:对接第三方登陆,实现绕过原有Shiro认证登陆。

文章目录

          • 一、实现思路
            • 1. 现状分析
            • 2. 用户来源
            • 3. 所属范围
          • 二、实现方案
            • 2.1. 自定义登录认证规则
            • 2.2. Shiro认证枚举
            • 2.3. 密码和非密码登录
            • 2.4. 规则配置
            • 2.5. 自定义Realm
            • 2.6. 案例使用

一、实现思路
1. 现状分析

系统权框架默认使用Shiro 认证授权机制

2. 用户来源

从统一认证平台登录跳转过来的用户

3. 所属范围

登录限制由统一认证平台去做,但是,跳转过来的用户仍然走您本系统的登录流程,只是走本系统的登录流程时,想跳过Shiro 对用户密码的校验,校验所属范围为Shiro 认证机制,其他功能照旧;

二、实现方案
2.1. 自定义登录认证规则
package com.gblfy.config.skipshiro;import com.gblfy.config.skipshiro.enums.ShiroApproveLoginType;
import org.apache.shiro.authc.UsernamePasswordToken;/*** 自定义token 实现免密和密码登录* <p>* 1.账号密码登陆(password)* 2.免密登陆(nopassword)* </p>** @author gblfy* @date 2021-10-22*/
public class EasyUsernameToken extends UsernamePasswordToken {private static final long serialVersionUID = -2564928913725078138L;private ShiroApproveLoginType type;public EasyUsernameToken() {super();}/*** 免密登录*/public EasyUsernameToken(String username) {super(username, "", false, null);this.type = ShiroApproveLoginType.NOPASSWD;}/*** 账号密码登录*/public EasyUsernameToken(String username, String password, boolean rememberMe) {super(username, password, rememberMe, null);this.type = ShiroApproveLoginType.PASSWORD;}public ShiroApproveLoginType getType() {return type;}public void setType(ShiroApproveLoginType type) {this.type = type;}}
2.2. Shiro认证枚举
package com.gblfy.config.skipshiro.enums;/*** Shiro认证枚举* @author gblfy* @date 2021-10-22*/
public enum ShiroApproveLoginType {/** 密码登录 */PASSWORD("PASSWORD"),/** 密码登录 */NOPASSWD("NOPASSWORD");/** 状态值 */private String code;private ShiroApproveLoginType(String code) {this.code = code;}public String getCode() {return code;}
}
2.3. 密码和非密码登录
package com.gblfy.config.skipshiro;import com.gblfy.config.skipshiro.enums.ShiroApproveLoginType;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.credential.HashedCredentialsMatcher;/*** 自定义登录认证方案* <p>* 1.免密登录,不加密* 2.密码登录,md5加密* </p>** @author gblfy* @date 2021-10-22*/
public class EasyCredentialsMatch extends HashedCredentialsMatcher {/*** 重写方法* 区分 密码和非密码登录* 此次无需记录登录次数 详情看SysPasswordService*/@Overridepublic boolean doCredentialsMatch(AuthenticationToken token, AuthenticationInfo info) {EasyUsernameToken easyUsernameToken = (EasyUsernameToken) token;//免密登录,不验证密码if (ShiroApproveLoginType.NOPASSWD.equals(easyUsernameToken.getType())) {return true;}//密码登录Object tokenHashedCredentials = hashProvidedCredentials(token, info);Object accountCredentials = getCredentials(info);return equals(tokenHashedCredentials, accountCredentials);}
}
2.4. 规则配置
    @Beanpublic EasyCredentialsMatch customCredentialsMatch() {EasyCredentialsMatch customCredentialsMatch = new EasyCredentialsMatch();customCredentialsMatch.setHashAlgorithmName("md5");customCredentialsMatch.setHashIterations(3);customCredentialsMatch.setStoredCredentialsHexEncoded(true);return customCredentialsMatch;}
2.5. 自定义Realm

权限认证 保持默认,修改登录认证

public class UserRealm extends AuthorizingRealm {/*** 权限认证  */@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {//权限认证  代码省略}/*** 登录认证*/@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {EasyUsernameToken upToken = (EasyUsernameToken) token;String username = upToken.getUsername();SysUser user = null;// 密码登录if (upToken.getType().getCode().equals(LoginType.PASSWORD.getCode())) {String password;if (upToken.getPassword() != null) {password = new String(upToken.getPassword());try {user = loginService.login(username, password);} catch (Exception e) {log.info("对用户[" + username + "]进行登录验证..验证未通过{}", e.getMessage());throw new AuthenticationException(e.getMessage(), e);}}} else if (upToken.getType().getCode().equals(LoginType.NOPASSWD.getCode())) {// 第三方登录 TODO}SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user, upToken.getPassword(), getName());return info;}
}
2.6. 案例使用
    public AjaxResult login(String username, String password, Boolean rememberMe) {EasyUsernameToken token = new EasyUsernameToken(username, password, rememberMe);Subject subject = SecurityUtils.getSubject();try {subject.login(token);return success();} catch (AuthenticationException e) {String msg = "用户或密码错误";if (StringUtils.isNotEmpty(e.getMessage())) {msg = e.getMessage();}return error(msg);}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/517002.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

bootstrap table 搜索列formatter之后,单字节搜索异常

bootstrap table 搜索列formatter之后&#xff0c;单字节搜索异常 最近发现搜索这边出现这个问题&#xff0c;这样搜索没有效果 后面发现是因为搜索列formatter之后就会出现这个问题&#xff0c;那么我们就多生成一列不使用formatter并隐藏这列 <!DOCTYPE html> <h…

完了!TCP出了大事!

来源 | 编程技术宇宙责编 | 晋兆雨封图 | CSDN 下载自视觉中国不速之客夜黑风高&#xff0c;乌云蔽月。两位不速之客&#xff0c;身着黑衣&#xff0c;一高一矮&#xff0c;潜入Linux帝国。这一潜就是一个多月&#xff0c;直到他们收到了一条消息高个&#xff1a;“上峰终于给我…

基于Flutter+FaaS的业务框架思考与实践

闲鱼将使用Flutter和FaaS来建设未来的技术开发体系&#xff0c;这是一项长期的规划&#xff0c;新的技术在现在看来犹如雾里看花&#xff0c;需要我们不断的思考&#xff0c;探索&#xff0c;实践才能渐渐描绘出它的轮廓。本文对此提供一种思考角度&#xff0c;对未来基于FaaSF…

集合判断哪非空 、2个集合取交集/并集/差集

文章目录<dependency><groupId>org.apache.commons</groupId><artifactId>commons-collections4</artifactId><version>4.4</version></dependency>Testpublic void SetOperations() {List<String> listA new ArrayLis…

机器学习在高德用户反馈信息处理中的实践

1.背景 作为国内领先的出行大数据公司&#xff0c;高德地图拥有众多的用户和合作厂商&#xff0c;这为高德带来了海量的出行数据&#xff0c;同时通过各个渠道&#xff0c;这些用户也在主动地为我们提供大量的反馈信息&#xff0c;这些信息是需要我们深入挖掘并作用于产品的&a…

div中同时存在文本和数字超过两行出省略号

div中同时存在文本和数字超过两行出省略号 设置文本超过两行出省略号出现下面问题&#xff0c;未到指定宽度就换行 width: 255px;overflow: hidden;text-overflow: ellipsis;display: -webkit-box;-webkit-box-orient: vertical;-webkit-line-clamp: 2;word-wrap: break-word…

前端框架/工具汇总

文章目录一、数据框架1. vue2. react二、UI框架2.1. element2.2. element-plus2.3. Ant Design Vue2.4. Ant Design of React2.5. Bootstrap三、工具3.1. Fast Mock3.2. Easy Mock3.3. Mock语法/案例一、数据框架 1. vue https://cn.vuejs.org/ 2. react https://react.do…

没错!现在搞 Python 越来越难了!!

今天&#xff0c;想跟大家聊聊 Python 能力的提升。结合我最近这些年的Python学习、开发经验&#xff0c;发现 90% 的人在学Python时都会遇到下面这些问题&#xff1a;1.想学Python&#xff0c;但应用方向太多了&#xff0c;没编程经验根本不知道该怎么学...2.基础入门看似简单…

端计算Walle:2235亿次运算,为了无法计算的端智能价值

本文知识点提炼&#xff1a; 1、端计算在移动设备上的应用探索 2、技术方案与核心模块设计 3、总结与展望 背景 传统的云计算&#xff0c;使用的是端侧采集数据&#xff0c;云端处理消费&#xff0c;再反馈给端侧的模式。而伴随着数字化转型的浪潮、万物互联时代的到来&…

Serverless 解惑——函数计算如何访问 MySQL 数据库

函数计算&#xff08;Function Compute&#xff09;&#xff1a;函数计算 是事件驱动的全托管计算服务。使用函数计算&#xff0c;您无需采购与管理服务器等基础设施&#xff0c;只需编写并上传代码。函数计算为您准备好计算资源&#xff0c;弹性地可靠地运行任务&#xff0c;并…

ant-design-vue 环境搭建及入门

1.首先需搭建vue环境 2.安装环境&#xff08;根据官网&#xff09; npm install -g vue/cli &#xff08;建议国内不使用npm安装&#xff0c;使用cnpm这样会快点&#xff09;cnpm install -g vue/cli 3.新建一个项目 切换到需要创建项目文件夹下&#xff0c;运行创建项目命令…

小程序 json 解析

它传来的值是这样的 {"resultcode":"200","reason":"SUCCESSED!","result":[{"1":{"variety":"Au100g","latestpri":"268.50","openpri":"269.02"…

摊牌了:我就靠这几点,搞定了算法面试官

很多时候&#xff0c;你即使提前复习了这些最常见的面试算法题&#xff0c;你依旧无法通过算法面试&#xff01;为什么&#xff1f;1. 你在提前准备复习的时候&#xff0c;在网上找了半天相应题目的分析文章&#xff0c;但你看了就是不懂。2. 你在面试的时候&#xff0c;卡壳了…

从零开始入门 K8s | 调度器的调度流程和算法介绍

导读&#xff1a;Kubernetes 作为当下最流行的容器自动化运维平台&#xff0c;以声明式实现了灵活的容器编排&#xff0c;本文以 v1.16 版本为基础详细介绍了 K8s 的基本调度框架、流程&#xff0c;以及主要的过滤器、Score 算法实现等&#xff0c;并介绍了两种方式用于实现自定…

js json数据传递传递、json数据解析

在js 中&#xff0c;前台数据传递到后台&#xff0c;需要使用JSON.stringify&#xff08;&#xff09;传递 wx.navigateTo({url:../textcontent/textcontent?arraylist2 JSON.stringify(that.data.arraylist2), success:function(res) {console.log("成功回调",re…

vue-resource安装

进入项目cd到项目所在目录 运行命令 我们一般用第二种方式运行 1&#xff09;.npm install vue-resource 2&#xff09;.这种方式会将数据写入package.json这样将项目发送给其他用户时项目会有问题 cnpm install vue-resource --save 3.main.js导入vue-resource

2019年全球最受欢迎数据库新鲜出炉,你猜中了吗?

全球知名的数据库流行度排行榜网站DB-Engines 宣布&#xff0c;在过去的一年里&#xff0c;MySQL在 DB-Engines排名中比其他350个受监测数据库管理系统的任何一个更受欢迎。 因此&#xff0c;MySQL为2019年的年度DBMS。 DB-Engines 2019&#xff1a; MySQL 获得“年度数据库”称…

IT 实力较量:决战超级数据中心之巅

作者 | 马超责编 | 伍杏玲出品 | CSDN&#xff08;ID:CSDNnews&#xff09;今年的新冠疫情让不少人认识到云计算的战略意义&#xff1a;今年5月&#xff0c;IBM 新 CEO 克里希纳在上任伊始就表示&#xff0c;IBM将专注于AI和混合云&#xff0c;将它们视为未来的关键技术。谷歌云…

自建Hive数据仓库跨版本迁移到阿里云E-MapReduce

最佳实践概述 应用场景 客户在IDC或者公有云环境自建Hadoop集群&#xff0c;数据集中保存在HDFS文件系统&#xff0c;同时借助Hive进行常见的ETL任务。客户在决策上云之后&#xff0c;会将自建Hadoop集群的数据迁移到阿里云自建Hadoop或者EMR。 技术架构 本实践方案基于如下…

fastjson 序列化时指定json的key值

json字符串中的key是下划线例如&#xff1a;foot_dist&#xff0c;而实际实体类中的属性是footDist&#xff0c;添加 JSONField(name "foot_dist")即可 package com.gblfy;import com.alibaba.fastjson.annotation.JSONField; import lombok.AllArgsConstructor; i…