基于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;
}