CAS 5.1.5版本多属性返回

默认情况下单点登录只返回登录的用户名,不会返回其它的用户信息。如果想要返回更多的用户信息,我们需要进行扩展开发。比如返回用户的id,cas客户端从请求中获取登录用户的id。本文是基于CAS 5.1.X版本自定义jdbc验证这篇文章进行叙述。

一、修改services

  1. 默认配置
    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"
}
  1. 修改我们自定义的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 result = new HashMap();
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  attributes = ((AttributePrincipal) principal).getAttributes();
//获取用户的登录id
String userName = principal.getName();
//获取用户id
Object userId = attributes.get("USERID");

你可能感兴趣的:(CAS 5.1.5版本多属性返回)