基于redis的简易单点登录系统

基于redis的单点登录设计:

               1、用户登录成功后将登录状态等信息存储到redis

               2、用户携带token去访问资源,资源服务器要基于token从redis查询用户信息

业务代码实现:

首先自定义一个用户名和密码,传到dologin方法中生成token。

在dologin方法中要先判断参数的合法性,用户名和密码要先判断不为null和空,使用.equals方法。抛异常的方法名是IllegalArgumentException。

2、判断用户是否存在,密码是否正确。抛异常是RuntimeException---运行时异常

3、将用户信息存储到redis中,首先要建立jedis连接,通过set方法去存储信息,K使用的token,生成uuid确保token的唯一性。

二、用户携带token去访问资源,资源服务器要基于token在redis查询信息。

首先判断token是否为空,如果为空那么请先登录。

然后基于token查询用户信息,token为K,获取value,是一个user集合,先判断user是否为空,为空则是登录超时,请重新登录。

判断用户是否有访问权限,通过user集合获取权限,

String permissionStr = map.get("permission");--获取全新信息。

 String[] strings = permissionStr.split(",");---通过string.split(",")这个api方法来分隔字符串,生成一个数组

 List<String> stringList = Arrays.asList(strings);----将数组转化成集合,来接收数据,

 if (!stringList.contains("sys:resource:vier")){

                throw new RuntimeException("你没有访问权限");

}----利用集合中的api方法,来判断当前用户有没有权限。

package com.jt.redis;

import com.jt.JedisDataSource;
import redis.clients.jedis.Jedis;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.UUID;

public class SSODemo01 {
//    简易的单点登录系统,1、完成用户身份认证2、完成用户资源访问的权限
//    用户登录成功后,将用户信息存储到redis。并返回给客户端一个token
//    用户携带token访问资源,资源服务器要检查toke的有效性,并基于token查询用户信息
//    用户是否已经认证,假如已认证,还要判断用户是否有访问权限
public static void main(String[] args) {
//    1、执行登录操作
    String username = "tony";
    String password = "123456";
    String token = doLogin(username,password);
    System.out.println(token);
//  2、携带token访问资源
    Object result = doGetResource(token);
    System.out.println(result);
}


    private static String doGetResource(String token) {
        /**
         * 1、检验token是否为空
         * 2、基于token查询用户信息
         * 3、判断用是否已登陆
         * 4、判断用户是否有访问权限
         * 5、返回你要访问的资源
         */
        if (token==null || "".equals(token)){
            throw new IllegalArgumentException("请先登录");
        }
        Jedis jedis = JedisDataSource.getConnection();
        Map<String, String> map = jedis.hgetAll(token);
//        3、判断用户是否已登录,没有登录抛异常
        if (map == null || map.size()==0){
            throw new RuntimeException("登录超时,请重新登录");
        }
        String permissionStr = map.get("permission");
        String[] strings = permissionStr.split(",");
        List<String> stringList = Arrays.asList(strings);
        System.out.println(stringList);
        if (!stringList.contains("sys:resource:vier")){
            throw new RuntimeException("你没有访问权限");
        }
        return "这就是你要访问的资源";
    }

    /**
     * 基于用户和密码登录,登录成功访问权限
     * @param username
     * @param password
     * @return,令牌对象,随机字符,具有唯一性
     */
    private static String doLogin(String username, String password) {
//        1、判断参数的合法性
        if (username == null || "".equals(username)){
            throw new IllegalArgumentException("用户名不能为空");
        }
        if (password == null || "".equals(password)){
            throw new IllegalArgumentException("密码不能为空");
        }
//        2、判断用户是否存在
        if (!"tony".equals(username)){
            throw new RuntimeException("用户不存在");
        }
//        3、判断密码是否正确
        if (!"123456".equals(password)){
            throw new RuntimeException("密码错误");
        }
//        4、将用户信息存储到redis
        Jedis jedis = JedisDataSource.getConnection();
        String token = UUID.randomUUID().toString();
        jedis.hset(token, "username", "tony");
        jedis.hset(token, "permission", "sys:resource:list,sys:resource:create");
        jedis.expire(token, 60);
        jedis.close();
//        5、返回token
        return token;
    }

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值