PeopleSoft-外部系统单点登陆

PS单点逻辑

外部系统点击访问链接时,默认使用【web概要配置-安全性】中公共用户DC_SSO 用户登陆,然后再依次执行【登陆PeopleCode】页面配置的函数。如图,先进入Function DC_SSO_YF,假设成功登陆,那么,&authMethod = “DC_SSO_YF” ,则不需要进入Function DC_SSO 的逻辑;如果无法成功登陆,那么&authMethod 为空,进入Function DC_SSO逻辑,进行SSO校验,首次无法登陆成功,那么会跳转至SSO登陆认证页面。

定义单点函数

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
Function DC_SSO_YF()
If %SignonUserId = "DC_SSO" Then
Local string &logstr;
Local string &yfToken = %Request.GetParameter("token");/*获取请求body中的token值*/
Local string &reqUrl = %Request.FullURI;/*获取请求URI*/
Local string &qryString = %Request.QueryString;/*获取请求中的QueryString,即url上?号后面的key+value*/
Local string &fullUrl;
&fullUrl = &reqUrl;

If All(&yfToken) Then
Local DC_SSO:SSO &oauth1 = create DC_SSO:SSO();
&userID = &oauth1.getYfUserInfo(&yfToken);/*调用外部系统方法,验证token同时获取用户ID*/
REM:判断PS系统中是否存在用户ID;
SQLExec("SELECT 'X' FROM PSOPRDEFN WHERE OPRID =:1 AND ACCTLOCK=0", &userID, &exist);
If %SqlRows > 0 Then
SetAuthenticationResult( True, &userID, "", False);/*根据存在的用户ID登陆PS系统*/
&authMethod = "DC_SSO_YF";/*全局变量赋值,用以后续处理*/
End-If;
End-If;
End-If;
End-Function;

Function DC_SSO()
If &authMethod <> "DC_SSO_YF" And
%SignonUserId = "DC_SSO" Then

Local string &logstr;
Local string &code = %Request.GetParameter("code");/*获取请求body中的code值*/
Local string &reqUrl = %Request.FullURI;/*获取请求URI*/
Local string &qryString = %Request.QueryString;/*获取请求中的QueryString,即url上?号后面的key+value*/
Local string &fullUrl;

If All(&qryString) Then
&fullUrl = &reqUrl | "?" | &qryString; /*根据URI+QueryString拼接出URL全路径*/
Else
&fullUrl = &reqUrl;
End-If;

rem 文件下载组件不需要登录,跳过单点直接公共账号登录 ;
If Find("DC_MENU.LH_VIEW_FILE_COM", &reqUrl) > 0 Then
SetAuthenticationResult( True, %SignonUserId, "", False);
Return;
End-If;

If None(&code) Then /* 第一次访问的URL的情况*/
Local string &l_strRedirectURL = GetURL(URL.DC_SSO_URL) | "authorize?response_type=code&client_id=" | GetURL(URL.DC_SSO_CLIENT_ID) | "&redirect_uri=" | EncodeURLForQueryString(&fullUrl);
/*这时没有code,跳转到SSO的登陆地址*/
SetAuthenticationResult( True, %SignonUserId, &l_strRedirectURL, False);
Else /* SSO登陆后跳转回PS的情况*/
Local DC_SSO:SSO &oauth = create DC_SSO:SSO();
&accessToken = &oauth.getAccessToken(&code, &fullUrl);/*这时根据code去获取AccessToken*/
&userID = &oauth.getUserInfo(&accessToken);/*再根据AccessToken去获取用户*/
REM:判断PS系统中是否存在用户;
SQLExec("SELECT 'X' FROM PSOPRDEFN WHERE OPRID =:1 AND ACCTLOCK=0", &userID, &exist);
If %SqlRows > 0 Then
SetAuthenticationResult( True, &userID, "", False);
&authMethod = "DC_SSO";
Else
/*不存在账号则退出*/
SetAuthenticationResult( False, "", "", False);
End-If;
End-If;
End-If;
End-Function;

SetAuthenticationResult系统标准方法

SetAuthenticationResult(AuthResult [,UserId] [,ResultDocument] [,PasswordExpired] [,DaysLeftBeforeExpire])

SetAuthenticationResult(参数1,参数2,参数3,参数4,参数5)

参数1,如果为True,标识登陆成功。

参数2,登陆用户ID,%SignonUserId获取web概要中配置的公共用户ID。

参数3,在参数1等于true时,表示要在登陆结果页面signonresult tdoc.html显示的结果消息String;如果参数1等于false时,则ResultDocument文本值显示在登录屏幕上。如果ResultDocument具有值,则忽略PasswordExpired和DaysLeftBeforeExire中的任何值。

参数4,标识密码是否过期,过期了会在PasswordExpired.html显示报错;注意:如果将此值指定为True,则允许用户登录,但只能访问系统的有限部分: 只能更改过期的密码。

参数5,表示几天内过期,登陆时会passwordwarning.html显示超时时间。注意:指示密码过期前剩余天数的数值。如果值大于0,则在“授权为真”和“过期为假”时显示警告。

PeopleBook参考:

SetAuthenticationResult系统标准方法详解