CAS/关于CAS客户端通过OIDC协议认证时,使用用户名、手机号登录,返回的principalId不一样的问题

如何自定义principalId

一般我们登陆时使用的账号,默认当做principalId返回给客户端,比如通常账号使用username进行登陆,返回的principalId就是 username,使用手机号登录,principalId就是手机号。

这样会带来一个问题,sometime,客户端(cas client service)会拿principalId去自己的数据库查询用户,可能会查不到东西。

比如你使用Jira ,平时都是使用用户名(eg:zhangsan)进行登录,在接入了Jira 的oauth 登录插件后,出于习惯,你又开始使用手机号在CAS上进行登录,登录之后,发现以前的数据没了。那是因为,CAS返回给Jira 的principalId 是一个手机号,Jira 查不到用户,就会以手机号作为账号创建一个新用户。”什么!我有了两个账号!我方了。。。“

那怎么解决呢,超级简单——

{  "@class""org.apereo.cas.services.RegexRegisteredService",  "serviceId""^(https|http)://.*",  "name""HTTPS and HTTP",  "id"10000001,  "description""All http & https",  "evaluationOrder"999999,  "usernameAttributeProvider" : {          // 添加一个 username 属性提供者即可    "@class" "org.apereo.cas.services.PrincipalAttributeRegisteredServiceUsernameProvider",    "usernameAttribute" "account_id",   // 指定principalId    "canonicalizationMode" "NONE" // 大小写转换  }}

注意:测试的时候,在CAS server端看到的还是你登录时使用的账号,需要在客户端进行验证这个provider的正确性

For more,See Attribute-Release-PrincipalId

另外,在看文档和源码时发现另外两处和principalId有关的地方:

cas.personDirectory.principalAttribute,这个还未研究有什么作用

org.apereo.services.persondir.support.SimpleUsernameAttributeProvider

这个是apereo在 person-directory-impl 中提供的 provider,但是在cas-server中,属性 usernameAttribute 并没有重新赋值和可配置的地方。

关联问题:

One thought on “CAS/关于CAS客户端通过OIDC协议认证时,使用用户名、手机号登录,返回的principalId不一样的问题”

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注