验证登录用户账密

作者:斌将军 约 5 分钟阅读 更新日期:2025-03-02 1 年前更新 标签:ABAP, Data Engineering, 开发, 数据工程
验证登录用户账密 - 封面图
验证登录用户账密 - 封面图

**1**

**文档说明**

验证登录用户账密 - 封面图
验证登录用户账密 - 封面图

在开发中需要验证某SAP用户的账密来执行某些操作。具体就是指,当使用某个操作时,需要输入账号密码进行校验,此校验和登录时的校验是一致的,也具备多次校验错误后的账户锁定。

本文档将通过代码示例,实现账密校验功能

**2**

**实现过程**

验证登录用户账密 - 封面图
验证登录用户账密 - 封面图

首先画出用于输入账密的屏幕

验证登录用户账密 - 封面图
验证登录用户账密 - 封面图

布局中画上输入框

验证登录用户账密 - 封面图
验证登录用户账密 - 封面图
验证登录用户账密 - 封面图
验证登录用户账密 - 封面图

逻辑流

验证登录用户账密 - 封面图
验证登录用户账密 - 封面图

为了能在屏幕中输错账密后再次输入,可以通过循环输出屏幕,校验通过后退出循环

验证登录用户账密 - 封面图
验证登录用户账密 - 封面图

本实例中还校验了账号维护的全称是否完整

验证登录用户账密 - 封面图
验证登录用户账密 - 封面图

可以通过SU01进行维护

验证登录用户账密 - 封面图
验证登录用户账密 - 封面图

执行效果如下

输入密码回车或点击按钮

验证登录用户账密 - 封面图
验证登录用户账密 - 封面图

错误效果

验证登录用户账密 - 封面图
验证登录用户账密 - 封面图

成功则直接关闭当前屏幕,执行后续操作

**3**

**参考代码**

验证登录用户账密 - 封面图
验证登录用户账密 - 封面图
TABLES:rc70d. DATA:gv_sign_result TYPE char1, gv_screen_keep TYPE char1. "保持弹框 DATA:r_ucomm LIKE sy-ucomm, ok_code TYPE sy-ucomm, save_code TYPE sy-ucomm.

"调用弹框输入密码校验gv_screen_keep = 'X'.WHILE gv_screen_keep IS NOT INITIAL. CALL SCREEN 9000 STARTING AT 10 1.ENDWHILE.

IF gv_sign_result = 'S'. MESSAGE '校验成功' TYPE 'S'.ENDIF.*&---------------------------------------------------------------------**& Module STATUS_9000 OUTPUT*&---------------------------------------------------------------------**&*&---------------------------------------------------------------------*MODULE status_9000 OUTPUT. SET PF-STATUS 'PW_ENTER'. SET TITLEBAR '001'.ENDMODULE.*&---------------------------------------------------------------------**& Module INIT_9000 OUTPUT*&---------------------------------------------------------------------**&*&---------------------------------------------------------------------*MODULE init_9000 OUTPUT. CLEAR:gv_sign_result. CLEAR:rc70d-signer,rc70d-password,rc70d-reason_ktxt. rc70d-signer = sy-uname. rc70d-sign_reason = 'XX签名'. SET CURSOR FIELD 'RC70D-PASSWORD'.ENDMODULE.*&---------------------------------------------------------------------**& Module INPUT_CHECK INPUT*&---------------------------------------------------------------------** text*----------------------------------------------------------------------*MODULE input_check INPUT. DATA: l_user_address TYPE addr3_val. IF ok_code <> 'EESC'. CALL FUNCTION 'SUSR_USER_ADDRESS_READ' EXPORTING user_name = rc70d-signer IMPORTING user_address = l_user_address EXCEPTIONS user_address_not_found = 1 OTHERS = 2. IF sy-subrc <> 0.* User nicht gefunden oder nicht vollständig gepflegt. CLEAR rc70d-signer. CLEAR rc70d-password. CLEAR rc70d-full_name.* MESSAGE e259(sig) WITH rc70d-signer. MESSAGE i259(sig) WITH rc70d-signer.* g_error-user_address_not_found = c_no_user. SET SCREEN 0. LEAVE SCREEN.* EXIT. ELSE. IF ( NOT l_user_address-name_first IS INITIAL AND NOT l_user_address-name_last IS INITIAL ). CONCATENATE l_user_address-name_last l_user_address-name_first INTO rc70d-full_name SEPARATED BY space. ELSE.* User nicht gefunden oder nicht vollständig gepflegt. CLEAR rc70d-signer. CLEAR rc70d-password. CLEAR rc70d-full_name.* MESSAGE e257(sig) WITH rc70d-signer. MESSAGE i257(sig) WITH rc70d-signer.* g_error-user_address_not_found = c_no_fullname. SET SCREEN 0. LEAVE SCREEN.* EXIT. ENDIF. ENDIF. ENDIF.ENDMODULE.

*&---------------------------------------------------------------------**& Module USER_COMMAND_9000 INPUT*&---------------------------------------------------------------------** text*----------------------------------------------------------------------*MODULE user_command_9000 INPUT.

DATA: lt_row TYPE lvc_t_row, lt_roid TYPE lvc_t_roid, ls_row TYPE lvc_s_row.

save_code = ok_code. CLEAR ok_code. CASE save_code. WHEN 'EESC'."设置功能键返回按钮单击事件 CLEAR:gv_screen_keep. MESSAGE '用户取消操作' TYPE 'S' DISPLAY LIKE 'E'."用户取消操作 LEAVE TO SCREEN 0.

WHEN 'ENT'. PERFORM frm_check_password. ENDCASE.ENDMODULE.

*&---------------------------------------------------------------------**& Form FRM_CHECK_PASSWORD*&---------------------------------------------------------------------** text 校验密码*----------------------------------------------------------------------*FORM frm_check_password." USING pv_signer TYPE sig_signer* pv_password TYPE ssfpw* CHANGING pv_type TYPE char1* pv_message TYPE char255.

DATA:go_system_signature TYPE REF TO cl_ssft_system_signature. DATA:lv_signer TYPE sig_signer, lv_password TYPE ssfpw, lv_message TYPE char255.

CLEAR:gv_sign_result.

lv_signer = rc70d-signer. lv_password = rc70d-password. CREATE OBJECT go_system_signature. CALL METHOD go_system_signature->if_ssft_system_signature~check_password EXPORTING if_signer = lv_signer if_ask_pwd = '' "不弹出弹框 if_password = lv_password EXCEPTIONS canceled_by_user = 1 password_invalid = 2 password_expired = 3 profile_locked = 4 system_error = 5 rfc_error = 6 profile_error = 7 signature_error = 8 OTHERS = 9. IF sy-subrc NE 0.* pv_type = 'E'. CALL FUNCTION 'MESSAGE_TEXT_BUILD' EXPORTING msgid = sy-msgid msgnr = sy-msgno msgv1 = sy-msgv1 msgv2 = sy-msgv2 msgv3 = sy-msgv3 msgv4 = sy-msgv4 IMPORTING message_text_output = lv_password. MESSAGE lv_password TYPE 'I'." ELSE. gv_sign_result = 'S'. CLEAR:gv_screen_keep."去掉屏幕保持 ENDIF.ENDFORM.

**—— 希望本篇文章对您有所帮助 ——**

斌将军

关于作者:斌将军

企业信息化与 SAP 技术顾问,长期专注 SAP ABAP、FI/CO、MM、SD 等模块的技术分享与实战经验总结。查看更多介绍

来源说明:本文内容由「验证登录用户账密.md」整理生成,仅用于内部技术分享与学习交流。