【SSO单点系列】(4):CAS4.0 SERVER登录后用户信息的返回
接着上一篇,在上一篇中我们描述了怎么在CAS SERVER登录页上添加验证码,并进行登录。一旦CAS SERVER验证成功后,我们就会跳转到客户端中去。跳转到客户端去后,大家想一想,客户端总要获取用户信息吧,不然客户端是怎么知道登录的是哪个用户。那么客户端要怎么获取用户信息呢?
其实验证成功,跳转客户端这个过程中,CAS SERVER 会返回登录的相关信息给客户端,客户端只要进行获取,就能知道登录的具体是哪个用户了。不过CAS 默认只返回用户账号给客户端,那么怎么定义CAS SERVER返回的信息呢? 这就是本篇具体讲解的内容了,大家听我慢慢道来。
相关接口
在开始时,我们先了解下有关相关的几个接口
- Credentials
- Principal
- IPersonAttributeDao
- PrincipalResolver
Credentials
Credentials (org.jasig.cas.authentication.Credentials)接口,我们在上一篇其实有使用过,我们当时有用过一个叫 UsernamePasswordCredential 的类,就是实现了Credentials接口。这个接口是用来定义我们登录页上输入的认证信息的,比如用户名、密码、验证码等,可以理解为用户认证的相关凭据。
Principal
Principal (org.jasig.cas.authentication.principal.Principal) 接口,这个主要是用来保存用户认证后的用户信息,信息保存在一个Map中。
IPersonAttributeDao
IPersonAttributeDao (org.jasig.services.persondir.IPersonAttributeDao) 接口,这个是用来定义我们需要返回给客户端相关信息的接口,CAS SERVER 默认有提供许多实现,比如
- LdapPersonAttributeDao :通过查询 LDAP 目录 ,来返回信息
- SingleRowJdbcPersonAttributeDao : 通过JDBC SQL查询,来返回信息
等等,还有许多,大家可以参考源码中的实现,CAS SERVER 提供了各种功能的实现,有时候我们可以直接使用这个现成的就行了。
PrincipalResolver
PrincipalResolver(org.jasig.cas.authentication.principal.PrincipalResolver) 接口,上面有说到 Credentials 是从登录页面上进行获取相关用户信息的。那么认证成功后,怎么把Credentials里面的信息转换到 Principal 中呢,这就是这个接口的作用了。由于认证本身是没有返回用户信息的,只是确定认证是通过还是没有通过。这时还要用到我们上面的IPersonAttributeDao 接口,在这接口中我们就可以定义我们需要返回的信息了。
这接口中有两个方法
- resolve : 解析Credentials中的信息,返回 Principal 接口
- supports : 判断Credentials 是否支持 Principal 协议。
ps: 在3.x版本中没有 PrincipalResolver接口,对应的是CredentialsToPrincipalResolver, PrincipalResolver这个是在4.0版本中加入的,大家要注意。
流程
相关接口讲解后,大家应该对怎么返回信息有个大概的思路了。没错就是实现上面所说的 IPersonAttributeDao 、PrincipalResolver 接口 。下面根据代码讲解下具体的一个流程:
首先打开 deployerConfigContext.xml 文件,看下面的定义:
<!--
| Resolves a principal from a credential using an attribute repository that is configured to resolve
| against a deployer-specific store (e.g. LDAP).
-->
<bean id="primaryPrincipalResolver"
class="org.jasig.cas.authentication.principal.PersonDirectoryPrincipalResolver" >
<property name="attributeRepository" ref="attributeRepository" />
</bean> <!--
Bean that defines the attributes that a service may return. This example uses the Stub/Mock version. A real implementation
may go against a database or LDAP server. The id should remain "attributeRepository" though.
+-->
<bean id="attributeRepository" class="org.jasig.services.persondir.support.StubPersonAttributeDao"
p:backingMap-ref="attrRepoBackingMap" /> <util:map id="attrRepoBackingMap">
<entry key="uid" value="uid" />
<entry key="eduPersonAffiliation" value="eduPersonAffiliation" />
<entry key="groupMembership" value="groupMembership" />
</util:map>
//PersonDirectoryPrincipalResolver 部分源码
public final Principal resolve(final Credential credential) {
logger.debug("Attempting to resolve a principal...");
String principalId = extractPrincipalId(credential); //extractPrincipalId 方法从credential中抽取id
//省略...
final IPersonAttributes personAttributes = this.attributeRepository.getPerson(principalId); //根据IPersonAttributeDao 中的getPerson 获取返回的属性
final Map<String, List<Object>> attributes;
//最终返回 Principal
return new SimplePrincipal(principalId, convertedAttributes);
}
具体流程:
1.从上面的deployerConfigContext.xml 配置我们可以看到,CAS 默认配置了一个叫做 PersonDirectoryPrincipalResolver 的类,在 这个类的 resolve 方法中有调用 extractPrincipalId 这个方法,这个方法传入一个 Credentials 类型的参数,默认调用的是Credentials 的getId() 方法,CAS默认是返回用户的userName,即登录账号。不过getId() 这个方法的实现我们可以在上一章中指定的UsernamePasswordCredential 类中自定义,一般是定义成返回用户的userId或者其他唯一键,因为我们如果知道了用户的userId,那么就可以根据这个从数据库中查询中用户的一些具体信息了,进而就可以组成我们需要返回的信息。
2. 继续往下看源码,接着在 PersonDirectoryPrincipalResolver 中有注入一个 attributeRepository 属性,这个就是上面的IPersonAttributeDao 接口,然后在resolve 方法中调用了 IPersonAttributeDao 接口 的getPerson方法,还传入了一个参数principalId,其实这个传入的参数就是我们上面 getId() 返回的值。
所以其实我们只要实现我们需要的 IPersonAttributeDao 就可以了。 下面给一个简单的IPersonAttributeDao 例子:
public class BlogStubPersonAttributeDao extends StubPersonAttributeDao {
@Override
public IPersonAttributes getPerson(String uid) {
Map<String, List<Object>> attributes = new HashMap<String, List<Object>>();
attributes.put("userid", Collections.singletonList((Object)uid));
attributes.put("cnblogUsername", Collections.singletonList((Object)"http://www.cnblogs.com/vhua"));
attributes.put("cnblogPassword", Collections.singletonList((Object)"123456"));
attributes.put("test", Collections.singletonList((Object)"test"));
return new AttributeNamedPersonImpl(attributes);
}
}
这边传入的uid 默认是用户的登录名,我们这边没有做修改,直接用默认的。
这边是只是测试用,所以就直接写死了,实际开发肯定是需要在数据库或者LDAP中进行查询后,然后组装成需要的信息 。
然后在 deployerConfigContext.xml 中修改
<bean id="primaryPrincipalResolver"
class="org.jasig.cas.authentication.principal.PersonDirectoryPrincipalResolver" >
<property name="attributeRepository" ref="attributeRepository" />
</bean>
<!-- 修改前 -->
<bean id="attributeRepository" class="org.jasig.services.persondir.support.StubPersonAttributeDao"
p:backingMap-ref="attrRepoBackingMap" /> <util:map id="attrRepoBackingMap">
<entry key="uid" value="uid" />
<entry key="eduPersonAffiliation" value="eduPersonAffiliation" />
<entry key="groupMembership" value="groupMembership" />
</util:map>
<!-- 修改前 end-->
<!--修改后-->
<bean id="attributeRepository" class="org.jasig.services.persondir.support.BlogStubPersonAttributeDao" />
<!--修改后 end-->
3. 修改完成后,我们还需要在 casServiceValidationSuccess.jspcas-server-webapp\src\main\webapp\WEB-INF\view\jsp\protocol\2.0\casServiceValidationSuccess.jsp)
添加一段代码(下面红色部分):
<cas:serviceResponse xmlns:cas='http://www.yale.edu/tp/cas'>
<cas:authenticationSuccess>
<cas:user>${fn:escapeXml(assertion.primaryAuthentication.principal.id)}</cas:user>
<!-- 这段 -- >
<c:if test="${fn:length(assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.attributes) > 0}">
<cas:attributes>
<c:forEach var="attr" items="${assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.attributes}">
<cas:${fn:escapeXml(attr.key)}>${fn:escapeXml(attr.value)}</cas:${fn:escapeXml(attr.key)}>
</c:forEach>
</cas:attributes>
</c:if>
<!-- 这段 end-- > <c:if test="${not empty pgtIou}">
<cas:proxyGrantingTicket>${pgtIou}</cas:proxyGrantingTicket>
</c:if>
<c:if test="${fn:length(assertion.chainedAuthentications) > 1}">
<cas:proxies>
<c:forEach var="proxy" items="${assertion.chainedAuthentications}" varStatus="loopStatus" begin="0" end="${fn:length(assertion.chainedAuthentications)-2}" step="1">
<cas:proxy>${fn:escapeXml(proxy.principal.id)}</cas:proxy>
</c:forEach>
</cas:proxies>
</c:if>
</cas:authenticationSuccess>
</cas:serviceResponse>
4. 接下来 在客户端设置信息的接收,我们直接在index.jsp中测试一下:
在java中可以通过下面的方式获取
AttributePrincipal principal = (AttributePrincipal) request.getUserPrincipal();
Map attributes = principal.getAttributes();
String xxx=attributes .get("xxx");
...
<!DOCTYPE html">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>返回值测试</title>
</head>
<body> <%
request.setCharacterEncoding("UTF-8");
AttributePrincipal principal = (AttributePrincipal) request.getUserPrincipal();
Map attributes = principal.getAttributes();
String userid=(String)attributes.get("userid");
String cnblogUsername = (String)attributes.get("cnblogUsername");
String cnblogPassword = (String)attributes.get("cnblogPassword");
String test=(String)attributes.get("test"); %>
<div>飞奔的蜗牛博客:返回值演示</div>
<ul>
<li>userid:<%= userid%></li>
<li>username:<%= cnblogUsername%></li>
<li>password:<%= cnblogPassword%></li>
<li>test:<%= test%></li>
</ul>
</body>
</html>
效果
好了,我们登录运行看看结果。
aaarticlea/png;base64,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" alt="" />
大家看到没,已经获取成功了,在CAS SERVER那边设置的信息,我们正常获取到了 。大家可以根据业务的需要,返回相关的信息。然后在客户端进行操作。
总结
这一篇本来昨晚就写好了,准备发布,结果因为太困,保存了草稿,上午才发现,大家凑合的看。
谢谢
打完收工。。。
【SSO单点系列】(4):CAS4.0 SERVER登录后用户信息的返回的更多相关文章
- CAS学习笔记(三)—— SERVER登录后用户信息的返回
一旦CAS SERVER验证成功后,我们就会跳转到客户端中去.跳转到客户端去后,大家想一想,客户端总要获取用户信息吧,不然客户端是怎么知道登录的是哪个用户.那么客户端要怎么获取用户信息呢? 其实验证成 ...
- 【SSO单点系列】(7):CAS4.0 SERVER通过数据库方式认证用户
在前几篇中有简单介绍服务端的认证方式,默认的是直接在 deployerConfigContext.xml 文件中 一个叫做 primaryAuthenticationHandler 的bean中配置. ...
- 【SSO单点系列】(2):CAS4.0 登录页的个性化定制
上一篇 [SSO单点系列](1):CAS环境的搭建介绍了CAS最简单环境的搭建,以及一个例子用来讲解CAS的一个最基础的用法. 今天主要是介绍如何对CAS登录页进行个性化定制. 一.开始 下图是 ...
- CentOS下查看最后登录的用户信息以及LOG记录
CentOS下查看最后登录的用户信息tail /var/log/messagestail /var/log/secure 我们知道,在redhat下可以用lastlog查看各用户最后登录的信息,用la ...
- Android之QQ授权登录获取用户信息
有时候我们开发的app须要方便用户简单登录.能够让用户使用自己的qq.微信.微博登录到我们自己开发的app. 今天就在这里总结一下怎样在自己的app中集成QQ授权登录获取用户信息的功能. 首先我们打开 ...
- 微信小程序授权登录以及用户信息相关接口调整导致授权框不弹出
前言:4月8号升级了小程序业务后提交了版本并上线.突然一个同事说体验版的点击"登录"按钮无效.当时觉得应该不会呀,这几天一直用手机调试,每天也在不停的登录授权,弹框一直有的呀.然后 ...
- [重要更新]微信小程序登录、用户信息相关接口调整:使用 wx.getUserProfile 取代 wx.getUserInfo
2021年2月24日,微信官方团队发布了一个调整通知:<小程序登录.用户信息相关接口调整说明>,公告明确从4月13日起,所有发布的小程序将无法使用 wx.getUserInfo 接口(JS ...
- uni-app开发经验分享三: Vuex实现登录和用户信息留存
在做用户登录的过程中,其实最重要的是登录成功后的数据要怎么储存,储存到哪里,这里我分享一个利用vuex来实现用户登录和用户数据留存的方法 vuex代码如下: //引入vue和vuex import V ...
- 【SSO单点系列】(1):CAS4.0 环境的搭建
一.概述 今天开始写CAS相关的第一篇文章,这篇文章主要是关于CAS环境的搭配,提供给刚刚接触CAS的一个入门指南,并演示一个CAS的最简单的实例 二.环境要求 博主的环境如下: win8.1 64 ...
随机推荐
- 基于Halcon的一维条码识别技巧
Bar Code 条形码 1.clear_all_bar_code_models 清除所有条形码模型释放内存clear_all_bar_code_models( : : : )2.clear_b ...
- leetcode318
public class Solution { public int MaxProduct(string[] words) { ) { ; } int len = words.Length; int[ ...
- ubuntu安装vsftpd
使用以下命令安装vsftpd: apt-get install vsftpd 安装完成后,文件服务器已经开启了. 然后就可以连接,可以使用xftp等工具,在上传和下载的时候要注意权限,不然会失败.
- 将.sql文件导入powerdesigner的实现方法详解
将.sql文件导入powerdesigner的步骤是本文我们主要要介绍的内容,步骤如下: 第一步:将要导入的库的所有表的表结构(不要表数据,只要表结构)导出成一个.sql文件. 第二步:在powerd ...
- 中国大学MOOC 玩转AutoCAD 熟悉AutoCAD的人机交互方式
- nginx+django+uwsgi
最近来了兴致,想搞一下django开发,so, 搭建一下环境 1.安装django,可能通过pip install 或者源码安装(因为环境是python2.6.6的环境,所以这里采用django 1 ...
- ROS naviagtion analysis: costmap_2d--Costmap2D
博客转载自:https://blog.csdn.net/u013158492/article/details/50492506 Costmap2D是存储地图数据的父类.真正的地图数据就存储在数据成员u ...
- Part4_lesson1---Bootloader设计蓝图
1.bootloader的作用 2.u-boot是bootloader业界的老大 u-boot分为自主模式和开发模式 3.建立U-boot工程 uboot不能在window下面进行解压,因为在wind ...
- Laravel Gate 授权方式的使用指南
参考链接:An Introduction to Laravel Authorization Gates 本文使用 Laravel 的 Gate 授权方式 实现一个基于用户角色的博客发布系统. 在系统包 ...
- 浅析C语言中assert的用法(转)
原文地址:http://www.jb51.net/article/39685.htm 以下是对C语言中assert的使用方法进行了介绍,需要的朋友可以参考下. assert宏的原型定义在<ass ...