powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Как реализировать аутентификацию пользователя
14 сообщений из 14, страница 1 из 1
Как реализировать аутентификацию пользователя
    #34327690
Dimas_Verbatim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Посоветуйте, пожалуйста, как реализировать аутентификацию пользователя с ограничением прав на определенные пункты меню.
Программа работает с несколькими проектами нужно ограничить доступ пользователям на некоторые проекты и функционал связанный с проектами.
...
Рейтинг: 0 / 0
Как реализировать аутентификацию пользователя
    #34328003
Black Savage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Примерно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
363.
364.
365.
366.
367.
368.
369.
370.
371.
372.
373.
374.
375.
376.
377.
378.
379.
380.
381.
382.
383.
384.
385.
386.
387.
388.
389.
390.
391.
392.
393.
394.
395.
396.
397.
398.
399.
400.
401.
402.
403.
404.
405.
406.
407.
408.
409.
410.
411.
412.
413.
414.
415.
416.
417.
418.
419.
420.
421.
422.
423.
424.
425.
426.
427.
428.
429.
430.
431.
432.
433.
434.
435.
436.
437.
438.
439.
440.
441.
442.
443.
444.
445.
446.
447.
448.
449.
450.
451.
452.
453.
454.
455.
456.
457.
458.
459.
460.
461.
462.
463.
464.
465.
466.
467.
468.
469.
470.
471.
472.
473.
$PBExportHeader$w_base.srw
forward
global type w_base from window
end type
end forward

global type w_base from window
integer width =  3168 
integer height =  1876 
boolean titlebar = true
string title = "Untitled"
boolean controlmenu = true
boolean minbox = true
boolean maxbox = true
boolean resizable = true
long backcolor =  67108864 
string icon = "AppIcon!"
boolean center = true
event we_security_process ( )
end type
global w_base w_base

type variables
//************************************************************************************
// Author Name					:		Black Savage
// Creation Date 				:  		12-Feb-2007
// Definition of Parameters	:
// Description 					:		Declare instance variables
//
// Modification history 
//====================================================================================
// Version !   Date			!  Author			! 	Description
//====================================================================================
// 3.0			12-Feb-2007  Black Savage		Initial Version
//************************************************************************************

private 	datastore ids_menu_items // it has all accessible controls and menu items
end variables

forward prototypes
public subroutine config ()
private function boolean wf_set_menu (menu an_menu_id)
private function boolean wf_set_controls (graphicobject ago_control)
private function boolean wf_set_buttons (graphicobject ago_control)
end prototypes

event we_security_process();//************************************************************************************
// Author Name					:		Black Savage
// Creation Date 				:  		12-Feb-2007
// Definition of Parameters	:
// Description 					:		Security process script
//
// Modification history 
//====================================================================================
// Version !   Date			!  Author			! 	Description
//====================================================================================
// 3.0			12-Feb-2007  Black Savage		Initial Version
//************************************************************************************

string 	ls_cod_op, ls_ppqesystem, ls_window
long		ll_items, ll_row_num
boolean	lb_access
pointer	lpt_oldpointer

// If there is not guo_variables, it'll be impossible to get retrieves arguments
if IsValid(guo_variables) = false then return

// Has the window any controls or menu?
lb_access = false
if IsNull(this.MenuID) = false then
	lb_access = true
end if
ll_items = UpperBound(this.Control[])
if IsNull(ll_items) = false	then
	if ll_items > 0 then
		lb_access = true
	end if
end if
if lb_access = false then return // There are not any menu or controls in the window
	
// Get retrieves arguments
ls_cod_op = guo_variables.gs_user
if Trim(ls_cod_op) = "" then return

ls_ppqesystem	= guo_variables.gs_type
if Trim(ls_ppqesystem) = "" then return

ls_window = ClassName(this)
if IsNull(ls_window) then return
if Trim(ls_window) = "" then return

ls_cod_op = Trim(ls_cod_op)
ls_ppqesystem = Trim(ls_ppqesystem)
ls_window = Upper(Trim(ls_window))

// It's the right time to create datastore. Everything is OK
lpt_oldpointer = SetPointer(HourGlass!)
ids_menu_items = create datastore

ids_menu_items.DataObject = 'dw_menu_items'
ids_menu_items.SetTransObject(SQLCA)
ll_row_num = ids_menu_items.Retrieve(ls_cod_op, ls_ppqesystem, ls_window)
if ll_row_num < 0 then
	destroy ids_menu_items
	guo_message.uf_msg("SYS_000057", this.Title, "", "", StopSign!, OK!) // System can not get information about user's access to the window '%1'
	close(this)
	return
end if

// Now ids_menu_items has all accessible controls and menu items
lb_access = false
// Set menu
if IsNull(this.MenuID) = false then
	if this.wf_set_menu(this.MenuID) then
		lb_access = true
	end if
end if

// Set controls
ll_items = UpperBound(this.Control[])
if IsNull(ll_items) = false then
	if ll_items > 0 then
		if this.wf_set_controls(this) then
			lb_access = true
		end if
	end if
end if

// If  lb_access = true then the user has access to a control or a menu item
SetPointer(lpt_oldpointer)
end event

public subroutine config ();//************************************************************************************
// Author Name					:		Black Savage
// Creation Date 				:  		13-Feb-2007
// Definition of Parameters	:
// Description 					:		Description for this object
//
// Modification history 
//====================================================================================
// Version !   Date			!  Author			! 	Description
//====================================================================================
// 3.0			13-Feb-2007  Black Savage		Initial Version
//************************************************************************************

/*

The base application's window. 

CONTROLS:


INSTANCE VARIABLES:

		private 	datastore ids_menu_items // it has all accessible controls and menu items

FUNCTIONS:
		public		config()												return nothing
		private	wf_set_buttons(graphicobject ago_control)	return boolean
		private	wf_set_controls(graphicobject ago_control)	return boolean
		private	wf_set_menu(menu an_menu_id)				return boolean
		
EVENTS:
		open
		close
		we_security_process
*/
end subroutine

private function boolean wf_set_menu (menu an_menu_id);//************************************************************************************
// Author Name					:		Black Savage
// Creation Date 				:  		 13 -Feb- 2007 
// Definition of Parameters	:
// Description 					:		Set menu according to security
//
//											return false - means access denied
//											return true  - means access granted
// Modification history 
//====================================================================================
// Version !   Date			!  Author			! 	Description
//====================================================================================
//  3 . 0 			 13 -Feb- 2007   Black Savage		Initial Version
//************************************************************************************

long		ll_item, ll_count_items
long		ll_row, ll_row_count
boolean	lb_access
string		ls_itemname
menu		lm_item
boolean	lb_enabled, lb_visible, lb_toolbaritemvisible

if IsNull(an_menu_id) then return true

lb_access = false
ll_row_count = ids_menu_items.RowCount()
ll_count_items = UpperBound(an_menu_id.Item[])
if IsNull(ll_count_items)	then return false
if ll_count_items <=  0 	then return false

for ll_item =  1  to ll_count_items
	
	// Look at a lower level of menu
	if UpperBound(an_menu_id.Item[ll_item].Item[]) >  0  then
		if wf_set_menu(an_menu_id.Item[ll_item]) and lb_access = false then
			lb_access = true
		end if
	end if
	
	// Make item to be disable, if Enabled, Visible or ToolbarItemVisible are equal true
	// If a menu item is not in a list, it means it is disable
	lb_enabled				= an_menu_id.Item[ll_item].Enabled	
	lb_visible					= an_menu_id.Item[ll_item].Visible
	lb_toolbaritemvisible	= an_menu_id.Item[ll_item].ToolbarItemVisible
	if lb_enabled = true or lb_visible = true or lb_toolbaritemvisible = true then
		if lb_enabled = true		then an_menu_id.Item[ll_item].Enabled 					= false
		if lb_visible = true			then an_menu_id.Item[ll_item].Visible					= false
		if lb_toolbaritemvisible	then an_menu_id.Item[ll_item].ToolbarItemVisible	= false
	else
		// It means the menu item is hidden by a developer
		continue
	end if
	
	for ll_row =  1  to ll_row_count
		ls_itemname = ids_menu_items.GetItemString(ll_row, "itemname", Primary!, false)
		if IsNull(ls_itemname) then continue
		ls_itemname = Trim(ls_itemname)
		if ls_itemname = "" then continue
		
		if Lower(ClassName(an_menu_id.Item[ll_item])) = ls_itemname then
			if lb_enabled = true		then an_menu_id.Item[ll_item].Enabled 					= true
			if lb_visible = true			then an_menu_id.Item[ll_item].Visible					= true
			if lb_toolbaritemvisible	then an_menu_id.Item[ll_item].ToolbarItemVisible	= true
			lb_access = true
			exit
		end if
	next
next

return lb_access
end function

private function boolean wf_set_controls (graphicobject ago_control);//************************************************************************************
// Author Name					:		Black Savage
// Creation Date 				:  		 13 -Feb- 2007 
// Definition of Parameters	:
// Description 					:		Set controls according to security
// 
//											return false - means access denied
//											return true  - means access granted
//
// Modification history 
//====================================================================================
// Version !   Date			!  Author			! 	Description
//====================================================================================
//  3 . 0 			 13 -Feb- 2007   Black Savage		Initial Version
//************************************************************************************

string					ls_type
window				lw_win
tab					ltab_tab
userobject			luo_uo
long					ll_item, ll_count_items
boolean				lb_access

if IsNull(ago_control)				then return false
if IsValid(ago_control) = false	then return false

// Define object's type
choose case ago_control.TypeOf()
	case Window!
		lw_win = ago_control
		ll_count_items = UpperBound(lw_win.Control[])
		if IsNull(ll_count_items) then return false
		ls_type = 'w'
	case Tab!
		ltab_tab = ago_control
		ll_count_items = UpperBound(ltab_tab.Control[])
		if IsNull(ll_count_items) then return false
		ls_type = 't'
	case UserObject!
		luo_uo = ago_control
		ll_count_items = UpperBound(luo_uo.Control[])
		if IsNull(ll_count_items) then return false
		ls_type = 'u'
	case else
		return false
end choose

// Define that CommandButton! and PictureButton! only have security functionality
lb_access = false
for ll_item = 1 to ll_count_items
	choose case ls_type
		case 'w'
			choose case lw_win.Control[ll_item].TypeOf()
				case CommandButton!, PictureButton!
					// Set button
					if wf_set_buttons(lw_win.Control[ll_item]) and lb_access = false then
						lb_access = true
					end if
				case Tab!
					if wf_set_controls(lw_win.Control[ll_item]) and lb_access = false then
						lb_access = true
					end if
				case UserObject!
					if wf_set_controls(lw_win.Control[ll_item]) and lb_access = false then
						lb_access = true
					end if
			end choose			
		case 't'
			choose case ltab_tab.Control[ll_item].TypeOf()
				case CommandButton!, PictureButton!
					// Set button
					if wf_set_buttons(ltab_tab.Control[ll_item]) and lb_access = false then
						lb_access = true
					end if
				case Tab!
					if wf_set_controls(ltab_tab.Control[ll_item]) and lb_access = false then
						lb_access = true
					end if
				case UserObject!
					if wf_set_controls(ltab_tab.Control[ll_item]) and lb_access = false then
						lb_access = true
					end if
			end choose			
		case 'u'
			choose case luo_uo.Control[ll_item].TypeOf()
				case CommandButton!, PictureButton!
					// Set button
					if wf_set_buttons(luo_uo.Control[ll_item]) and lb_access = false then
						lb_access = true
					end if
				case Tab!
					if wf_set_controls(luo_uo.Control[ll_item]) and lb_access = false then
						lb_access = true
					end if
				case UserObject!
					if wf_set_controls(luo_uo.Control[ll_item]) and lb_access = false then
						lb_access = true
					end if
			end choose			
	end choose	
next

return lb_access
end function

private function boolean wf_set_buttons (graphicobject ago_control);//************************************************************************************
// Author Name					:		Black Savage
// Creation Date 				:  		13-Feb-2007
// Definition of Parameters	:
// Description 					:		Set CommandButton! and PictureButton! according to security
// 
//											return false - means access denied
//											return true  - means access granted
//
// Modification history 
//====================================================================================
// Version !   Date			!  Author			! 	Description
//====================================================================================
// 3.0			13-Feb-2007  Black Savage		Initial Version
//************************************************************************************

string					ls_type, ls_itemname
commandbutton	lcb_button
picturebutton		lpb_button
long					ll_row, ll_row_count
boolean				lb_access
boolean				lb_enabled, lb_visible

if IsNull(ago_control)				then return false
if IsValid(ago_control) = false	then return false

// Define object's type
choose case ago_control.TypeOf()
	case CommandButton!
		lcb_button = ago_control
		ls_type = 'cb'
	case PictureButton!
		lpb_button = ago_control
		ls_type = 'pb'
	case else
		return false
end choose

// Make button to be disable, if Enabled or Visible are equal true
// If a button is not in a list, it means the button disable
choose case ls_type
	case 'cb'
		lb_enabled	= lcb_button.enabled
		lb_visible		= lcb_button.visible
		if lb_enabled = true or lb_visible = true then
			if lb_enabled	= true then lcb_button.enabled		= false
			if lb_visible		= true then lcb_button.visible		= false
		else
			// It means the button is hidden by a developer
			return false
		end if
	case 'pb'
		lb_enabled	= lpb_button.enabled
		lb_visible		= lpb_button.visible
		if lb_enabled = true or lb_visible = true then
			if lb_enabled	= true then lpb_button.enabled		= false
			if lb_visible		= true then lpb_button.visible		= false
		else
			// It means the button is hidden by a developer
			return false
		end if
end choose

ll_row_count = ids_menu_items.RowCount()
lb_access = false
for ll_row =  1  to ll_row_count
	ls_itemname = ids_menu_items.GetItemString(ll_row, "itemname", Primary!, false)
	if IsNull(ls_itemname) then continue
	ls_itemname = Trim(ls_itemname)
	if ls_itemname = "" then continue
	
	if Lower(ClassName(ago_control)) = ls_itemname then
		choose case ls_type
			case 'cb'
				if lb_enabled	= true then lcb_button.enabled		= true
				if lb_visible		= true then lcb_button.visible		= true
				lb_access = true
				exit
			case 'pb'
				if lb_enabled	= true then lpb_button.enabled		= true
				if lb_visible		= true then lpb_button.visible		= true
				lb_access = true
				exit
		end choose
	end if
next

return lb_access
end function

on w_base.create
end on

on w_base.destroy
end on

event open;//************************************************************************************
// Author Name					:		Black Savage
// Creation Date 				:  		 12 -Feb- 2007 
// Definition of Parameters	:
// Description 					:		Open script
//
// Modification history 
//====================================================================================
// Version !   Date			!  Author			! 	Description
//====================================================================================
//  3 . 0 			 12 -Feb- 2007   Black Savage		Initial Version
//************************************************************************************

this.PostEvent("we_security_process")
end event

event close;//************************************************************************************
// Author Name					:		Black Savage
// Creation Date 				:  		 12 -Feb- 2007 
// Definition of Parameters	:
// Description 					:		Close script
//
// Modification history 
//====================================================================================
// Version !   Date			!  Author			! 	Description
//====================================================================================
//  3 . 0 			 12 -Feb- 2007   Black Savage		Initial Version
//************************************************************************************

if IsValid(ids_menu_items) then destroy ids_menu_items
end event

Наследуешь от этого окна свои окна.
В dw_menu_items выбираются (в зависимости от пользователя, модуля и окна)
имена айтомов меню или названия кнопок на окне. Вообщем, если голова на плечах есть,
посмотришь, переделаешь под свои нужды.

Данный код, по понятным причинам, пока сырой...
...
Рейтинг: 0 / 0
Как реализировать аутентификацию пользователя
    #34328113
Dimas_Verbatim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, буду разбираться!!!
...
Рейтинг: 0 / 0
Как реализировать аутентификацию пользователя
    #34328135
Black Savage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть еще другой способ. Все пункты меню остаются доступными для пользователей,
а ограничения выставляются на уровне базы (на таблицы и процедуры).
...
Рейтинг: 0 / 0
Как реализировать аутентификацию пользователя
    #34328171
Dimas_Verbatim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Программа предназначается для пользователей низкого уровня, поэтому у них начнёт возникать много вопросов, лучше будет ограничить доступ к пунктам меню!
...
Рейтинг: 0 / 0
Как реализировать аутентификацию пользователя
    #34328176
Dim2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Black Savage wrote:

> Есть еще другой способ. Все пункты меню остаются доступными для
> пользователей, а ограничения выставляются на уровне базы (на таблицы и процедуры).

Можно, но IMHO неинтуитивно.
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Как реализировать аутентификацию пользователя
    #34328256
Black Savage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dim2000Можно, но IMHO неинтуитивно.
Незнаю. У меня на прошлой работе была как раз такая реализация. Мне нравилось.
При таком подходе не нужен дополнительный интерфейс. Если скрывать пункты меню,
то неизбежно придется писать интерфейс по раздаче доступов неким ролям на пункты меню,
(через роли и пользователь получит соответствующий функционал). Вообщем, все это дело
вкуса и времени...
...
Рейтинг: 0 / 0
Как реализировать аутентификацию пользователя
    #34329314
Estets
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Black Savage Dim2000Можно, но IMHO неинтуитивно.
Незнаю. У меня на прошлой работе была как раз такая реализация. Мне нравилось.
При таком подходе не нужен дополнительный интерфейс. Если скрывать пункты меню,
то неизбежно придется писать интерфейс по раздаче доступов неким ролям на пункты меню,
(через роли и пользователь получит соответствующий функционал). Вообщем, все это дело
вкуса и времени...
ИМХО правилнее было бы написать один раз, чем сто раз ответить на ворос "Я выбираю пункт меню ХХХ и у меня ничего не происходит"
...
Рейтинг: 0 / 0
Как реализировать аутентификацию пользователя
    #34329371
Black Savage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EstetsИМХО правилнее было бы написать один раз, чем сто раз ответить на ворос "Я выбираю пункт меню ХХХ и у меня ничего не происходит"
Почему не происходит? Пользователь видит permission denied . Или бла-бла-бла по-усски...
...
Рейтинг: 0 / 0
Как реализировать аутентификацию пользователя
    #34332137
Estets
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Black Savage EstetsИМХО правилнее было бы написать один раз, чем сто раз ответить на ворос "Я выбираю пункт меню ХХХ и у меня ничего не происходит"
Почему не происходит? Пользователь видит permission denied . Или бла-бла-бла по-усски...
Если не секрет, у вас есть администраторский опыт? Именно "поддержки пользователя"? Могу сказать что в половине случаев после выдачи MessageBox permission denied пользователь начнет звонить своему начальству со слезами "программа сломалась, в этой программе невозможно работать... и т.д." Четверть пользователей не могут толком прочитать фразу на английском, а иногда и на русском, закрывают сообщение и начинают звонить "У меня не работает программа, выдало какое-то сообщение и ничего не сделала..." Большинство не могут описать порядок действий вызвавших данное сообщение типа "Нажала накой-то пункт меню и у меня программа сломалась..." И это в банке где достаточно высокие требования к работникам типа высшее образование, знание ПК, базовый английский.
...
Рейтинг: 0 / 0
Как реализировать аутентификацию пользователя
    #34332544
Black Savage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To Estets
Успокойся, брателло. Я проработал в банках более пяти лет. Соответственно,
занимался и администрированием и поддержкой пользователей. То что я написал выше (про
пермишины на объекты базы), работало как раз в банке. А что касается поддержки пользователей,
то я это решил радикально. Просто использовал Remote Administrator , у меня в нем был
список всех компов (в скобках пользователь). Когда кто-то звонил, я по ходу разговора (даже
не вникая в суть дела) сразу коннектился к нужному компу, а дальше слушал тот бред, который
нес пользователь. У этого способа есть один существенный недостаток: проблема решалась
слишком быстро. Кто поумнее меня, никогда так не поступал. Всегда тянул время с любой ерундой,
зато сразу же повышалась роль и значимость такого человека...
...
Рейтинг: 0 / 0
Как реализировать аутентификацию пользователя
    #34335521
Estets
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Black SavageПросто использовал Remote Administrator , у меня в нем был
список всех компов (в скобках пользователь). Когда кто-то звонил, я по ходу разговора (даже
не вникая в суть дела) сразу коннектился к нужному компу, а дальше слушал тот бред, который
нес пользователь...
+1 ;) К сожалению, не могу воспользоваться советом из за политики безопасности. Но все равно считаю "Если пользователь что-то не видит, то он это не сломает".
...
Рейтинг: 0 / 0
Как реализировать аутентификацию пользователя
    #34335825
PBGuest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Black SavageЯ проработал в банках более пяти лет.

Просто использовал Remote Administrator, у меня в нем был
список всех компов (в скобках пользователь). Когда кто-то звонил, я по ходу разговора (даже
не вникая в суть дела) сразу коннектился к нужному компу, а дальше слушал тот бред, который
нес пользователь.]

А если тебе звонят из удаленного филиала???
...
Рейтинг: 0 / 0
Как реализировать аутентификацию пользователя
    #34339603
edmikeca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если проект с использованием PFC, то почему бы не использовать PFC security? Там уже все сделано за Вас.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Как реализировать аутентификацию пользователя
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]