用户注册&单点登录

Posted 0001

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用户注册&单点登录相关的知识,希望对你有一定的参考价值。

 

package com.tttttt.portal.controller;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import com.tttttt.manager.pojo.User;
import com.tttttt.portal.util.CookieUtils;
import com.tttttt.sso.service.UserService;

@Controller
@RequestMapping("user")
public class UserController {

    @Autowired
    private UserService userService;

    @Value("${TT_TICKET}")
    private String TT_TICKET;

    // type : "POST",
    // //url : "/service/user/doRegister",
    // url : "/user/doRegister.html",
    // data : {password:_password,username:_username,phone:_phone},
    // dataType : ‘json‘,
    // if(result.status == "200")
    /**
     * 用户注册
     * 
     * @param user
     * @return
     */
    @RequestMapping(value = "doRegister", method = RequestMethod.POST)
    @ResponseBody
    public Map<String, Object> doRegister(User user) {
        // 调用sso服务注册用户
        this.userService.saveUser(user);

        // 封装返回数据map
        Map<String, Object> map = new HashMap<>();
        map.put("status", "200");

        return map;
    }

    // type: "POST",
    // url: "/service/user/doLogin?r=" + Math.random(),
    // data: {username:_username,password:_password},
    // dataType : "json",
    // if (obj.status == 200)
    /**
     * 用户登录
     * 
     * @param request
     * @param response
     * @param user
     * @return
     */
    @RequestMapping(value = "doLogin", method = RequestMethod.POST)
    @ResponseBody
    public Map<String, Object> doLogin(HttpServletRequest request, HttpServletResponse response, User user) {
        // 声明返回的map
        Map<String, Object> map = new HashMap<>();

        // 调用单点登录服务,执行用户登录操作,返回ticket
        String ticket = this.userService.doLogin(user);

        // 判断ticket是否为非空
        if (StringUtils.isNotBlank(ticket)) {
            // 如果为非空表示登录成功
            // 把ticket放到cookie中
            CookieUtils.setCookie(request, response, this.TT_TICKET, ticket, 60 * 60 * 24, true);

            // 封装返回数据
            map.put("status", 200);
        }

        // 如果为空,表示登录失败,什么都不做

        // 返回结果
        return map;

    }

}

 

package com.tttttt.sso.service;

import com.tttttt.manager.pojo.User;

public interface UserService {

    /**
     * 检查数据是否可用
     * 
     * @param param
     * @param type
     * @return
     */
    Boolean check(String param, Integer type);

    /**
     * 根据Ticket查询用户
     * 
     * @param ticket
     * @return
     */
    User queryUserByTicket(String ticket);

    /**
     * 用户注册
     * 
     * @param user
     */
    void saveUser(User user);

    /**
     * 用户登录
     * 
     * @param user
     * @return
     */
    String doLogin(User user);

}

 

package com.tttttt.sso.service.impl;

import java.io.IOException;
import java.util.Date;

import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.tttttt.manager.mapper.UserMapper;
import com.tttttt.manager.pojo.User;
import com.tttttt.sso.redis.RedisUtils;
import com.tttttt.sso.service.UserService;

@Service
public class UserServiceImpl implements UserService {

    private static final ObjectMapper MAPPER = new ObjectMapper();

    @Autowired
    private UserMapper userMapper;

    @Value("${tttttt_TICKET_KEY}")
    private String tttttt_TICKET_KEY;

    @Autowired
    private RedisUtils redisUtils;

    @Override
    public Boolean check(String param, Integer type) {
        // 声明查询条件
        User user = new User();

        // 1、2、3分别代表username、phone、email
        switch (type) {
        case 1:
            user.setUsername(param);
            break;
        case 2:
            user.setPhone(param);
            break;
        case 3:
            user.setEmail(param);
            break;

        default:
            break;
        }

        // 根据条件查询
        int count = this.userMapper.selectCount(user);

        // 如果查询结果count为0表示没有人用过,所以返回true,表示可用
        // 如果查询结果count不为0表示有人用过,所以返回false,表示不可用
        return count == 0;
    }

    @Override
    public User queryUserByTicket(String ticket) {
        // 从redis中查询用户的登录信息,是一个json格式的数据
        // 需要给redis中的key增加前缀,便于redis数据的维护和管理
        String json = this.redisUtils.get(this.tttttt_TICKET_KEY + ticket);

        // 判断json不为空
        if (StringUtils.isNotBlank(json)) {
            try {
                // 把json格式的数据转为User对象
                User user = MAPPER.readValue(json, User.class);

                // 如果用户请求这个方法,表示用户是活动的,所以需要重置有效时间
                this.redisUtils.expire(this.tttttt_TICKET_KEY + ticket, 60 * 60);

                // 返回user结果
                return user;
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        // 如果查询结果为空,或者有异常,返回null
        return null;
    }

    @Override
    public void saveUser(User user) {
        // 设置用户的数据
        user.setCreated(new Date());
        user.setUpdated(user.getCreated());

        // 对用户密码进行md5加密
        user.setPassword(DigestUtils.md5Hex(user.getPassword()));

        // 保存用户数据到mysql
        this.userMapper.insert(user);

    }


    @Override
    public String doLogin(User user) {
        // 根据条件从MySQL中查询用户
        user.setPassword(DigestUtils.md5Hex(user.getPassword()));
        User result = this.userMapper.selectOne(user);

        // 如果查到的结果不为空,表示用户登录成功
        if (result != null) {
            // 生成唯一的数,就是ticket
            // 利用redis单线程的特点,使用incr每次加一,获取唯一数
            // ticket就是redis的唯一数+用户id
            String ticket = "" + this.redisUtils.incr("tttttt_TICKET_INCR") + result.getId();

            try {
                // 把ticket和用户的数据(json数据)放到redis中
                this.redisUtils.set(this.tttttt_TICKET_KEY + ticket, MAPPER.writeValueAsString(result), 60 * 60);

                // 返回ticket
                return ticket;
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }

        // 如果查询结果为空或者有异常,返回空
        return null;
    }

}

 

登录的问题:
1.没有欢迎用户的语句
2.cookie中没有ticket的信息

#配置nginx反向代理的时候携带域名
proxy_set_header Host $host;

 

以上是关于用户注册&单点登录的主要内容,如果未能解决你的问题,请参考以下文章

互联网分布式微服务云平台规划分析--SSO单点登录系统

互联网分布式微服务云平台规划分析--SSO单点登录系统

单点登录系统

单点登录SSO

简单代码实现JWT(json web token)完成SSO单点登录

教程篇(7.0) 06. FortiGate基础架构 & 单点登录(FSSO) ❀ Fortinet 网络安全专家 NSE 4