单点登录☞token

单点登录☞token

单点登陆的介绍

单点登录(Single Sign On),简称为 SSO,是比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

token

Token是用户进行一些权限操作时的许可凭证。token本质是字符串,里面包含了用户信息,过期时间,加密方式等。token是在前端进行登录之后,由服务器分发给前端,然后前端进行权限操作时,再将token发送给服务器,由服务器来验证。token是有过期时间的,一但token过期,用户就要重新登陆让服务器生成新的token。

token实现单点登录

类似于京东、淘宝这样的一个电商项目。因为采用的是分布式项目结构,各个模块分别是一个单独的应用,分属不同的服务器,想要实现一处登录,多处使用,肯定不能再用session了。

单点登录是指在系统中只需登录一次,就可以访问多个不同的应用系统,而无需再次登录。在一个分布式的Web应用系统中,单点登录是一个非常重要的功能需求。

下面是使用Spring Boot + Redis实现单点登录的示例代码:

1. pom.xml中添加依赖:

```xml
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
  1. 在application.yml中配置Redis连接信息:
spring:
  redis:
    host: localhost
    port: 6379
    database: 0
    timeout: 10000
  1. 创建一个Token生成类TokenManager,实现生成和验证Token的方法:
@Component
public class TokenManager {
    private static final String TOKEN_PREFIX = "token:";
    private static final long TOKEN_EXPIRATION = 1800; // token过期时间,单位为秒

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    /**
     * 生成token
     */
    public String generateToken(String userId) {
        String token = UUID.randomUUID().toString().replaceAll("-", "");
        redisTemplate.opsForValue().set(TOKEN_PREFIX + token, userId, TOKEN_EXPIRATION, TimeUnit.SECONDS);
        return token;
    }

    /**
     * 验证token
     */
    public boolean validateToken(String token) {
        if (StringUtils.isEmpty(token)) {
            return false;
        }
        String key = TOKEN_PREFIX + token;
        return redisTemplate.hasKey(key);
    }

    /**
     * 根据token获取用户id
     */
    public String getUserIdFromToken(String token) {
        if (StringUtils.isEmpty(token)) {
            return null;
        }
        String key = TOKEN_PREFIX + token;
        Object value = redisTemplate.opsForValue().get(key);
        if (value != null) {
            return value.toString();
        }
        return null;
    }

    /**
     * 删除token
     */
    public void deleteToken(String token) {
        if (!StringUtils.isEmpty(token)) {
            String key = TOKEN_PREFIX + token;
            redisTemplate.delete(key);
        }
    }
}
  1. 创建一个登录Controller,实现登录和单点登录验证的接口:
@RestController
public class LoginController {
    @Autowired
    private TokenManager tokenManager;

    /**
     * 登录接口
     */
    @PostMapping("/login")
    public String login(String userId, String password) {
        // TODO 验证用户名密码
        // 生成token并返回给前端
        String token = tokenManager.generateToken(userId);
        return token;
    }

    /**
     * 单点登录验证接口
     */
    @GetMapping("/sso")
    public String sso(String token) {
        if (tokenManager.validateToken(token)) {
            String userId = tokenManager.getUserIdFromToken(token);
            // TODO 根据用户id查询用户信息
            // TODO 将用户信息返回给前端
            return "验证通过";
        } else {
            return "验证失败";
        }
    }
}

在以上示例代码中,TokenManager中的generateToken方法用于生成token,并将token和用户id存储在Redis中。validateToken方法用于验证传入的token是否有效,getUserIdFromToken方法用于获取token对应的用户id,deleteToken方法用于删除token。LoginController中的login接口用于登录验证,并生成token并返回给前端;sso接口用于单点登录验证,如果验证通过则返回用户信息,否则返回验证失败信息。

你可能感兴趣的:(java,spring,boot)