默认情况下单点登录只返回登录的用户名,不会返回其它的用户信息。如果想要返回更多的用户信息,我们需要进行扩展开发。比如返回用户的id,cas客户端从请求中获取登录用户的id。本文是基于CAS 5.1.X版本自定义jdbc验证这篇文章进行叙述。
一、修改services
- 默认配置
HTTPSandIMAPS-10000001.json 文件是cas默认的配置,如果我们没有配置自定义的services,就会使用这个默认配置。
{
"@class" : "org.apereo.cas.services.RegexRegisteredService",
"serviceId" : "^(http|https|imaps)://.*",
"name" : "HTTPS and IMAPS",
"id" : 10000001,
"description" : "This service definition authorizes all application urls that support HTTPS and IMAPS protocols.",
"evaluationOrder" : 10000,
"attributeReleasePolicy" : {
"@class" : "org.apereo.cas.services.ReturnAllAttributeReleasePolicy"
}
}
对于不同的客户端要求返回的用户信息不同。cas提供了多种属性返回策略,也可以自定义返回策略。
- Return All (所有配置返回的都返回)
- Deny All (配置拒绝的出现则报错)
- Return Allowed(只返回允许的主要属性)
- 自定义Filter(自定义过滤策略)
例如:限制某些字段返回(只返回学校和邮箱)
"attributeReleasePolicy" : {
"@class" : "org.apereo.cas.services.ReturnAllowedAttributeReleasePolicy",
"allowedAttributes" : [ "java.util.ArrayList", [ "school", "email" ] ]
}
例如:返回所有字段信息
"attributeReleasePolicy" : {
"@class" : "org.apereo.cas.services.ReturnAllAttributeReleasePolicy"
}
- 修改我们自定义的services
{
"@class": "org.apereo.cas.services.RegexRegisteredService",
"serviceId": "^(https|imaps|http)://.*",
"name": "本地服务",
"id": 100000,
"description": "这是一个本地允许的服务,通过localhost访问都允许通过",
"evaluationOrder": 1,
"theme":"hzww",
"attributeReleasePolicy": {
"@class": "org.apereo.cas.services.ReturnAllAttributeReleasePolicy"
},
"proxyPolicy": {
"@class": "org.apereo.cas.services.RegexMatchingRegisteredServiceProxyPolicy",
"pattern": "^(https|http)?://.*"
},
"logoutUrl": "http://localhost:8080/"
}
二、服务端jdbc验证器修改
在jdbc验证后,存放在Map集合中返回给客户端。
Map<String,Object> result = new HashMap<String,Object>();
result.put("username", rs.getString("userId"));
result.put("email", rs.getString("email"));
result.put("addr", rs.getString("addr"));
result.put("phone", rs.getString("phone"));
result.put("age", rs.getString("age"));
//允许登录,并且通过this.principalFactory.createPrincipal来返回用户属性
return createHandlerResult(credential, this.principalFactory.createPrincipal(username, result), null);
三、客户端获取用户信息
RequestContext context = RequestContext.getCurrentContext();
HttpServletRequest request = context.getRequest();
Principal principal = request.getUserPrincipal();
//cas自定义返回数据
Map <String, Object> attributes = ((AttributePrincipal) principal).getAttributes();
//获取用户的登录id
String userName = principal.getName();
//获取用户id
Object userId = attributes.get("USERID");
网友评论