CAS5.3自定义登录校验规则

news2024/11/6 9:54:40

前一篇文章介绍过CAS自定义用户信息, 这个用户信息实在登录成功后加到session中的, 今天来介绍一下CAS5.3怎么自定义登录校验逻辑

思路

有了前一篇文章的铺垫这一次自定义登录校验其实就很简单了, 因为想要把用户信息放入到session中是一定要在登陆的时候完成的,因此这次我们需要做的就是重新写一个登录校验的逻辑

重写AbstractPreAndPostProcessingAuthenticationHandler

前一篇文章中已经用到了这个抽象类, 这次要要做的还是改造它, 我们可以在之前的基础上来改造

/**
 * 自定义登录拦截器
 *
 * @author zzt
 * @version v1.0.0
 * @date 2024/7/17
 */
@Setter
public class MyAuthenticationHandler extends AbstractPreAndPostProcessingAuthenticationHandler {

    private SysUserService sysUserService;

    public MyAuthenticationHandler(String name,
                                   ServicesManager servicesManager,
                                   PrincipalFactory principalFactory,
                                   Integer order) {
        super(name, servicesManager, principalFactory, order);
    }

    @Override
    protected AuthenticationHandlerExecutionResult doAuthentication(Credential credential) throws GeneralSecurityException, PreventedException {
        final UserPwdCredential originalUserPass = (UserPwdCredential) credential;
        String username = originalUserPass.getUsername();
        String password = originalUserPass.getPassword();
        String phone = originalUserPass.getPhone();
        String smsVerifyCode = originalUserPass.getSmsVerifyCode();

        //查询用户信息
        SysUser sysUser = sysUserService.getBaseMapper().selectOne(Wrappers.<SysUser>lambdaQuery().eq(SysUser::getUserName, username));
        if (ObjectUtils.isNotEmpty(sysUser)) {
            if (StringUtils.equals(username, sysUser.getUserName()) &&
                    StringUtils.equals(PasswordUtil.getPassword(password, sysUser.getSalt()), sysUser.getPassword())) {
                if (Objects.equals(sysUser.getPhone(), phone) && StringUtils.isNotBlank(smsVerifyCode)) {
//仅判断用户是否输入了自己的手机号,需要自行修改
                    return createHandlerResult(credential,
                            this.principalFactory.createPrincipal(username), Collections.emptyList());
                } else {
                    throw new RuntimeException("验证码错误");
                }
            } else {
                throw new RuntimeException("用户名或密码错误");
            }
     

        } else {
            throw new RuntimeException("用户不存在");
        }

    }

    @Override
    public boolean supports(Credential credential) {
        return credential instanceof UserPwdCredential;
    }
}

这里逻辑其实很简单, 就是验证完用户名密码之后还要验证手机号验证码, 我们常用到的双因子认证, 之前文章中有提到过下面这个方法,请继续往下看

Credential

这里是CAS默认登录逻辑的参数, 仅有用户名和密码, 在上一篇文章中也有提到过这里其实是一个策略模式, 因此我们只需要继承UsernamePasswordCredential类就可以了, 注意这里前端在给后端传参时一定要是这四个属性, 不然是无法进入到我们这个实现类的, 在这里我卡了挺长时间

继承后的实现

/**
 * 自定义登录参数
 *
 * @author zzt
 * @version v1.0.0
 * @date 2024/7/17
 */
@EqualsAndHashCode(callSuper = true)
@Data
public class UserPwdCredential extends UsernamePasswordCredential {


    @Size(min = 1, message = "手机号不能为空!")
    private String phone;

    @Size(min = 1, message = "验证码不能为空!")
    private String smsVerifyCode;
}

 继承DefaultLoginWebflowConfigurer

/**
 * 自定义登录
 *
 * @author zzt
 * @version v1.0.0
 * @date 2024/7/17
 */
public class CustomLoginWebflowConfigurer extends DefaultLoginWebflowConfigurer {


    public CustomLoginWebflowConfigurer(FlowBuilderServices flowBuilderServices, FlowDefinitionRegistry flowDefinitionRegistry, ApplicationContext applicationContext, CasConfigurationProperties casProperties) {
        super(flowBuilderServices, flowDefinitionRegistry, applicationContext, casProperties);
    }

    @Override
    protected void createRememberMeAuthnWebflowConfig(Flow flow) {
            createFlowVariable(flow, CasWebflowConstants.VAR_ID_CREDENTIAL, UserPwdCredential.class);
            final ViewState state = getState(flow, CasWebflowConstants.STATE_ID_VIEW_LOGIN_FORM, ViewState.class);
            final BinderConfiguration cfg = getViewStateBinderConfiguration(state);
            cfg.addBinding(new BinderConfiguration.Binding("phone", null, true));
            cfg.addBinding(new BinderConfiguration.Binding("smsVerifyCode", null, true));

    }
}

 我们还需要把要接收的这两个新参数添加到这里来

改前端

这里的前端页面用到的是webflow技术, 还是比较老的, 因此改起来比较麻烦,这里我们就参考原来的写法,给它新加参数即可

修改 resources/template/loginfrom.html

<section class="form-group form-grouptwo">
<!--                            <label for="username" th:utext="#{screen.welcome.label.netid}">Username</label>-->
                            <div th:if="${openIdLocalId}">
                                <strong>
                                    <span th:utext="${openIdLocalId}"/>
                                </strong>
                                <input type="hidden"
                                       id="username"
                                       name="username"
                                       th:value="${openIdLocalId}"/>
                            </div>
                            <div th:unless="${openIdLocalId}" class="input-group">
                                <div class="input-group-prepend">
                                <span class="input-group-text">
                                    <img th:src="@{images/zhanghao.png}" alt="Username Icon"/>
                                </span>
                                </div>
                                <input class="form-control required form-place"
                                       id="username"
                                       size="25"
                                       tabindex="1"
                                       placeholder="请输入登录账号"
                                       type="text"
                                       th:disabled="${guaEnabled}"
                                       th:field="*{username}"
                                       th:accesskey="#{screen.welcome.label.netid.accesskey}"
                                       autocomplete="off"/>
                            </div>
                        </section>

                        <section class="form-group form-grouptwo">
<!--                            <label for="password" th:utext="#{screen.welcome.label.password}">Password</label>-->

                            <div class="input-group">
                                <div class="input-group-prepend">
                                <span class="input-group-text">
<!--                                    <img src="path/to/your/image.png" alt="Password Icon" width="20" height="20">-->
                                     <img th:src="@{images/mima.png}" alt="Password Icon"/>
                                </span>
                                </div>
                                <input class="form-control required form-place"
                                       type="password"
                                       id="password"
                                       size="25"
                                       tabindex="2"
                                       placeholder="请输入登录密码"
                                       th:accesskey="#{screen.welcome.label.password.accesskey}"
                                       th:field="*{password}"
                                       autocomplete="off"/>
                                <span id="capslock-on" style="display:none;">
                                <p>
                                    <i class="fa fa-exclamation-circle"></i>
                                    <span th:utext="#{screen.capslock.on}"/>
                                </p>
                            </span>
                            </div>
                        </section>
<!--                        手机-->
                        <section class="form-group form-grouptwo">
                            <!--                            <label for="password" th:utext="#{screen.welcome.label.password}">Password</label>-->
                            <div class="input-group">
                                <div class="input-group-prepend">
                                <span class="input-group-text">
<!--                                    <img src="path/to/your/image.png" alt="Password Icon" width="20" height="20">-->
                                     <img th:src="@{images/shoujihao.png}" alt="shoujihao Icon"/>
                                </span>
                                </div>
                                <input class="form-control required form-place"
                                       type="text"
                                       id="phone"
                                       th:field="*{phone}"
                                       size="25"
                                       tabindex="3"
                                       placeholder="请输入手机号码"
                                       autocomplete="off"/>
                                <span id="capslock-on" style="display:none;">
                                <p>
                                    <i class="fa fa-exclamation-circle"></i>
                                    <span th:utext="#{screen.capslock.on}"/>
                                </p>
                            </span>
                            </div>
                        </section>

                        <!--验证码-->
                        <section class="form-group form-grouptwo">
                            <!--                            <label for="password" th:utext="#{screen.welcome.label.password}">Password</label>-->
                            <div class="input-group">
                                <div class="input-group-prepend">
                                <span class="input-group-text">
<!--                                    <img src="path/to/your/image.png" alt="Password Icon" width="20" height="20">-->
                                     <img th:src="@{images/yanzhengma.png}" alt="smsVerifyCode Icon"/>
                                </span>
                                </div>
                                <input class="form-control required form-place form-absolute"
                                       type="text"
                                       id="smsVerifyCode"
                                       th:field="*{smsVerifyCode}"
                                       size="25"
                                       tabindex="4"
                                       placeholder="请输入验证码"
                                       autocomplete="off"/>
                                <button class="form-sendbutton" id="sendCodeBtn">发送验证码</button>
                                <span id="countdown" class="countdown"></span>
                                <span id="capslock-on" style="display:none;">
                                <p>
                                    <i class="fa fa-exclamation-circle"></i>
                                    <span th:utext="#{screen.capslock.on}"/>
                                </p>
                            </span>
                            </div>
                        </section>

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

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

相关文章

Codeforces Round 960 (Div. 2) A~E

A. Submission Bait &#xff08;思维&#xff09; 题意&#xff1a; A l i c e Alice Alice 和 B o b Bob Bob 正在玩一个数组 a a a 中大小为 n n n 的游戏。 他们轮流进行操作&#xff0c; A l i c e Alice Alice先开始。无法操作的玩家将输掉。首先&#xff0c;将变量…

常用控件之 QWidget

目录 一、控件概述 1.关于控件体系的发展&#xff1a; 二、QWidget 核心属性 1.核心属性概览 2.enabled 3.geometry &#x1f335;window frame&#xff08;窗口框架&#xff09; 的影响 4.windowTitle 5.windowIcon &#x1f335;使用 qrc 文件管理资源 6.windowOpa…

微信公众号上线12周年了,12年前的公众号历史文章怎么找?抓取了公众号历史文章同步到博客,找起来方便了

为了方便看看12年来这些号发过的文章 2023 批量下载公众号文章内容/话题/图片/封面/视频/音频&#xff0c;导出文章pdf和抓取文章数据包含阅读数/点赞数/在看数/留言数&#xff0c;我抓取了其中一些号的所有历史文章同步到博客 : 比如深圳卫健委从2014年更新&#xff0c;到2023…

Reqable:跨平台HTTP开发与调试工具

在当今快速发展的互联网时代&#xff0c;HTTP协议作为网络通信的基础&#xff0c;其开发和调试工具的选择对开发效率有着重要影响。本文将详细介绍一款新型的跨平台HTTP开发和调试工具——Reqable&#xff0c;它支持HTTP1、HTTP2以及最新的HTTP3(QUIC)协议&#xff0c;为开发、…

超秒集物:助力品牌商腾飞,共筑强国梦想

在当今竞争激烈的商业世界中&#xff0c;每一个小微企业都怀揣着成为世界 500 强的梦想。它们虽然微小&#xff0c;但都在努力绽放出属于自己的光芒。而超秒集物&#xff0c;以其独特的平台力量&#xff0c;为众多小微企业照亮了前行的道路&#xff0c;助力它们追逐梦想&#x…

贝叶斯之光:照亮机器学习领域的算法瑰宝

一、贝叶斯算法概述 贝叶斯算法起源于英国数学家托马斯贝叶斯&#xff08;Thomas Bayes&#xff09;在18世纪提出的贝叶斯定理。该定理是概率论中的一个重要定理&#xff0c;描述了条件概率之间的关系。其基本形式可以表示为&#xff1a; P(A∣B)P(B)P(B∣A)P(A)​ 其中&…

C++进阶:C++11新增语法(1)

文章目录 1. 统一的列表初始化1.1 &#xff5b;&#xff5d;初始化 1.2 std::initializer_list2. 声明2.1 auto2.2 decltype3.3 nullptr 4 范围for循环5 STL中一些变化6 右值引用和移动语义6.1 左值引用和右值引用6.2 左值引用与右值引用特性6.3 左值引用和右值引用使用场景和意…

图的应用--最小生成树

一. 前言 生成树的概念&#xff1a; 生成树是图的极小连通子图&#xff0c;也就是去掉一条边就非连通的图&#xff0c;并且这个图的所有顶点都由边连接在一起&#xff0c;但不存在回路。 生成树的特点&#xff1a;一个图可以有很多个不同的生成树。生成树的顶点个数和图的顶点个…

另一棵树的子树 - 力扣(LeetCode)C语言

572. 另一棵树的子树 - 力扣&#xff08;LeetCode&#xff09;&#xff08;点击前面链接即可查看题目&#xff09; 一、题目 给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在&#xff0c;返回 true &#xff1b;否则&…

反转链表 II(LeetCode)

题目 给你单链表的头指针 和两个整数 和 &#xff0c;其中 。请你反转从位置 到位置 的链表节点&#xff0c;返回 反转后的链表 。 解题 class ListNode:def __init__(self, value0, nextNone):self.value valueself.next nextdef reverseBetween(head: ListNode, lef…

即使是 Linux 用户也应该看看这篇文章。

关注公众号网络研究观获取更多内容。 安全启动至少从 Windows 8 开始就成为一项标准功能。 顾名思义&#xff0c;该功能可保护启动过程。 通过对启动过程中使用的任何软件&#xff08;“固件”&#xff09;进行数字签名&#xff0c;可确保启动过程的完整性。 与任何数字签名…

量产部落SM2258XT开卡软件,SM2258XT主控128G SSD固态卡死修复

故障现象&#xff1a;连接此固态硬盘后电脑就会卡死&#xff0c;拔掉重新连接概率性显示盘符&#xff0c;显示了之后也不能正常操作&#xff0c;一点击打开&#xff0c;电脑就立马卡死。 解决过程&#xff1a;下载了很多款量产工具&#xff0c;都不能开卡成功&#xff0c;点击…

【传知代码】受限前缀注意机制的事件关系识别(论文复现)

在自然语言处理的前沿&#xff0c;受限前缀注意机制正逐渐成为事件关系识别领域的关键技术。随着文本数据的不断增长和复杂性的提升&#xff0c;识别文本中事件之间的关系变得愈发重要和具有挑战性。受限前缀注意机制作为一种新兴的技术手段&#xff0c;通过有效地捕获文本中的…

不同太阳光波长定制设备太阳光模拟器

日光中不同波长的作用 太阳光不仅是地球上生命活动的能量来源&#xff0c;也对人类的生活产生了深刻的影响。了解太阳光的特性和对地球生态系统的贡献&#xff0c;对于我们保护环境、合理利用太阳能资源具有重要意义。科迎法电气作为太阳光模拟器的制造商可以根据不同的需求定制…

【Verilog-CBB】开发与验证(4)——RS前向打拍器

引言 我们知道时序路径的建立时间收敛依赖于触发器之间的组合逻辑延迟&#xff0c;以及时钟周期。对于一个确定的设计一般来说&#xff0c;时钟频率不会有太多的让步&#xff0c;因此修时序的时候主要发力点就是减小触发器之间组合逻辑延迟。一方面可以通过组合逻辑优化来降低…

Studying-代码随想录训练营day56| 108.冗余连接、109.冗余连接II

第56天&#xff0c;图论06&#xff0c;并查集题目类型冗余连接(ง •_•)ง&#x1f4aa;&#xff0c;编程语言&#xff1a;C 目录 108.冗余连接 109.冗余连接II 总结 108.冗余连接 文档讲解&#xff1a;手撕冗余连接 题目&#xff1a;108. 冗余连接 (kamacoder.com) 学习&…

SpringSecurity-3(认证和授权+SpringSecurity入门案例+自定义认证+数据库认证)

SpringSecurity使用数据库数据完成认证 5 SpringSecurity使用数据库数据完成认证5.1 认证流程分析5.1.1 UsernamePasswordAuthenticationFilter5.1.2 AuthenticationManager5.1.3 AbstractUserDetailsAuthenticationProvider5.1.4 AbstractUserDetailsAuthenticationProvider中…

跟《经济学人》学英文:2024年08月03日这期 How to make tourism work for locals and visitors alike

How to make tourism work for locals and visitors alike Holidays don’t have to be hell 原文&#xff1a; The dollar is hovering near a two-decade high. That has unleashed a multitude of American tourists keen to exercise their newfound spending power, m…

图的应用---最短路径

目录 一. 前言 二. Dijkstra算法 三. Floyd算法 一. 前言 所谓最短路径&#xff1a;就是在有向网当中&#xff0c;A点&#xff08;源点&#xff09;到达B点&#xff08;终点&#xff09;的多条路径中&#xff0c;寻找一条各边权值之和最小的路径&#xff0c;即最短路径。 如果…

Linux--TCP协议

传输层协议TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是一种面向连接的、可靠的、基于字节流的传输层通信协议&#xff0c;会对数据的传输进行一个详细的控制。 TCP协议段格式 TCP协议段格式是TCP协议在网络传输数据时所使用的结构单…