Ограничение доступа для различных групп пользователей для BGRadiusDialup
Материал из BiTel WiKi
(Различия между версиями)
Lda (Обсуждение | вклад) (Новая: Появилась необходимость ограничить доступ к VPN серверу для определенных категорий пользователей. Оп...) |
Lda (Обсуждение | вклад) |
||
Строка 94: | Строка 94: | ||
nas_ip = nas.getNASIPAddress(); | nas_ip = nas.getNASIPAddress(); | ||
login = getLogin_(request,response); | login = getLogin_(request,response); | ||
+ | if (login == null) | ||
+ | { | ||
+ | setup.returnConToPool( con ); | ||
+ | return; | ||
+ | }; | ||
+ | |||
login_ip = request.getStringAttribute(RadiusStandartAttributes.Calling_Station_Id); | login_ip = request.getStringAttribute(RadiusStandartAttributes.Calling_Station_Id); | ||
login_id = login.getId(); | login_id = login.getId(); |
Версия 05:16, 20 апреля 2009
Появилась необходимость ограничить доступ к VPN серверу для определенных категорий пользователей.
Описание: Определяем IP, с которого происходит подключение, и категорию пользователя. Если ему не разрешено подключаться с этого IP, то клиент получает ошибку 691. В мониторе ошибок появляется ошибка с кодом 27 "Запрещен вход с данного телефона".
Договора, которые входят в группу с кодом 20, не проверяются.
Событие "Модуль Dialup => Radius - аутентификация"
import bitel.billing.server.call.bean.*; import bitel.billing.server.radius.*; import bitel.billing.server.dialup.bean.*; import bitel.billing.server.contract.bean.*; import bitel.billing.server.script.event.*; import bitel.billing.server.util.*; import java.sql.*; import java.util.*; private getLogin_( req, resp ) { result = null; userName = req.getStringAttribute( RadiusStandartAttributes.User_Name ); if ( userName != null ) { int pos = userName.indexOf( '\\' ); if( pos >= 0 ) { userName = userName.substring( pos + 1 ); } try { date_ = new java.util.Date(); result = new DialUpLoginManager( con, mid ).findLogin( userName,date_ ); } catch ( Exception ex ) { ex.printStackTrace(); } finally { //setup.returnConToPool( con ); } } return result; } private WriteErrorLogin() { query = "SELECT max(id) FROM log_server_"+mid+"_"+TimeUtils.format(DateNow, "yyyyMM")+" WHERE requests LIKE '%User-Name="+User_Name+"\n%'"; ps = con.prepareStatement(query); rs = ps.executeQuery(); if ( !rs.next() ) { return; } log_rec_id = rs.getInt(1); query = "SELECT id FROM nas_"+mid+" WHERE inet_ntoa(ipaddr)='"+nas_ip+"'"; ps = con.prepareStatement(query); rs = ps.executeQuery(); if ( !rs.next() ) { return; } nas_id = rs.getInt(1); query = "SELECT * FROM log_error_"+mid+"_"+TimeUtils.format(DateNow, "yyyyMM")+" WHERE log_rec_id='"+log_rec_id+"'"; ps = con.prepareStatement(query); rs = ps.executeQuery(); if ( rs.next() ) { return; } query = "INSERT INTO log_error_"+mid+"_"+TimeUtils.format(DateNow, "yyyyMM")+" (dt,cid,lid,login,nas_id,error_code,log_rec_id) "+ "VALUES ('"+TimeUtils.format(DateNow, "yyyy-MM-dd HH:mm:ss")+"', '"+cid+"', '"+login_id+"', '"+User_Name+"', '"+nas_id+"', '27', '"+log_rec_id+"')"; psUpdate = con.prepareStatement( query ); psUpdate.executeUpdate(); } mid = 1; //Не проверять Calling_Station_Id GROUP_NOT_Calling_Station_Id = 20; request = event.getRequest(); response = event.getResponse(); con = setup.getDBConnectionFromPool(); User_Name = request.getStringAttribute(RadiusStandartAttributes.User_Name); nas = request.getNAS(); nas_ip = nas.getNASIPAddress(); login = getLogin_(request,response); if (login == null) { setup.returnConToPool( con ); return; }; login_ip = request.getStringAttribute(RadiusStandartAttributes.Calling_Station_Id); login_id = login.getId(); cid = login.getCid(); contract = new ContractManager(con).getContractByID(cid); contract_firma = contract.getFirmID(); contract_fc = contract.getFc(); contract_groups = contract.getGroups(); DateNow = new GregorianCalendar(); if (contract_firma == null) { setup.returnConToPool( con ); return; }; if (nas_ip.indexOf("172.16.128.4") != -1) { //Пропускаем так как это модемный пул setup.returnConToPool( con ); return; }; if ((contract_groups & (1L<<GROUP_NOT_Calling_Station_Id )) > 0) { //Пропускаем, для этого договора мы не проверяем. setup.returnConToPool( con ); return; }; if (login_ip.matches("^10\\.0\\.2\\.[0-9]{1,3}$")) { //Админский сегмен. setup.returnConToPool( con ); return; }; //физики тип1 if (contract_firma == 2 && contract_fc == 0 && !login_ip.matches("^10\\.[1-4]\\.[0-9]{1,3}\\.[0-9]{1,3}$")) { response.setPacketType(RadiusPacket.AUTHENTICATION_REJECT); print("Drop "+User_Name+" "+login_ip); WriteErrorLogin(); setup.returnConToPool( con ); return; } //Остальные физики if ((contract_firma == 1 || contract_firma == 4) && contract_fc == 0 && login_ip.matches("^10\\.[1-4,33,64]\\.[0-9]{1,3}\\.[0-9]{1,3}$")) { response.setPacketType(RadiusPacket.AUTHENTICATION_REJECT); print("Drop "+User_Name+" "+login_ip); WriteErrorLogin(); setup.returnConToPool( con ); return; } //Обязательно закрыть соединение, иначе беда :) setup.returnConToPool( con );