单点登录接口代码

package com.taotao.sso.service.impl;
service层:代码
import java.util.Date;
import java.util.List;
import java.util.UUID;

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 org.springframework.util.DigestUtils;

import com.taotao.common.utils.JsonUtils;
import com.taotao.common.utils.TaotaoResult;
import com.taotao.mapper.TbUserMapper;
import com.taotao.pojo.TbUser;
import com.taotao.pojo.TbUserExample;
import com.taotao.pojo.TbUserExample.Criteria;
import com.taotao.sso.dao.JedisClient;
import com.taotao.sso.service.UserService;
//service层进行数据库的校验
@Service
public class UserServiceImpl implements UserService {
	@Autowired
	private TbUserMapper  userMapper;
	@Autowired
	private JedisClient jedisClient;
	@Value("${REDIS_SESSION_TOKEN}")
	private String REDIS_SESSION_TOKEN;
	@Value("${REDSI_SESSION_TIME}")
	private Integer REDSI_SESSION_TIME;

	public TaotaoResult checkData(String param, Integer type) {
		TbUserExample example=new TbUserExample();
		Criteria criteria=example.createCriteria();
		//1代表用户名,2代表电话,3代表邮箱
		if (1==type) {
			criteria.andUsernameEqualTo(param);
		}else if (2==type) {
			criteria.andPhoneEqualTo(param);
		}else{
			criteria.andEmailEqualTo(param);
		}
		List<TbUser> result= userMapper.selectByExample(example);
		if(result==null || result.size()==0){
			return TaotaoResult.ok(true);
		}else{
			return TaotaoResult.ok(false);
		}

	}
//用户注册接口实现类
	@Override
	public TaotaoResult loginData(TbUser user) {
		user.setUpdated(new Date());
		user.setCreated(new Date());
		//spring提供了一个MD5加密密码的方式
		user.setPassword("DigestUtils..md5DigestAsHex(user.getPassword().getBytes())");
		userMapper.insert(user);

		return TaotaoResult.ok();
	}
	//登录接口的实现逻辑
	@Override
	public TaotaoResult userLogin(String username, String password) {
		//先查询数据库中是否存在此用户名,若存在则表示用户名正确,再验证密码是否跟数据库中的MD5加密后的是否一样,都满足则登录成功,给予访问者一个token令牌,并将token令牌写入redis
	TbUserExample example=new TbUserExample();
	Criteria criteria=example.createCriteria();
	   criteria.andUsernameEqualTo(username);
	//返回值的快捷键alt+shift+L
		List<TbUser> list = userMapper.selectByExample(example);
		if (list==null || list.size()==0) {
			TaotaoResult.build(400,"用户名或密码不存在");
		}
		//根据用户名查询只能查询到一条记录,所以获取当前这个对象的信息,就是list.get(0)
		TbUser user=list.get(0);
		if(DigestUtils.md5DigestAsHex(password.getBytes())!=user.getPassword() ) {
			TaotaoResult.build(400,"用户名或密码不存在");
		}
		//将密码保存到redis比较危险,所以这里在保存之前将密码去掉
		user.setPassword(null);
		//否则用户名和密码都正确,则可以登录,办法token令牌
		String token=UUID.randomUUID().toString();
		//将token写入redis中,写入的方法要记住。要用到redis的客户端jedis.value的值是序列号的形式
		jedisClient.set(REDIS_SESSION_TOKEN+":"+token, JsonUtils.objectToJson(user));
	  //设置session的过期时间
		jedisClient.expire(REDIS_SESSION_TOKEN+":"+token, REDSI_SESSION_TIME);
//返回token
		return TaotaoResult.ok(token);
	}
	//根据token判断用户是否已经登录
	@Override
	public TaotaoResult userByToken(String token) {
		//从redis中获取token的信息,判断用户是否过期,如果没有过期则更新session时间
		String json = jedisClient.get(REDIS_SESSION_TOKEN+":"+token);
		if (StringUtils.isBlank(json)) {
			return TaotaoResult.build(400,"session已经过期,请重新登录");
		}
		//如果没有过期,则更新session时间
		jedisClient.expire(REDIS_SESSION_TOKEN+":"+token,REDSI_SESSION_TIME);
		//返回给controller层的是json数据

		return TaotaoResult.ok(JsonUtils.jsonToPojo(json, TbUser.class));
	}

}

  

package com.taotao.sso.controller;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.converter.json.MappingJacksonValue;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import com.taotao.common.utils.ExceptionUtil;
import com.taotao.common.utils.TaotaoResult;
import com.taotao.pojo.TbUser;
import com.taotao.sso.service.UserService;

@Controller
@RequestMapping("/user")
public class UserController {
	@Autowired
	private  UserService userService;
	@RequestMapping("/check/{param}/{type}")
	@ResponseBody
	public Object checkDate(@PathVariable String param ,@PathVariable Integer type,String callback){
		TaotaoResult result=null;
		if (param==null) {
			result=TaotaoResult.build(400,"校验内容不能为空");
		}
		if(type==null){
			result=TaotaoResult.build(400,"校验内容不能为空");
		}
		if( type!=1 && type !=2 && type !=3){
			result=TaotaoResult.build(400, "校验内容类型错误");
		}
		//校验出错
				if (null != result) {
					if (null != callback) {
						MappingJacksonValue mappingJacksonValue = new MappingJacksonValue(result);
						mappingJacksonValue.setJsonpFunction(callback);
						return mappingJacksonValue;
					} else {
						return result;
					}
				}
try {
	result=userService.checkData(param, type);
} catch (Exception e) {
	result=TaotaoResult.build(400,ExceptionUtil.getStackTrace(e));
}
//校验出错
if (null != result) {
	if (null != callback) {
		MappingJacksonValue mappingJacksonValue = new MappingJacksonValue(result);
		mappingJacksonValue.setJsonpFunction(callback);
		return mappingJacksonValue;
	} else {
		return result;
	}
}
return result;
	}

	//用户注册接口编写
	@RequestMapping(value="/register",method=RequestMethod.POST)
	@ResponseBody
	public TaotaoResult loginData(TbUser user){
		//利用try catch捕获异常
		try {
			TaotaoResult  result=userService.loginData(user);
			return result;
		} catch (Exception e) {
			e.printStackTrace();
		return TaotaoResult.build(500,ExceptionUtil.getStackTrace(e));
		}

	}
	//登录接口的编写,接口文档提示是post请求,如果不写post则get和post都可以,一般如果接口明确写了则要写post方法
	@RequestMapping(value="/login",method=RequestMethod.POST)
	@ResponseBody
	public TaotaoResult userLogin(String username,String password){
		try {
			TaotaoResult result=userService.userLogin(username, password);
			return result;

		} catch (Exception e) {
			e.printStackTrace();
		return 	TaotaoResult.build(400,ExceptionUtil.getStackTrace(e));

		}
	}
	@RequestMapping("/token/{token}")
	@ResponseBody
	public Object userByToken(@PathVariable String token,String callback){
		TaotaoResult result=null;
		try {
			 result=userService.userByToken(token);
		} catch (Exception e) {
			e.printStackTrace();
			result=TaotaoResult.build(500,ExceptionUtil.getStackTrace(e));
		}
		if (StringUtils.isBlank(callback)) {
			return result;
		}else{
			MappingJacksonValue mappingJacksonValue=new MappingJacksonValue(result);
			mappingJacksonValue.setJsonpFunction(callback);
			return mappingJacksonValue;
		}

	}

}

  

时间: 2024-08-10 04:01:37

单点登录接口代码的相关文章

石化盈科单点登录系统代码分析和总结

由于盈科没有成型的单点登陆系统,目前的现状是需要和阿里的edas系统实现单点登录的功能 .由于业务需要,在阿里巴巴的技术支持下,由我负责改装了阿里提供的雏形样式,实现了盈科自己的单点登陆系统.在这个改版过程中,深深的感觉到自己知识的欠缺,特别是阿里的一些加密和开源架构的使用,让我在这个过程中受益匪浅. 现在把这个过程做一个分析和总结: 1.不跨域SSO-初始登陆 上图的序号的内容如下: 1.浏览器初次访问应用url 2.无session/cookie,重定向到SSO Server登陆url,并且

第三方单点登录的接口编写

结合自身项目中的一个案列来编写第三方单点登录接口,目的是让第三方系统调用我们的接口,无需再次登录,跳转到我们的系统,我们系统自动帮用户进行登录 这个接口需要写两个,第一个则需要生成token,token的作用是防止第三方恶意登录以及会话过期.结合我个人案列的场景,这个案例是图书馆,用户现在在第三方登录,跳到图书馆系统,调用我们这个接口. 这里使用des加密参数生成token. 代码如下,第一个接口: /** * 校验身份和生成token * * @param cardNO 卡号 * @param

单点登录SSO:图示和讲解

h1.title,h2.title { padding-left: 2rem !important; color: rgb(71, 91, 204) !important } h1.title { font-size: 22px !important } h2.title { font-size: 18px !important } .padding { padding: 0 2rem; padding-bottom: 1rem } blockquote.menu { padding-left:

sso单点登录系统

sso单点登录概念 1.一处登录,处处登录.会单独做一个单点登录系统,只负责颁发token和验证token,和页面登录功能. 2.通过在浏览器cookie中放入token,和在redis中对应token放入用户信息的方式,代替session共享,使用jwt(json web token)自定义一个携带用户信息token加密算法. 3.cookie中的token是已经使用过的token,取名oldToken . url地址栏中的token新颁发的token,取名newToken 做法: 1.首先自

单点登录SSO:可一键运行的完整代码

h1.title,h2.title { padding-left: 2rem !important; color: rgb(71, 91, 204) !important } h1.title { font-size: 22px !important } h2.title { font-size: 18px !important } .padding { padding: 0 2rem; padding-bottom: 1rem } blockquote.menu { padding-left:

关于cas-client单点登录客户端拦截请求和忽略/排除不需要拦截的请求URL的问题(不需要修改任何代码,只需要一个配置)

前言:今天在网上无意间看到cas单点登录排除请求的问题,发现很多人在讨论如何通过改写AuthenticationFilter类来实现忽略/排除请求URL的功能:突发奇想搜了一下,还真蛮多人都是这么干的,原谅我是个耿直的boy,当时我笑的饭都喷出来了,只需要一个配置的问题,被你们搞的这么麻烦:虽然很想回复他们"你们这帮人用别人的东西都不看源码的吗?",转念一想,这也要怪作者不给力,文档里压根没有提到这个配置,在这里用少量篇幅讲解如何配置排除不需要拦截的请求URL,后面用大量篇幅介绍我是如

ASP.NET单点登录(代码)

由于某些原因,在我们的应用中会遇到一个用户只能在一个地方登录的情况,也就是我们通常所说的单点登录.在ASP.NET中实现单点登录其实很简单,下面就把主要的方法和全部代码进行分析.[/p][p=25, null, left]实现思路[/p][p=25, null, left]利用Cache的功能,我们把用户的登录信息保存在Cache中,并设置过期时间为Session失效的时间,因此,一旦Session失效,我们的Cache也过期:而Cache对所有的用户都可以访问,因此,用它保存用户信息比数据库来

统一协同工作平台用户管理、单点登录以及任务集成接口说明

目录 1 概述 西北油田分公司信息化经过长期建设,在各个业务点上,逐步搭建了适应业务管理的信息化系统,为分公司经营管理提供了强大的信息化辅助管理支撑. 但是,分公司前期建设的信息化系统都是基于传统办公自动化OA,目前逐步形成了多个单独业务系统组成的OA,如公文.合同.招投标.预结算等系统,这些系统之间没有统一的技术和数据标准,数据不能自动传递和共享,流程控制和标准多样化,从而形成了一个个彼此隔离的信息孤岛. 在此背景上,西北油田分公司搭建了一套整合分公司各种信息资源库的协同工作平台,形成统一.综

最准确的单点登录SSO图示和讲解(有代码范例)|手把手教做单点登录(SSO)系列之二

写第一篇博客<手把手教做单点登录(SSO)系列之一:概述与示例>,就获得了园子里朋友们热情的评论和推荐,感谢各位. 我那篇文章同时发了CSDN和博客园.对比一下,更感受到博客园童鞋们的技术交流热情:这篇文章在CSDN也有几百阅读量了,但评论区还静悄悄的.博客园才几天就有四十多个回复.二十多位童鞋推荐了. 深受鼓舞,周末没出门,熬了两个夜打磨图示.整理代码,给大家奉上本文. 完整的代码范例已完成,因和本文时序图严格对照,注释整理还需要一些工作,完成后将在下一篇放出.大家下载配置后,本地跑起来会是