Shiro限制登录尝试次数

Shiro限制登录尝试次数

/**
* 认证信息.(身份验证) : Authentication 是用来验证用户身份
 * 
 * @param token
 * @return
 * @throws AuthenticationException
 */
@Override
protected AuthenticationInfo doGetAuthenticationInfo(
        AuthenticationToken authcToken) throws AuthenticationException {


    System.out.println("身份认证方法:MyShiroRealm.doGetAuthenticationInfo()");

    UsernamePasswordToken token = (UsernamePasswordToken) authcToken;
    String name = token.getUsername();
    String password = String.valueOf(token.getPassword());
    //访问一次,计数一次
    ValueOperations<String, String> opsForValue = stringRedisTemplate.opsForValue();
    opsForValue.increment(SHIRO_LOGIN_COUNT+name, 1);
    //计数大于5时,设置用户被锁定一小时
    if(Integer.parseInt(opsForValue.get(SHIRO_LOGIN_COUNT+name))>=5){
        opsForValue.set(SHIRO_IS_LOCK+name, "LOCK");
        stringRedisTemplate.expire(SHIRO_IS_LOCK+name, 1, TimeUnit.HOURS);
    }
    if ("LOCK".equals(opsForValue.get(SHIRO_IS_LOCK+name))){
        throw new DisabledAccountException("由于密码输入错误次数大于5次,帐号已经禁止登录!");
    }
    Map<String, Object> map = new HashMap<String, Object>();
    map.put("nickname", name);
    //密码进行加密处理  明文为  password+name
    String paw = password+name;
    String pawDES = MyDES.encryptBasedDes(paw);
    map.put("pswd", pawDES);
    SysUser user = null;
    // 从数据库获取对应用户名密码的用户
    List<SysUser> userList = sysUserService.selectByMap(map);
    if(userList.size()!=0){
        user = userList.get(0);
    } 
    if (null == user) {
        throw new AccountException("帐号或密码不正确!");
    }else if(user.getStatus()==0){
        /**
         * 如果用户的status为禁用。那么就抛出<code>DisabledAccountException</code>
         */
        throw new DisabledAccountException("此帐号已经设置为禁止登录!");
    }else{
        //登录成功
        //更新登录时间 last login time
        user.setLastLoginTime(new Date());
        sysUserService.updateById(user);
        //清空登录计数
        opsForValue.set(SHIRO_LOGIN_COUNT+name, "0");
    }
    return new SimpleAuthenticationInfo(user, password, getName());
}

原文:https://blog.csdn.net/qq_20954959/article/details/61927119 

  

posted @ 2019-01-09 10:15 花儿为何那样红 阅读( ...) 评论( ...) 编辑 收藏
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Shiro 是一个强大且易于使用的Java安全框架,提供了身份认证、授权、加密和会话管理等功能,可以用于构建安全稳定的分布式登录系统。 Shiro 分布式登录的架构可以通过集中式认证、授权服务来实现。在这个架构中,有一个独立的认证授权中心,所有需要登录的应用都将与该中心进行通信。 首先,用户在某个应用中输入用户名和密码进行登录。该应用将用户登录请求发送至认证授权中心。认证授权中心根据接收到的用户名和密码对用户进行认证,验证用户的身份是否合法。 如果认证成功,认证授权中心会生成一份包含用户身份、权限等信息的令牌(Token),并将该令牌返回给应用。应用可以将该令牌保存在客户端,用于后续的访问请求。 当用户访问其他需要登录权限的应用,该应用会将用户的请求发送至认证授权中心进行令牌验证。认证授权中心会根据令牌中的信息判断用户的身份和权限是否满足要求。 如果验证通过,认证授权中心会给予应用相应的访问权限,用户可以成功访问该应用。如果验证不通过,用户将无法访问该应用。 通过这样的分布式登录架构,可以实现用户只需一次登录,就能访问多个应用的需求。这样的架构具有很好的安全性和可扩展性,适用于大规模分布式系统中。 总之,Shiro 分布式登录是一种通过集中式认证授权中心来实现用户统一登录,访问多个应用的安全方案。它能够提供稳定、安全且高效的分布式登录功能,具备广泛的应用价值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值