首页 > 其他分享 >springsecurity通过策略模式设置统一认证接口

springsecurity通过策略模式设置统一认证接口

时间:2024-07-28 17:33:12浏览次数:13  
标签:RuntimeException xcUser authParamsDto 认证 接口 new springsecurity public

 还是回到这张图:我们想不止使用数据库查找的方法去实现认证,而是使用一个统一的认证方法,首先需要修改DaoAuthenticationProvider内实现功能7的方法

protected void additionalAuthenticationChecks(UserDetails userDetails, UsernamePasswordAuthenticationToken authentication) 
//详细参见DaoAuthenticationProvider源码,本方法主要是用于判断凭据、匹配密码

因此我们需要重写DaoAuthenticationProvider,将该方法置空,这样后续使用微信扫码、短信验证的时候不需要进入这一环节

 

@Component
@Slf4j
public class DaoAuthenticationProviderCustom extends DaoAuthenticationProvider {
    @Autowired
    public void setUserDetailsService(UserDetailsServiceImpl userDetailsService) {
        super.setUserDetailsService(userDetailsService);//将自定义的UserDetailsService注入
    }
    @Override
    protected void additionalAuthenticationChecks(UserDetails userDetails, UsernamePasswordAuthenticationToken authentication) throws AuthenticationException {

    }
}

 

接下来我们继续重构UserDetailsServiceImpl,让其调用不同认证方法实现认证:

创建AuthService接口,通过密码登录实现类,微信扫码实现类等实现接口(策略模式),这时一个接口有了多个实现方法,我们该如何使用具体方法?

1.注入ApplicationContext

@Autowired
ApplicationContext applicationContext;

2.通过getBean方法获取具体bean

AuthService authService = applicationContext.getBean(beanName, AuthService.class);
//authService.xxx()

3.密码校验实现类

@Service("passwordAuthServiceImpl")
public class PasswordAuthServiceImpl implements AuthService {
    @Autowired
    XcUserMapper xcUserMapper;
    @Autowired
    PasswordEncoder passwordEncoder;
    @Autowired
    CheckCodeClient checkCodeClient;
    @Override
    public XcUserExt execute(AuthParamsDto authParamsDto) {
        if (StringUtils.isEmpty(authParamsDto.getCheckcode())||StringUtils.isEmpty(authParamsDto.getCheckcodekey())) {
             throw new RuntimeException("验证码失效了!再试试吧");
        }
        // feign来校验验证码
        Boolean verify = checkCodeClient.verify(authParamsDto.getCheckcodekey(), authParamsDto.getCheckcode());
        if(verify==null||!verify){
            throw new RuntimeException("验证码校验失败");
        }

        String username = authParamsDto.getUsername();
        XcUser xcUser = xcUserMapper.selectOne(new LambdaQueryWrapper<XcUser>().eq(XcUser::getUsername, username));
        if(Objects.isNull(xcUser)){
            throw new RuntimeException("用户不存在");
        }
        String password = authParamsDto.getPassword();
        if(!passwordEncoder.matches(password,xcUser.getPassword())){
            throw new RuntimeException("账号或密码不正确");
        }
        XcUserExt xcUserExt = new XcUserExt();
        BeanUtils.copyProperties(xcUser,xcUserExt);
        return xcUserExt;
    }
}

 

标签:RuntimeException,xcUser,authParamsDto,认证,接口,new,springsecurity,public
From: https://www.cnblogs.com/kun1790051360/p/18328497

相关文章

  • 七天.NET 8操作SQLite入门到实战 - 第七天Blazor学生管理页面编写和接口对接(3)
    前言本章节我们的主要内容是完善Blazor学生管理页面的编写和接口对接。七天.NET8操作SQLite入门到实战详细教程第一天SQLite简介第二天在Windows上配置SQLite环境第三天SQLite快速入门第四天EasySQLite前后端项目框架搭建第五天引入SQLite-netORM并封装......
  • [java]小程序,用接口的方式计算两个数的加减乘除
           ......
  • js切割接口域名前缀。
    在请求图片时,可能会有有域名的,或没域名的地址,这就需要判断,把字符串域名把域名前缀剪切掉letdomain="https://www.example.com"; //剪切掉域名前缀functiontrimDomainPrefix(url){  //定义需要剪切的前缀列表  constprefixes=["http://","https://",......
  • 智谱GLM Api接口适配langchain OpenAI llamaindex的openAI接口
    动机OpenAI充值比较麻烦,且访问不是那么方便。因此想用国内的api的去调试和测试一个任务。但是很多教程都是以openAI的接口为例子的,因此学习起来就不那么方便。本文参考了hugggingface中迁移OpenAI的博客,chatGLMcookbook关于接口的迁移文档,llamindexOpenAIlike的示例,终于调......
  • 利用Java调用银行卡二要素接口
    一、什么是银行卡二要素?银行卡二要素验证接口是一种API接口,主要用于验证用户提供的银行卡号与姓名这两个要素是否一致。二、银行卡二要素作用及场景有哪些?其作用是通过核验用户的身份信息,判断是否为目标用户本人操作,常用于安全级别要求一般的使用场景,具体应用场景包括:1.......
  • 利用Java免费调用运营商三要素接口
    一、什么是运营商三要素?运营商三要素接口一般用于核验姓名、身份证号、手机号是否一致。它是电信运营商基于留存的实时数据,设计成API接口的形式,为有相关运营商查询核验需求的用户提供接入服务。二、以下是运营商三要素接口常见的使用场景:1.金融服务:在开户、贷款、申请信用......
  • 抽象类和接口
    在Java中,抽象类和接口是两种不同的概念,它们各自有一些独特的特点。下面分别介绍这两种概念的特点:抽象类(AbstractClass)定义:抽象类是一种不能被实例化的类,它通常包含一些抽象方法(没有方法体的方法)和/或具体实现的方法。抽象类可以有构造器、字段、具体方法和抽象方法。......
  • 微服务集成springsecurity实现认证
    module:auth1.添加依赖:spring-cloud-starter-security与spring-cloud-starter-oauth22.配置WebSecurityConfig:注入AuthenticationManager覆写configure3.配置tokenConfig4.授权服务器配置:AuthorizationServerextendsAuthorizationServerConfigurerAdapter配置客户端详细任务,......
  • Python调用ChatTTS API接口
    Python调用ChatTTSAPI接口:#*********************************************#author:wgscd#date:2024-7-27#installlist:#pipinstallfastapi#pipinstallrequests#pipinstalluvicorn[standard]#在命令行中运行以下命令来启动服务器:#uvicornmain:app--reload......
  • 本地海康大华和录像机接入公网EasyCVR平台----调用查看设备状态,报警信息,实时播放,视频
    一.登录  GET/api/v1/login参数 字段类型描述usernameString用户名passwordString密码(经过md5加密,32位长度,不带中划线,不区分大小写)200字段类型描述    TokenString开启鉴权后访问接口需要带上Token信息    TokenTimeoutNumberToken超时(秒)Ea......