关闭

自定义单点登录(2)

标签: java单点登录自定义单点登录cookiesession
475人阅读 评论(0) 收藏 举报
分类:

惯例:

我是温浩然:

单点登录,分为客户端和服务器端,客户端,主要与用户的浏览器进行交互,操作浏览器,比如,cookie,session等。

服务器端,主要是储存用户的信息,和后台数据库进行交互,获取当前登录的用户信息,对用户的登录进行验证。

关于单点登录,我感觉,验证方式有很多种,

我这里,是对cookie进行操作,当用户登录成功后,会在浏览器新建cookie,储存一定信息,当用户访问受保护的请求时,获取cookie并进行验证,如果验证通过,则该用户已经登录,可以访问受保护的信息。

下面贴在Filter中,进行验证的代码。

1、服务器中,对用户进行验证的代码。

package com.tujia.core.security;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

import javax.annotation.Resource;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.util.WebUtils;

import com.tujia.common.exception.UnAuthedException;
import com.tujia.tuuser.dao.UserDao;
import com.tujia.tuuser.entity.User;
import com.tujia.tuuser.service.UserService;

@Component
public class SecurityUtil {

	@Resource
    private UserDao userDao;
	
	private String TOURL = "TOURL";

	private static ThreadLocal<User> threadTuser = new ThreadLocal<User>();

	private Map<String,AuthTuUser> map = new HashMap<String,AuthTuUser>();
	
	private Map<String,User> mapUser = new HashMap<String,User>();
	
        //下面这个是对数据进行操作,与数据库进行交互的Java类
	@Autowired
	private UserService userService;

        /*@Autowired
	TokenAuthentication tokenAuthentication;*/
	//tujia.requrl  下面这些都是配置文件
	@Value("${tujia.requrl}")
	private String requrl;
	@Value("${tujia.token}")
	private String tokenKey;
	@Value("${loginURL:\"\"}")
	private String loginURL;

	private int MS_IN_A_DAY = 24 * 3600 * 1000;
	private int SECS_IN_A_MONTH = 24 * 3600 * 30;

	/**
	 * 得到当前登录的用户,用户再业务逻辑的地方
	 * 
	 * @return
	 */
	public static User getCurrentTuser() {
		return threadTuser.get();
	}

	/**
	 * 用在filter的地方,
	 * 
	 * @param request
	 * @throws UnAuthedException 
	 * @return:true:已经登录了。false:没有登录
	 */
	public boolean authenticate(HttpServletRequest request,
			HttpServletResponse response) throws UnAuthedException {
		boolean result;
		// 处理cookie情况
		Cookie cookie = WebUtils.getCookie(request, tokenKey);
		String url = request.getRequestURI();
		
		//if登录cookie is null ,则添加cookie url.
		if (cookie == null){
			//这是被拦截后添加的cookie
			Cookie cookieurl = new Cookie(requrl, url);
			cookieurl.setPath("/");
			cookieurl.setMaxAge(-1);
			response.addCookie(cookieurl);
			return false;
			}
		
		String value = cookie.getValue();
		AuthTuUser au = (AuthTuUser) map.get(value);
		if (au == null ){
			Cookie cookieurl = new Cookie(requrl, url);
			cookieurl.setPath("/");
			cookieurl.setMaxAge(-1);
			response.addCookie(cookieurl);
			return false;
			}
		request.getSession().setAttribute("userLogin", mapUser.get(value));
		result = verifyTuserId(au.getId()); 
		if (!result) {
			logout(request, response);
		}
		
		return result;
	}


	public User getLoinTuser(HttpServletRequest request) throws UnAuthedException {
		// 处理cookie情况
		Cookie cookie = WebUtils.getCookie(request, tokenKey);
		if (cookie == null)
			return null;
		String value = cookie.getValue();
		AuthTuUser au = (AuthTuUser) map.get(value);
		if (au == null)// || au.isExpire()
			return null;

		 User user = userService.get(au.getId());
		return user;
	}

	private String generateValue() {
		return UUID.randomUUID().toString();
	}

	public void inputSuccess(HttpServletRequest request,HttpServletResponse response, long userId,
			boolean saved) throws UnAuthedException {
		if (verifyTuserId(userId)) {
			addCookieAndCache(request,response, userId, saved);
		}else{
			throw new UnAuthedException("该用户不存在,请重新输入!");
		}
	}

	private void addCookieAndCache(HttpServletRequest request,HttpServletResponse response, long userId,
			boolean saved) {
		
		AuthTuUser au = new AuthTuUser(userId);
		
		User user = userDao.get(userId);
		
		String tokenValue = generateValue();
		Cookie cookie = new Cookie(tokenKey, tokenValue);
		cookie.setPath("/");
		if (saved) {
			cookie.setMaxAge(SECS_IN_A_MONTH);
			au.setSaved(true);
		} else {
			cookie.setMaxAge(-1);
			au.setExpireDate(new Date(System.currentTimeMillis() + MS_IN_A_DAY));
		}
		request.setAttribute("token", tokenValue);
		response.addCookie(cookie);
		
		map.put(tokenValue, au);
		mapUser.put(tokenValue, user);
		request.getSession().setAttribute("userLogin", user);
	}

	public boolean verifyTuserId(long userId) throws UnAuthedException {
		boolean result;
		 User user = userService.get(userId);
		if (user.isDeleted()) {// 员工被停用了
			result = false;
		} else {
			threadTuser.set(user);
			result = true;
		}
		return result;
	}

	/**
	 * 
	 * @param req
	 * @return
	 */
	public void logout(HttpServletRequest request, HttpServletResponse response) {

		Cookie cookie = WebUtils.getCookie(request, tokenKey);
		if (cookie == null)
			return;

		String value = cookie.getValue();
		AuthTuUser au = (AuthTuUser) map.get(value);
		if (au == null) {
			delteCookie(response, tokenKey);
			delteCookie(response, requrl);
			return;
		}

		delteCookie(response, tokenKey);
		map.remove(value);
		return;

	}

	private void delteCookie(HttpServletResponse response, String cookieName) {
		Cookie cookie = new Cookie(cookieName, "");
		cookie.setPath("/");
		cookie.setMaxAge(0);
		response.addCookie(cookie);
	}

	// 线程结束的时候调用。
	public static void clearOnThreadOver() {
		threadTuser.remove();
	}

	public void setTOURL(HttpServletResponse response,
			HttpServletRequest request) {
		StringBuffer u = request.getRequestURL();
		if (request.getQueryString() != null) {
			u.append('?');
			u.append(request.getQueryString());
		}
		Cookie cookie = new Cookie(TOURL, u.toString());
		cookie.setPath("/");
		cookie.setMaxAge(-1);
		response.addCookie(cookie);
	}

	public String getTOURL(HttpServletRequest request,
			HttpServletResponse response) {
		Cookie cookie = WebUtils.getCookie(request, TOURL);
		if (cookie == null)
			return "";
		delteCookie(response, TOURL);
		return cookie.getValue();
	}

	public String getLoginURL() {
		return loginURL;
	}

	public String getReqURL(HttpServletRequest request,HttpServletResponse response){
		
		Cookie cookie = WebUtils.getCookie(request, requrl);
		
		String value = cookie.getValue();	
		return value;
	}

	public void setLoginURL(String loginURL) {
		this.loginURL = loginURL;
	}
	
	public void requrl(HttpServletRequest request,HttpServletResponse response) {
		Cookie cookie = WebUtils.getCookie(request, requrl);
		if(cookie == null){
			Cookie cookieurl = new Cookie(requrl, "/tu-login/user/index");
			cookieurl.setPath("/");
			cookieurl.setMaxAge(-1);
			response.addCookie(cookieurl);
		}
	}
	
	public boolean getAuthTuUser(String token){
		
		AuthTuUser au = (AuthTuUser) map.get(token);
		
		if (au == null ){
			return false;
		}else{
			User user = mapUser.get(token);
			
			return true;
		}
		
	}
}


贴的很多,但是如果看得仔细,会发现其中我增加了两个cookie,一个是token,就是保存在浏览器中的登录信息。

另一个cookie是requrl,这个是,当用户访问受保护的请求,然后登录后,能自动调整显示的页面。

AuthTuUser这个是储存用户登录信息的javaBean,当用户判断是否登录时,就用map来判断。

0
0
查看评论

自定义单点登录页面--在自己的网站使用单点登录(2)

因最近经常有时候被一些朋友问到关于 CAS 跨全域下的 Ajax 登录方式实现,正好之前也分析Sina微博的SSO实现,文中也说了 SINA 的 SSO 实际上(或机制)直接使用了 CAS 这个开源项目。于是本文中要说的CAS AJAX登录方式便参考了 SINA 的AJA...
  • scubers
  • scubers
  • 2015-05-21 13:57
  • 1756

单点登录(十五)-----实战-----cas4.2.x登录mongodb验证方式实现自定义加密

我们在前一篇文章中实现了cas4.2.x登录使用mongodb验证方式。单点登录(十三)-----实战-----cas4.2.X登录启用mongodb验证方式完整流程也学习参考了cas5.0.x版本的mongodb的四种加密方式。单点登录(十四)-----实战-----cas5.0.x登录mongo...
  • q383965374
  • q383965374
  • 2017-02-13 20:35
  • 1961

web api 单点登录(SSO) 权限验证

本文介绍利用web api实现单点登录,具体原理请看http://www.cnblogs.com/Work-hard/archive/2013/04/10/3011589.html,下面主要介绍相关代码: 分站代码: using System; using System.Collections...
  • duo002
  • duo002
  • 2014-10-29 15:31
  • 735

Oauth2单点登录

OAuth 2.0是一种设计思路,不是一个框架 Oauth2的4种模式: 1、授权码模式(获取code、code换取access_token) 2、简化模式(直接换取access_token,基本不用) 3、密码模式(客户端像用户索取账号密码,然后客户端向服务端索取授权,基本不用) 4、客户端模...
  • weixin_41279060
  • weixin_41279060
  • 2017-12-21 09:49
  • 942

CAS单点登录-自定义认证之JDBC(五)

CAS单点登录-自定义认证Ⅰ(五)版本为cas-5.1.3 若需要上个版本代码,可以点击下载: 本章节的内容为JDBC认证,查找数据库进行验证,其中包括: 密码加密策略 认证策略 业务需求 在不同公司,可能有很多业务需求或者架构不一样导致我们实现验证的方式不一样,那么cas为我们提供...
  • u010475041
  • u010475041
  • 2017-09-13 09:38
  • 3310

SSO单点登录 cas_server通过查询数据库验证用户名、密码正确性

SSO单点登录 cas_server通过查询数据库验证用户名、密码正确性
  • QQ994406030
  • QQ994406030
  • 2016-08-21 21:18
  • 245

SPRING SESSION实现单点登录

概述 利用Spring session和redis数据库实现单点登录功能。介绍了Spring session 的使用,包括从jar 包的导入,redis 数据库的配置,spring session配置文件的编写,到最后单点登录功能的实现。
  • Moxies8090
  • Moxies8090
  • 2016-11-26 21:21
  • 7736

基于CAS实现单点登录(SSO):自定义登录验证方法

通过配置方式实现数据库查询认证,的确简单但是不够灵活。但是如果登录验证逻辑稍微复杂些,可能通过配置方式就不能满足需求了,比如:当用户登录时,需要判断该用户是否绑定了邮箱,如果未绑定,拒绝登录并给出提示信息。 遇到类似的情况,就需要使用自定义登录来完成,并且给出的提示信息也是自定义的。 &...
  • yudar1024
  • yudar1024
  • 2014-12-23 22:17
  • 633

java web项目利用Filter进行单点登录的简单实现(解决方案)

利用 首先增加过滤器: package sdses.filter; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet...
  • near008
  • near008
  • 2014-04-30 14:18
  • 3859

单点登录思路

单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。说白了就是平台之间互相访问不需要再登录。 首先要确认传参,传参一般要传系统编码(点击过来平台代号随便一个英文),...
  • zy_crazy_code
  • zy_crazy_code
  • 2016-07-27 17:24
  • 444
    个人资料
    • 访问:436809次
    • 积分:5521
    • 等级:
    • 排名:第5743名
    • 原创:157篇
    • 转载:103篇
    • 译文:1篇
    • 评论:45条
    最新评论