Запрет на вход в личный кабинет с закрытых договоров

Материал из BiTel WiKi

Версия от 08:54, 15 июня 2016; Amir (Обсуждение | вклад)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

При переоформлении договоров иногда возникает необходимость выдать клиенту точно такой-же логин, как у него и был. В случае настройки сервера для авторизации в личном кабинете по текстовому параметру сервер по умолчанию будет всегда пытаться авторизовать клиента по договору, который был создан раньше других. Чтобы избежать такого поведения можно использовать самописный класс авторизации, который будет воплощать стандартный класс авторизации.

В настройках сервера необходимо указать: web.auth.class=<ваш класс> Вот пример класса, который будет пытаться авторизовать клиента с указанным логином в первый договор, дата действия которого не меньше сегодняшнего числа.

package ru.itax.web;
 
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Date;
 
import ru.bitel.bgbilling.server.util.Setup;
 
import bitel.billing.common.TimeUtils;
import bitel.billing.server.ModuleUser;
import bitel.billing.server.contract.bean.Contract;
import bitel.billing.server.contract.bean.ContractManager;
import bitel.billing.server.contract.bean.ContractParameterManager;
 
public class WebLogin implements bitel.billing.server.ModuleAuth {
 
	@Override
	   public ModuleUser findModuleUserByLogin( String login,
	                                             int moduleId,
	                                             int authMode,
	                                             Connection con )
	    {
	        ModuleUser moduleUser = null;
 
	        if ( login != null && login.trim().length() > 0 && moduleId > -1 )
	        {
	           try
	            {
	              String query = null;
	              if ( authMode == 1 )
	              {
	                 query = "SELECT id, pswd FROM contract WHERE title=? LIMIT 1";                 
	              }
	              else if ( authMode == 2 )
	              {
	                 Integer pid = Setup.getSetup().getInt(  "web.auth.contract.text.parameter", 0 );
	                 if ( pid > 0 )
	                 {                 
	                    query = "SELECT id, pswd FROM contract " +
	                       " LEFT JOIN " + ContractParameterManager.CONTRACT_PARAMETER_TYPE_STRING + " as param " +
	                       " ON param.cid = contract.id " +
	                       " AND param.pid = " + pid +
	                       " WHERE param.val=? ";                               
	                 }
	              }
 
	              if (query != null )
	              {
	                   ResultSet rs = null;
	                   PreparedStatement ps = null;
	                   ContractManager cm=new ContractManager(con);
	                   ps = con.prepareStatement( query );
	                   ps.setString( 1, login );
	                   rs = ps.executeQuery();
	                   while ( rs.next() )
	                   {
                            //получаем договор и проверяем не позже ли сегодняшнего числа дата его закрытия. Если да - авторизуем. 
	                                 Contract contract=cm.getContractById(rs.getInt(1));
	                	   if(!TimeUtils.dateBefore(contract.getDateTo(), new Date()))
	                		  {
	                		   moduleUser = new ModuleUser();
		                       moduleUser.setLogin( login );
		                       moduleUser.setPassword( rs.getString( 2 ) );
		                       moduleUser.setContractId( rs.getInt( 1 ) );
		                       moduleUser.setContractTitle( login ); 	   
	                		   }
 
	                   }
	                   rs.close();
	                   ps.close();
	                }
 
	            }
	            catch( Exception e )
	            {
	                e.printStackTrace();
	            }
	        }
	        return moduleUser;
	    }
 
}

Для 6.2:

package ru.itax.web;
 
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Date;
 
import bitel.billing.common.TimeUtils;
import bitel.billing.server.contract.bean.Contract;
import bitel.billing.server.contract.bean.ContractManager;
import bitel.billing.server.contract.bean.ContractParameterManager;
import ru.bitel.bgbilling.kernel.auth.ModuleUser;
import ru.bitel.bgbilling.server.util.Setup;
 
public class WebLogin implements bitel.billing.server.ModuleAuth {
 
	@Override
	   public ModuleUser findModuleUserByLogin( String login,
	                                             int moduleId,
	                                             int authMode,
	                                             Connection con )
	    {
	        ModuleUser moduleUser = null;
 
	        if ( login != null && login.trim().length() > 0 && moduleId > -1 )
	        {
	           try
	            {
	              String query = null;
	              if ( authMode == 1 )
	              {
	                 query = "SELECT id, pswd FROM contract WHERE title=? LIMIT 1";                 
	              }
	              else if ( authMode == 2 )
	              {
	                 Integer pid = Setup.getSetup().getInt(  "web.auth.contract.text.parameter", 0 );
	                 if ( pid > 0 )
	                 {                 
	                    query = "SELECT id, pswd FROM contract " +
	                       " LEFT JOIN " + ContractParameterManager.CONTRACT_PARAMETER_TYPE_STRING + " as param " +
	                       " ON param.cid = contract.id " +
	                       " AND param.pid = " + pid +
	                       " WHERE param.val=? ";                               
	                 }
	              }
 
	              if (query != null )
	              {
	                   ResultSet rs = null;
	                   PreparedStatement ps = null;
	                   ContractManager cm=new ContractManager(con);
	                   ps = con.prepareStatement( query );
	                   ps.setString( 1, login );
	                   rs = ps.executeQuery();
	                   while ( rs.next() )
	                   {
                            //получаем договор и проверяем не позже ли сегодняшнего числа дата его закрытия. Если да - авторизуем. 
	                                 Contract contract=cm.getContractById(rs.getInt(1));
	                	   if(!TimeUtils.dateBefore(contract.getDateTo(), new Date()))
	                		  {
	                		   moduleUser = new ModuleUser();
		                       moduleUser.setLogin( login );
		                       moduleUser.setPassword( rs.getString( 2 ) );
		                       moduleUser.setContractId( rs.getInt( 1 ) );
		                       moduleUser.setContractTitle( login ); 	   
	                		   }
 
	                   }
	                   rs.close();
	                   ps.close();
	                }
 
	            }
	            catch( Exception e )
	            {
	                e.printStackTrace();
	            }
	        }
	        return moduleUser;
	    }
 
}

Скрипт необходимо скомпилировать, заархивировать в jar архив и положить в папку lib сервера. Сервер перезапустить.

Личные инструменты