Paso a paso de inicio de sesión único (1): comprensión del inicio de sesión único

Breve introducción de SSO

Inicio de sesión único En sistemas de aplicaciones múltiples, solo necesita iniciar sesión una vez para acceder a otros sistemas de aplicaciones de confianza mutua.

El problema con el inicio de sesión único

  • Las cookies no pueden cruzar el dominio

Solución: después de iniciar sesión en sso, puede establecer el dominio de la cookie en el dominio superior, es decir, .a.com, para que todos los sistemas de subdominios puedan acceder a la cookie del dominio superior. Al configurar las cookies, solo podemos configurar el dominio superior y nuestro propio dominio, no otros dominios.

  • la sesión no se puede compartir

Solución: compartir sesión, como springSession, o usar un centro de certificación, la función de usar un centro de certificación es que, siempre que el usuario inicie sesión en el centro de certificación, es equivalente a iniciar sesión en todos los sistemas. De
esta manera, los usuarios deben visitar primero el centro de certificación al acceder a otros sistemas Si el usuario ya inició sesión. Si no hay inicio de sesión, el centro de certificación debe guiar al usuario para iniciar sesión y devolver la información de inicio de sesión exitosa al sistema original. El
centro de certificación también debe almacenar la información de dirección de todos los subsistemas que se pueden registrar en el centro. .

Estoy un poco perplejo aquí. ¿Cómo determina la autoridad de certificación la información de identidad del usuario? ¿Y cómo sabe qué usuario ha iniciado sesión desde otros sistemas?
De hecho, todavía tengo que volver a la cookie. Espero poder entenderlo más tarde.

La primera realización de un centro de certificación simple.

 @RestController
public class AuthController {
    public static HashMap<String, String> tokens = new HashMap<>();
    @Autowired
    RestTemplate restTemplate; @GetMapping(value = "/isLogin/{token}")
    public Result isLogin(@PathVariable("token") String token, HttpServletRequest request) {

        //查询本地认证中心本地session或者redis或者 该用户是否已经登陆
        //todo
        //模拟已登陆

        //代表已登陆,生成一个唯一token 传给客户端.并在本地存储相应的键值
        //在tokens里根据这个token来查找是否存在,//todo JWT了解一下
        //存在就把这个令牌回显,然后将令牌回显,该用户已经在认证中心登陆
        Result result = new Result();
        if (tokens.containsKey(token)) {
            //todo 这里可以加深加密的逻辑,不应该这么简单
            result.setMsg("用户已经登陆");
            return result;
        } else {
            //未登录 跳转到登陆页面
            Result result1 = new Result();
            result1.setMsg("用户未登陆,请引导登陆!");
            return result1;
        }

    }


    @PostMapping(value = "/login")
    public Result login(User user) {
        //验证登陆
        if ("123".equals(user.getPassword())) {
            //登陆成功还是要在认证中心存储该用户
            String tkV = UUID.randomUUID().toString();
            String tkK = UUID.randomUUID().toString();
            //key值不应该为username,这里为了简便.
            //todo 存储到数据库或者redis都可以
            tokens.put(tkK, tkV);
            //然后返回给app 一个唯一token 并将该token也存入redis 或者数据库 这里失去了 原应用的uri
            Result result = new Result();
            result.setMsg("登陆成功");
            //将key值返回给app
            result.setToken(tkK);
            return result;
        } else {
            //登陆失败,重新登陆
            return null;
        }

    }
    }

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Lucha de los estudiantes de la escuela.

Publicado 37 artículos originales · elogiado 6 · visitas 4663

Supongo que te gusta

Origin blog.csdn.net/littlewhitevg/article/details/103833834
Recomendado
Clasificación