EAS Cloud8.8 集成第三方oauth2.0的统一认证
# CAS适用版本:CAS 3.5.3
# CAS登录流程:
![image.webp](/download/01006c2446c4450944a4b8049608fbe559ba.webp)
# OAuthen2.0登录流程:
![image.webp](/download/0100f9b007d761064509a07c602c25a88d53.webp)
**根据上述CAS和OAuthen2.0原理图,改造的关键点如下**
1、登录拦截跳转到OAuthen2.0认证中心
2、认证通过后跳回业务系统,需要携带认证码
3、获取认证码,并后台请求认证中心进行验证并获取到用户信息
4、拿到用户信息后解析并构造Assertion对象给CAS
# 二开修改要点
## 一、登录跳转拦截,未登录情况需跳转到oauth2.0的统一认证中心登录界面。
1、KDPortalAuthenticationFilter 中覆写方法:retrieveTicketFromRequest,覆写内容如下:
```
protected String retrieveTicketFromRequest(HttpServletRequest request){
String code = request.getParameter("code");
if(!StringUtil.isEmpty(code)){
return code;
}
return super.retrieveTicketFromRequest(request);
}
```
2、KDPortalAuthenticationFilter doFilter中 最后跳转登录界面前,修改构建跳转认证中心登录地址,修改如下:
```
将这行代码:
final String urlToRedirectTo = CommonUtils.constructRedirectUrl(this.casServerLoginUrl,
getProtocol().getServiceParameterName(), modifiedServiceUrl, this.renew, this.gateway, this.method);
修改如下
final String urlToRedirectTo = "http://cas.example.org:8080/cas/oauth2.0/authorize?"+
"response_type=code&client_id=100001&redirect_uri="+URLEncoder.encode(request.getRequestURL().toString(),"utf-8");
```
拼接的url要符合标准,例如如下:
```
https://authorization-server.com/auth
?response_type=code
&client_id=29352915982374239857
&redirect_uri=https://example-app.com/callback
&scope=create+delete
&state=xcoiv98y2kd22vusuye3kch
```
response_type=code:这将通知认证中心,客户端正在启动授权代码流程。
client_id:客户端的标识符,在开发人员首次注册应用程序时获得。
redirect_uri:告诉认证中心在用户批准请求后将用户发送回何处。
scope:一个或多个空格分隔的字符串,指示客户端请求的权限。(可以不传)
state:客户端生成一个随机字符串并将其包含在请求中。然后应该检查在用户授权客户端之后是否返回相同的值。用于防止CSRF攻击。
## 二、通过code进行系统登录
统一认证中心登录成功后会发送302跳转请求到eas,并携带code到eas,eas需要校验code的合法性,以及从code换取用户的登录信息然后进行登录,我们需要将这一步要转到我们自己的类中来
1、KDPortalTicketValidationFilter中的retrieveTicketFromRequest方法最后面一行
(return super.retrieveTicketFromRequest(request);)前面加上以下内容
```
String code = request.getParameter("code");
if(!StringUtil.isEmpty(code)){
return code;
}
```
2、需要修改KDPortalTicketValidationFilter类的getTicketValidator方法在第一行添加
```
String code = request.getParameter("code");
if(!StringUtil.isEmpty(code)){
return new OAuth20CodeValidata();
}
```
OAuthen20CodeValidata参考如下:
```
public class OAuth20CodeValidata implements TicketValidator{
@Override
public Assertion validate(String code, String url)
throws TicketValidationException {
String valiDataUrl = "http://cas.example.org:8080/cas/oauth2.0/accessToken?grant_type=authorization_code&client_id=100001&client_secret=100001" +
"&code="+code+"&redirect_uri=http://127.0.0.1:56898/portal/";
//通过url获取用户信息
//String user = HttpClient.getUserInfo(valiDataUrl);
String user = "user";
//可以放账套信息和语言信息等登录需要的信息,如果不放需要在CASLoginConfig.properties配置
Map<String,Object> map = new HashMap<String,Object>();
map.put("solutionName","eas");
map.put("dataCenter","SP1DEMO");
map.put("locale","L2");
map.put("dbType","0");
map.put("userAuthPattern","eas");
map.put("isPureWeb","true");
map.put("loginFlow","true");
map.put("sso.user.mapping","true");
Assertion assertion = new AssertionImpl(new AttributePrincipalImpl(user, map));
return assertion;
}
}
```
## 三、登录多样性
以上方案完全是从代码层面去兼容oauth2.0认证登录,以兼容保留的产品自带的登录的方式,单点登录的原有配置文件请不要修改。
如果不需要走oauth2.0认证登录或者auth2.0认证无法使用时,可直接访问产品自有的标准登录界面进行登录,访问链接如下:
http://127.0.0.1:8080/eassso/login?service=http://127.0.0.1:8080/portal/main.jsp
这个链接的service参数表示的是最终登录完成后跳转的地址,可按实际情况修改。
EAS Cloud8.8 集成第三方oauth2.0的统一认证
# CAS适用版本:CAS 3.5.3# CAS登录流程:![image.webp](/download/01006c2446c4450944a4b8049608fbe559ba.webp)# OAuthen2.0登录流...
点击下载文档
上一篇:预警重复发送5次下一篇:如何计提固定资产折旧
本文2024-09-16 22:08:50发表“eas cloud知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-eas-46224.html
您需要登录后才可以发表评论, 登录登录 或者 注册
最新文档
热门文章