如何自定义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 并没有重新赋值和可配置的地方。
关联问题:
[…] 关于CAS客户端通过OIDC协议认证时,使用用户名、手机号登录,返回的principal… […]