首页 > 其他分享 >Spring boot Security OAuth2监听用户登录成功或失败

Spring boot Security OAuth2监听用户登录成功或失败

时间:2022-08-25 18:11:44浏览次数:54  
标签:OAuth2 String Spring boot key new headerTenant public redisTemplate

1:登陆成功监听

@Component
public class AuthenticationSuccessEventListener implements ApplicationListener<AuthenticationSuccessEvent> {
 
    @Autowired
    private RedisCacheUtil redisCacheUtil;
 
 
 
    @Override
    public void onApplicationEvent(AuthenticationSuccessEvent authenticationSuccessEvent) {
        /** 获取请求参数 */
        HttpServletRequest request = WebUtil.getRequest();
        /** 从请求头获取租户ID */
        String headerTenant = request.getHeader(TokenUtil.TENANT_HEADER_KEY);
        /** 从参数获取租户ID */
        String paramTenant = request.getParameter(TokenUtil.TENANT_PARAM_KEY);
        /** 业务检验逻辑,这个按照自己的业务进行处理 start */
        if (StringUtil.isAllBlank(headerTenant, paramTenant)) {
            throw new UserDeniedAuthorizationException(TokenUtil.TENANT_NOT_FOUND);
        }
        /** 业务检验逻辑,这个按照自己的业务进行处理 end */
        String tenantId = StringUtils.isBlank(headerTenant) ? paramTenant : headerTenant;
 
        /** 获取用户信息-账号/密码 */
        Object principal = authenticationSuccessEvent.getAuthentication().getPrincipal();
        if(principal instanceof UserDetails){
            UserDetails bladeUserDetails = (UserDetails) authenticationSuccessEvent.getAuthentication().getPrincipal();
            String account = bladeUserDetails.getUsername();
            /** rendis的key */
            String accountNumKey= LoginUtil.getAccountNumKey(tenantId, account);
 
            /** 登陆成功之后删除redis里面登陆失败的记录 */
            redisCacheUtil.del(accountNumKey);
        }
 
    }

2:登陆失败监听方法一(实现接口)

@Component
public class AuthenticationFailureListener implements ApplicationListener<AuthenticationFailureBadCredentialsEvent> {
 
    @Autowired
    private LoginConfineConfig loginConfineConfig;
 
    @Autowired
    private RedisCacheUtil redisCacheUtil;
 
    @Override
    public void onApplicationEvent(AuthenticationFailureBadCredentialsEvent authenticationFailureBadCredentialsEvent) {
        
        /** 获取请求参数 */
        HttpServletRequest request = WebUtil.getRequest();
        /** 从请求头获取租户ID */
        String headerTenant = request.getHeader(TokenUtil.TENANT_HEADER_KEY);
        /** 从参数获取租户ID */
        String paramTenant = request.getParameter(TokenUtil.TENANT_PARAM_KEY);
        
        /** 业务检验逻辑,这个按照自己的业务进行处理 start */
        if (StringUtil.isAllBlank(headerTenant, paramTenant)) {
            throw new UserDeniedAuthorizationException(TokenUtil.TENANT_NOT_FOUND);
        }
        /** 业务检验逻辑,这个按照自己的业务进行处理 end */
        
        String tenantId = StringUtils.isBlank(headerTenant) ? paramTenant : headerTenant;
        
        /** 获取登陆账号 */
        String account = authenticationFailureBadCredentialsEvent.getAuthentication().getPrincipal().toString();
 
        /** 记录错误次数key */
        String accountNumKey = LoginUtil.getAccountNumKey(tenantId, account);
 
        /** 获取配置的过期时间 */
        long accountVerdueTime = loginConfineConfig.getAccountVerdueTime();
        
        /** 获取配置的错误登陆次数 */
        long accountLoginNum = loginConfineConfig.getAccountLoginNum();
 
        /** 从redis获取登陆失败信息 */
        Object o = redisCacheUtil.get(accountNumKey);
 
        if(o==null){
            /** set进redis-有过期时间 */
            //redisCacheUtil.setNew(accountNumKey,1,accountVerdueTime);
            /** 永久 */
            redisCacheUtil.setNew(accountNumKey,1);
        }else {
            /** 获取失败次数,该方法进行了增量,详情看后面的redis代码 */
            long accountNum = redisCacheUtil.incr(accountNumKey);
            
            if(accountNum >= accountLoginNum){
                throw new UserDeniedAuthorizationException(String.format(TokenUtil.USER_OVERDUE_LOGIN_NUM_PROHIBIT,accountLoginNum));
            }
        }
    }
}

3:登陆失败监听方法二(注解实现)

@Component
public class AuthenticationFailureListener {
 
 
    @EventListener
    public void onFailure(AuthenticationFailureBadCredentialsEvent failure) {
        
        /** 这里的逻辑处理参考实现一 */
        
        System.out.println("这里是通过注解实现登陆失败监听器");
        
 
 
    }
 
}

4.上面提到的reids

    public boolean setNew(String key, Object value) {
        try {
            ValueOperations<String, String>  operations = redisTemplate.opsForValue();
            redisTemplate.setKeySerializer(new StringRedisSerializer());
            redisTemplate.setValueSerializer(new StringRedisSerializer());
            operations.set(key,  value.toString());
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
 
    public boolean setNew(String key, Object value, long time) {
        try {
            ValueOperations<String, String>  operations = redisTemplate.opsForValue();
            redisTemplate.setKeySerializer(new StringRedisSerializer());
            redisTemplate.setValueSerializer(new StringRedisSerializer());
            operations.set(key,  value.toString(), time, TimeUnit.SECONDS);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
 
    public long incr(String key) {
        ValueOperations<String, String>  operations = redisTemplate.opsForValue();
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new StringRedisSerializer());
        return operations.increment(key);
    }

 

标签:OAuth2,String,Spring,boot,key,new,headerTenant,public,redisTemplate
From: https://www.cnblogs.com/chenchengxuyuan/p/16625226.html

相关文章

  • 四、Spring Cloud Alibaba项目,测试模块之生产者与消费者
    1、模块说明生产者:service-order消费者:service-user说明:消费者user调用生产者order,调用订单服务 2、生产者pom文件<?xmlversion="1.0"encoding="UTF-8"?><proj......
  • 【文件下载】SpringBoot文件下载
    1.将文件以流的形式一次性读取到内存,通过响应输出流输出到前端/***@parampath想要下载的文件的路径*@paramresponse*@功能描述下载文件:*/@RequestMapping("......
  • SpringBoot修改启动端口server.port方式
     springboot服务修改端口的方式1、修改application.yml文件这是最简单的方式 2、以jdk参数方式启动java-Dserver.port=3000-jarxx.jar 3、启动参数java......
  • Springboot接入xxl-job
    环境springboot:2.7.2xxl-job-admin:2.3.0xxl-job:2.3.1搭建xxl-job-admin初始化数据库脚本:xxl-job/tables_xxl_job.sqlatmaster·xuxueli/xxl-job(github.com)使......
  • 6、spring注解+springMVC注解+Mybatis注解+log4j+idea+maven
    1、项目结构如下 2、编辑pom.xml文件配置依赖1<?xmlversion="1.0"encoding="UTF-8"?>23<projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi......
  • SpringBoot利用@Async注解实现异步调用
    前言:异步编程是让程序并发运行的一种手段,使用异步编程可以大大提高我们程序的吞吐量,减少用户的等待时间。在Java并发编程中实现异步功能,一般是需要使用线程或者线程池。而......
  • SpringBoot 解析 Html
    使用JSOUP来解析Html网页从网上搜了搜看了下大部分的排版都不是特别好!!!所以我从新写一个。点击进入JSOUP的官网jsoup:JavaHTML解析器jsoup是一个用于处理真实世界H......
  • Spring Gateway网关配置yml文件
    server:port:9000spring:application:name:gatewaycloud:nacos:discovery:#网关也是微服务的一部分所以也要注册到nacos......
  • 解决 cmd 运行spring boot项目提示没有主清单属性
    在编写dockerfile文件中最后的CMD命令报错,把命令拿出来单独跑了一下,发现是打包的时候没有配置主类 百度了一下,解决方案如下所示:https://blog.csdn.net/weixin_49736959/......
  • springboot中Filter的使用
    1.bean注入过滤器@BeanpublicFilterRegistrationBeancompanyUrlFilterRegister(){FilterRegistrationBeanregistration=newFilterRegistrationBea......