All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.frameworkset.web.token.MongodbTokenStore Maven / Gradle / Ivy

Go to download

support session share between application cluster nodes and cross domain application nodes.support good application session monitor and session data statitic module.demo site http://session.bbossgroups.com/

There is a newer version: 6.2.8
Show newest version
package org.frameworkset.web.token;

import org.apache.log4j.Logger;
import org.frameworkset.nosql.mongodb.MongoDB;
import org.frameworkset.nosql.mongodb.MongoDBHelper;
import org.frameworkset.security.ecc.SimpleKeyPair;

import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.WriteConcern;


public class MongodbTokenStore extends BaseTokenStore{
	private static Logger log = Logger.getLogger(MongodbTokenStore.class);
//	private  Map temptokens = new HashMap();
//	private  Map dualtokens = new HashMap();
//	private final Object checkLock = new Object();
//	private final Object dualcheckLock = new Object();
	 
	private DB db = null;
	private DBCollection temptokens = null;
	private DBCollection authtemptokens = null;
//	private DBCollection dualtokens = null;
	private DBCollection eckeypairs = null;
	private DBCollection tickets = null;
//	public void requestStart()
//	{
//		if(db != null)
//		{
//			db.requestStart();
//		}
//	}
//	public void requestDone()
//	{
//		if(db != null)
//		{
//			db.requestDone();
//		}
//	}
	
//	public CommandResult getLastError()
//	{
//		if(db != null)
//		{
//			return db.getLastError();
//		}
//		return null;
//	}
	
	public MongodbTokenStore()
	{
		db = MongoDBHelper.getDB(MongoDBHelper.defaultMongoDB, "tokendb" );
		authtemptokens = db.getCollection("authtemptokens");
		authtemptokens.createIndex(new BasicDBObject("appid", 1).append("token", 1));
		temptokens = db.getCollection("temptokens");
		temptokens.createIndex(new BasicDBObject("token", 1));
//		dualtokens = db.getCollection("dualtokens");
//		dualtokens.createIndex(new BasicDBObject("appid", 1));
		eckeypairs = db.getCollection("eckeypair");
		eckeypairs.createIndex(new BasicDBObject("appid", 1));
		tickets = db.getCollection("tickets");
		tickets.createIndex(new BasicDBObject("token", 1));
	}
	public void destory()
	{
		
		MongoDBHelper.destory();
		
	}
	public void livecheck()
	{
		
		long curtime = System.currentTimeMillis();
//		synchronized(this.checkLock)
		
		StringBuffer wherefun = new StringBuffer();
		wherefun.append("function() ")
				.append("{")			
			    .append(" if(this.createTime + this.livetime < ").append(curtime).append(")")
			    .append("{")
				.append("return true;")				
				.append("}")
				.append("else")
				.append(" {")
				.append(" return false;")		
				.append("}")
				.append("}");
		String temp = wherefun.toString();

		try
		{
//			temptokens.remove(new BasicDBObject("$where",temp));
			MongoDB.remove(temptokens,new BasicDBObject("$where",temp),WriteConcern.UNACKNOWLEDGED);
			
		}
		finally
		{
			
		}		
//		

//		try
//		{
////			dualtokens.remove(new BasicDBObject("$where",temp));
//			MongoDB.remove(dualtokens,new BasicDBObject("$where",temp),WriteConcern.UNACKNOWLEDGED);
//			
//		}
//		finally
//		{
//			
//		}		

		try
		{
//			authtemptokens.remove(new BasicDBObject("$where",temp));
			MongoDB.remove(authtemptokens,new BasicDBObject("$where",temp),WriteConcern.UNACKNOWLEDGED);
		}
		finally
		{
			
		}
		
		
		wherefun = new StringBuffer();
		wherefun.append("function() ")
				.append("{")			
				 .append(" if(this.livetime <= 0)")
			    .append("{")
				.append("return false;")				
				.append("}")
			    .append(" if(this.lastVistTime + this.livetime < ").append(curtime).append(")")
			    .append("{")
				.append("return true;")				
				.append("}")
				.append("else")
				.append(" {")
				.append(" return false;")		
				.append("}")
				.append("}");
		try
		{
//			this.tickets.remove(new BasicDBObject("$where",wherefun));
			MongoDB.remove(tickets,new BasicDBObject("$where",wherefun.toString()),WriteConcern.UNACKNOWLEDGED);
		}
		finally
		{
			
		}
		
	}
//	public void livecheck()
//	{
//		List dolds = new ArrayList();
//		DBCursor cursor = null;
////		synchronized(this.checkLock)
//		{
//			try
//			{
//				cursor = this.temptokens.find();				
//				while(cursor.hasNext())
//				{	
//					DBObject tt = cursor.next();
//					MemToken token_m = totempToken(tt);				
//					if(isold(token_m))
//					{
//						dolds.add(new BasicDBObject("token", token_m.getToken()));
//					}
//				}
//			}
//			finally
//			{
//				if(cursor != null)
//				{
//					cursor.close();
//					cursor = null;
//				}
//			}
//		}
//		
//		for(int i = 0; i < dolds.size(); i ++)
//		{
////			if(tokenMonitor.isKilldown())
////				break;
//			temptokens.remove(dolds.get(i));
//		}
//		
//		dolds = new ArrayList();
//		try
//		{
//			cursor = this.dualtokens.find();
//			while(cursor.hasNext())
//			{	
//				DBObject tt = cursor.next();
////				MemToken token_m = new MemToken((String)tt.get("token"),(Long)tt.get("createTime"));		
//				MemToken token_m = todualToken(tt);
//				if(isold(token_m,token_m.getLivetime(),System.currentTimeMillis()))
//				{
//					dolds.add(new BasicDBObject("appid", (String)tt.get("appid")).append("secret", (String)tt.get("secret")));
//				}
//			}
//		}
//		finally
//		{
//			if(cursor != null)
//			{
//				cursor.close();
//				cursor = null;
//			}
//		}
//		
//		for(int i = 0; i < dolds.size(); i ++)
//		{
//			dualtokens.remove(dolds.get(i));
//		}
//		
//		dolds = new ArrayList();
//		try
//		{
//			cursor = this.authtemptokens.find();
//			while(cursor.hasNext())
//			{	
//				DBObject tt = cursor.next();
////				MemToken token_m = new MemToken((String)tt.get("token"),(Long)tt.get("createTime"));		
//				MemToken token_m = todualToken(tt);
//				if(isold(token_m,token_m.getLivetime(),System.currentTimeMillis()))
//				{
//					dolds.add(new BasicDBObject("appid", (String)tt.get("appid")).append("secret", (String)tt.get("secret")).append("token", (String)tt.get("token")));
//				}
//			}
//		}
//		finally
//		{
//			if(cursor != null)
//			{
//				cursor.close();
//				cursor = null;
//			}
//		}
//		for(int i = 0; i < dolds.size(); i ++)
//		{
//			authtemptokens.remove(dolds.get(i));
//		}
//		
//		dolds = null;
//		
//	}
	
//	private MemToken todualToken(DBObject object)
//	{
//		if(object == null)
//			return null;
//		MemToken token = new MemToken((String)object.get("token"),(Long)object.get("createTime"), (Boolean)object.get("validate"),
//					(Long)object.get("lastVistTime"), (Long)object.get("livetime"));
//		token.setAppid((String)object.get("appid"));
//		token.setSecret((String)object.get("secret"));
//		token.setSigntoken((String)object.get("signtoken"));
//		return token;
//	}
	
	private MemToken totempToken(DBObject object)
	{
		MemToken token = new MemToken((String)object.get("token"),(Long)object.get("createTime"));
		token.setLivetime((Long)object.get("livetime"));
		return token;
	}
	
	private MemToken toauthtempToken(DBObject object)
	{
		MemToken token = new MemToken((String)object.get("token"),(Long)object.get("createTime"));
		token.setLivetime((Long)object.get("livetime"));
		token.setSigntoken((String)object.get("signtoken"));
		return token;
	}
	
//	@Override
//	protected MemToken getDualMemToken(String token, String appid,
//			long lastVistTime) {
//		
//		
//		MemToken tt = queryDualToken( appid, null,lastVistTime);
//		return tt;
//	}
	@Override
	protected MemToken getAuthTempMemToken(String token, String appid) {
		BasicDBObject dbobject = new BasicDBObject("token", token).append("appid", appid);
		DBObject tt = authtemptokens.findOne(dbobject);
		
		if(tt == null)
			return null;
		MongoDB.remove(this.authtemptokens,dbobject,WriteConcern.JOURNAL_SAFE);
		MemToken token_m = toauthtempToken(tt);		
		return token_m;
	}
	@Override
	protected MemToken getTempMemToken(String token, String appid) {
		BasicDBObject dbobject = new BasicDBObject("token", token);
		DBObject tt = temptokens.findOne(dbobject);
		if(tt != null)
		{
//			DBObject tt = cursor.next();
			MongoDB.remove(temptokens,dbobject,WriteConcern.JOURNAL_SAFE);
			MemToken token_m = totempToken(tt);	
			
			return token_m;
		}
		
		
		return null;
		
	}	
	
	
	

//	private MemToken queryDualToken(String appid, String secret)
//	{
//		return queryDualToken(appid, secret,-1);
//	}
//	private MemToken queryDualToken(String appid, String secret,long lastVistTime)
//	{
//		BasicDBObject dbobject = new BasicDBObject("appid", appid);
//		MemToken tt = null;
//		DBCursor cursor = null;
//		DBObject dt = null;
//		if(lastVistTime > 0)
//		{
//			dt = dualtokens.findOne(dbobject);
//			MongoDB.update(dualtokens,dbobject, new BasicDBObject("$set",new BasicDBObject("lastVistTime", lastVistTime)));
////			dt = dualtokens.findAndModify(dbobject, new BasicDBObject("$set",new BasicDBObject("lastVistTime", lastVistTime)));
//			tt = todualToken(dt); 
//		}
//		else
//		{
//			try
//			{
//				cursor = dualtokens.find(dbobject);
//				if(cursor.hasNext())
//				{
//					dt = cursor.next();
//					tt = todualToken(dt); 
//				}
//			}
//			finally
//			{
//				if(cursor != null)
//				{
//					cursor.close();
//				}
//			}
//		}
//		
//		
//		return tt;
//	}
	

	private void insertDualToken(DBCollection dualtokens,MemToken dualToken)
	{
		MongoDB.insert(dualtokens,new BasicDBObject("token",dualToken.getToken())
		.append("createTime", dualToken.getCreateTime())
		.append("lastVistTime", dualToken.getLastVistTime())
		.append("livetime", dualToken.getLivetime())
		.append("appid", dualToken.getAppid())
		.append("secret", dualToken.getSecret())
		.append("signtoken", dualToken.getSigntoken())
		.append("validate", dualToken.isValidate()));
	}
	
//	private void updateDualToken(MemToken dualToken)
//	{
//		MongoDB.update(this.dualtokens,new BasicDBObject(
//		"appid", dualToken.getAppid()),
//		new BasicDBObject("token",dualToken.getToken())
//		.append("createTime", dualToken.getCreateTime())
//		.append("lastVistTime", dualToken.getLastVistTime())
//		.append("livetime", dualToken.getLivetime())
//		.append("appid", dualToken.getAppid())
//		.append("secret", dualToken.getSecret())
//		.append("signtoken", dualToken.getSigntoken())
//		.append("validate", dualToken.isValidate()));
//	}

	@Override
	public MemToken _genTempToken( ) throws TokenException {
		String token = this.randomToken();
		MemToken token_m = new MemToken(token,System.currentTimeMillis());
		MongoDB.insert(temptokens,new BasicDBObject("token",token_m.getToken()).append("createTime", token_m.getCreateTime()).append("livetime", this.tempTokendualtime).append("validate", true));
		this.signToken(token_m, type_temptoken, null,null,false);
		return token_m;
		
	}
	
//	@Override
//	protected MemToken _genDualToken(String appid,String ticket, String secret, long livetime,boolean sign) throws TokenException {
//		
//		String accountinfo[] = this.decodeTicket(ticket, appid, secret,  sign);
//		MemToken token_m = null;
////		synchronized(this.dualcheckLock)
//		
//		token_m = queryDualToken( appid, secret);
//		if(token_m != null)
//		{
//			long lastVistTime = System.currentTimeMillis();
//			if(isold(token_m, livetime,lastVistTime))//如果令牌已经过期,重新申请新的令牌
//			{
//				//刷新过期的有效期令牌
//				String token = this.randomToken();
//				token_m.setLastVistTime(lastVistTime);
////					this.dualtokens.remove(key);
//				long createTime = System.currentTimeMillis();
//				token_m = new MemToken(token, createTime, true,
//						createTime, livetime);
//				token_m.setAppid(appid);
//				token_m.setSecret(secret);
//				this.signToken(token_m,TokenStore.type_dualtoken,accountinfo,ticket,  sign);
//				updateDualToken(token_m);
//				
//			}
//		}
//		else
//		{
//			String token = this.randomToken();
//			long createTime = System.currentTimeMillis();
//			token_m = new MemToken(token, createTime, true,
//					createTime, livetime);
//			token_m.setAppid(appid);
//			token_m.setSecret(secret);
//			this.signToken(token_m,TokenStore.type_dualtoken,accountinfo,ticket,  sign);
//			this.insertDualToken(this.dualtokens,token_m);
//		}
//		
//		
//		return token_m ;
//		
//	}
	/**
	 * 创建带认证的临时令牌
	 * @param string
	 * @param string2
	 * @return
	 * @throws TokenException 
	 */
	protected MemToken _genAuthTempToken(String appid,String ticket, String secret,boolean sign) throws TokenException {
		String accountinfo[] = this.decodeTicket(ticket, appid, secret,  sign);
		String token = this.randomToken();//需要将appid,secret,token进行混合加密,生成最终的token进行存储,校验时,只对令牌进行拆分校验
		
		MemToken token_m = null;
//		synchronized(this.dualcheckLock)
		
		long createTime = System.currentTimeMillis();
		token_m = new MemToken(token, createTime, true,
				createTime, this.tempTokendualtime);
		token_m.setAppid(appid);
		token_m.setSecret(secret);
		this.signToken(token_m,TokenStore.type_authtemptoken,accountinfo,ticket,  sign);
		this.insertDualToken(this.authtemptokens,token_m);
		
		
		return token_m ;
	}
	
	protected SimpleKeyPair _getKeyPair(String appid,String secret) throws TokenException
	{
		DBCursor cursor = null;
		try
		{
			cursor = eckeypairs.find(new BasicDBObject("appid", appid));
			if(cursor.hasNext())
			{
				DBObject value = cursor.next();
				return toECKeyPair(value);
				
			}
			else
			{
				try {
					SimpleKeyPair keypair = ECCCoder.genECKeyPair();
					insertECKeyPair( appid, secret, keypair);
					return keypair;
				} catch (Exception e) {
					throw new TokenException(TokenStore.ERROR_CODE_GETKEYPAIRFAILED,e);
				}
			}
		}
		finally
		{
			if(cursor != null)
			{
				cursor.close();
			}
		}
	}
	private void insertECKeyPair(String appid,String secret,SimpleKeyPair keypair)
	{
		MongoDB.insert(this.eckeypairs,new BasicDBObject("appid",appid)		
		.append("privateKey", keypair.getPrivateKey())
		.append("createTime", System.currentTimeMillis())
		.append("publicKey", keypair.getPublicKey()) );
	}
	
	protected SimpleKeyPair toECKeyPair(DBObject value)
	{
		SimpleKeyPair ECKeyPair = new SimpleKeyPair((String)value.get("privateKey"),(String)value.get("publicKey"),null,null);
		return ECKeyPair;
	}
	@Override
	protected void persisteTicket(Ticket ticket) {
		/**
		 *  token;
	private String ticket;
	private long createtime;
	private long livetime;
	private String appid
		 */
		MongoDB.insert(this.tickets,new BasicDBObject("appid",ticket.getAppid())		
		.append("token", ticket.getToken())
		.append("ticket", ticket.getTicket())
		.append("livetime", ticket.getLivetime())
		.append("createtime", ticket.getCreatetime()) 
		.append("lastVistTime", ticket.getLastVistTime()) );
		
	}
	
	protected boolean refreshTicket(String token,String appid) 
	{
		try
		{
			BasicDBObject keys = new BasicDBObject();
			keys.put("lastVistTime", 1);
			keys.put("livetime", 1);
			DBObject value = tickets.findOne(new BasicDBObject("token", token),keys);
			if(value != null)
			{
				Ticket ticket = new Ticket();
				long lastVistTime =  System.currentTimeMillis();
				ticket.setLivetime((Long)value.get("livetime"));
				ticket.setLastVistTime( (Long)value.get("lastVistTime"));
				assertExpiredTicket(ticket,appid,lastVistTime);
				MongoDB.update(this.tickets,new BasicDBObject("token", token), 
													   new BasicDBObject("$set",
															  			new BasicDBObject("lastVistTime", lastVistTime)
															  		    ),WriteConcern.JOURNAL_SAFE);
				return true;
			}
			return false;
		}
		catch (TokenException e) {
			throw e;
		}
		catch (Exception e) {
			throw new TokenException("refresh ticket["+token+"] of app["+appid+"] failed:",e);
		}
		
	}
	protected boolean destroyTicket(String token,String appid)
	{
		try {
			MongoDB.remove(this.tickets,new BasicDBObject("token", token),WriteConcern.JOURNAL_SAFE);			
			return true;
		} catch (Exception e) {
			throw new TokenException("destroy ticket["+token+"] of app["+appid+"] failed:",e);
		}
	}
	@Override
	protected Ticket getTicket(String token, String appid) {
		DBCursor cursor = null;
		try
		{
			long lastVistTime =  System.currentTimeMillis();
			DBObject value = tickets.findOne(new BasicDBObject("token", token));
		
			if(value != null)
			{
				Ticket ticket = new Ticket();
				ticket.setAppid((String)value.get("appid"));
				ticket.setCreatetime((Long)value.get("createtime"));
				ticket.setLivetime((Long)value.get("livetime"));
				ticket.setTicket((String)value.get("ticket"));
				ticket.setLastVistTime( (Long)value.get("lastVistTime"));
				ticket.setToken(token);
				
				assertExpiredTicket(ticket,appid,lastVistTime);
				if(!this.istempticket(token))
				{
					MongoDB.update(tickets,new BasicDBObject("token", token), 
							   new BasicDBObject("$set",
									  			new BasicDBObject("lastVistTime", lastVistTime)
									  		    )
							   			,WriteConcern.UNACKNOWLEDGED);
				}
				else//一次性票据,获取后立马销毁
				{
					this.destroyTicket(token, appid);
				}
				return ticket;
				
			}
			return null;
		}
		catch (TokenException e) {
			throw e;
		}
		catch (Exception e) {
			throw new TokenException(TokenStore.ERROR_CODE_GETTICKETFAILED,e);
		}
		finally
		{
			if(cursor != null)
			{
				cursor.close();
			}
		}
	}
	

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy