`

单点登录 - CAS【四】获取更全面的用户信息

 
阅读更多

       我们再使用CAS作为单点登录服务器时,在某些情况下希望从CAS Server端获取更多的用户信息,比如用户姓名、手机号、Email等,默认情况下Cas至返回用户的登录名


      
 基于以上的Cas版本,开始让Cas返回更多的用户信息。

 

一、配置属性attributeRepository

      

<bean id="selfAttributeRepository"
		class="org.jasig.services.persondir.support.jdbc.SingleRowJdbcPersonAttributeDao">
		<constructor-arg index="0" ref="dataSource" />
		<constructor-arg index="1"
			value="select email,name,login_name,password from isc_user where {0}" />
		
		<!-- 组装sql用的查询条件属性 -->	
		<property name="queryAttributeMapping">
			<map>
			    <!-- key必须是uername而且是小写否则会导致取不到用户的其它信息,value对应数据库用户名字段,系统会自己匹配 -->
				<entry key="username" value="login_name" />
			</map>
		</property>
		<property name="resultAttributeMapping">
			<map>
			    <!-- key为对应的数据库字段名称,value为提供给客户端获取的属性名字,系统会自动填充值 -->
				<entry key="login_name" value="username"></entry>
				<entry key="email" value="email"></entry>
				<entry key="name" value="name"></entry>
				<entry key="password" value="password"></entry>
			</map>
		</property>
	</bean> 

 

 

 

二、配置用户认证凭据转化的解析器

     在deployerConfigContext.xml中,找到credentialsToPrincipalResolvers,为UsernamePasswordCredentialsToPrincipalResolver注入attributeRepository

<bean class="org.jasig.cas.authentication.principal.UsernamePasswordCredentialsToPrincipalResolver" >
					<property name="attributeRepository" ref="attributeRepository" /> 
				</bean>

    替换成

 

  

<bean class="org.jasig.cas.authentication.principal.UsernamePasswordCredentialsToPrincipalResolver" >
					<property name="attributeRepository" ref="selfAttributeRepository" />
				</bean>

 

 

 

三、将添加的用户信息返回给客户端

    找到WEB-INF/view/jsp/protocol/2.0/casServiceValidationSuccess.jsp。此文件作用是在server验证成功后,这个页面负责生成与客户端交互的xml信息,在默认的casServiceValidationSuccess.jsp中,只

包括用户登录名,并不提供其他的属性信息,因此需要对页面进行扩展。

   

<cas:serviceResponse xmlns:cas='http://www.yale.edu/tp/cas'>
	<cas:authenticationSuccess>
		<cas:user>${fn:escapeXml(assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.id)}</cas:user>
<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>

 

 

   扩展为如下

  

<cas:serviceResponse xmlns:cas='http://www.yale.edu/tp/cas'>
	<cas:authenticationSuccess>
		<cas:user>${fn:escapeXml(assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.id)}</cas:user>
		<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>
		<!-- 在server验证成功后,这个页面负责生成与客户端交互的xml信息,在默认的casServiceValidationSuccess.jsp中,只包括用户名,并不提供其他的属性信息,因此需要对页面进行扩展 -->
		<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>
	</cas:authenticationSuccess>
</cas:serviceResponse>

 

通过完成上面三个步骤的配置后,server端的工作就完成了,那么如何在客户端获取这些信息呢?

下面进行说明:

 

 欢迎,<%=AssertionHolder.getAssertion().getPrincipal().getName() %><br/>
        <%  
                AttributePrincipal principal = (AttributePrincipal) request.getUserPrincipal();  
                String loginName = principal.getName();  
                out.println("loginName:" + loginName);  
                Map<String, Object> attributes = principal.getAttributes();  
                out.println("<br>");  
                if (attributes != null)  
                {  
                	out.println("username:" + attributes.get("username"));  
                    out.println("<br>"); 
                    out.println("password:" + attributes.get("password"));  
                    out.println("<br>");  
                    out.println("email:" + attributes.get("email"));  
                    out.println("<br>");  
                    out.println("name:" + attributes.get("name"));  
                    out.println("<br>");  
                }  
                out.println("------------------华丽的分割线---------------------");  
                out.println("<br>"); 
                
                AttributePrincipal principal2 =  AssertionHolder.getAssertion().getPrincipal();
                String loginName2 = principal2.getName();  
                out.println("loginName:" + loginName2);  
                Map<String, Object> attributes2 = principal2.getAttributes();  
                out.println("<br>");  
                if (attributes2 != null)  
                {  
                	out.println("username:" + attributes.get("username"));  
                    out.println("<br>");
                    out.println("password:" + attributes2.get("password"));  
                    out.println("<br>");  
                    out.println("email:" + attributes2.get("email"));  
                    out.println("<br>");  
                    out.println("name:" + attributes2.get("name"));  
                    out.println("<br>");  
                }
            %>

 

 

 

 说明:AsserionHolder工具怎么获取用户信息的?

         回想下,我们是不是在客户端的程序中WEB.xml文件配置过如下信息

 

<filter>
		<filter-name>CAS Assertion Thread Local Filter</filter-name>
		<filter-class>org.jasig.cas.client.javafilter.util.AssertionThreadLocalFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>CAS Assertion Thread Local Filter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

 

再让我们看下AssertionThreadLocalFilter.java又是如何工作的

public final class AssertionThreadLocalFilter implements Filter {

    public void init(final FilterConfig filterConfig) throws ServletException {
        // nothing to do here
    }

    public void doFilter(final ServletRequest servletRequest, final ServletResponse servletResponse, final FilterChain filterChain) throws IOException, ServletException {
        final HttpServletRequest request = (HttpServletRequest) servletRequest;
        final HttpSession session = request.getSession(false);
        final Assertion assertion = (Assertion) (session == null ? request.getAttribute(AbstractCasFilter.CONST_CAS_ASSERTION) : session.getAttribute(AbstractCasFilter.CONST_CAS_ASSERTION));

        try {
            AssertionHolder.setAssertion(assertion);
            filterChain.doFilter(servletRequest, servletResponse);
        } finally {
            AssertionHolder.clear();
        }
    }

    public void destroy() {
        // nothing to do
    }

 

我想大家应该看明白了吧

 

 

  • 大小: 2 KB
  • 大小: 9.4 KB
分享到:
评论

相关推荐

    单点登录-cas学习项目源码

    单点登录(Single Sign-On,简称SSO)是一种在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统的技术。CAS(Central Authentication Service)是耶鲁大学开发的一个开源项目,它提供了一种集中...

    基于Cas的单点登录实现

    1. **单点登录**:用户只需登录一次,即可访问所有支持CAS的系统。 2. **票证验证**:通过票证(Ticket)机制,确保用户身份的安全传输。 3. **多协议支持**:支持多种协议,如CAS、SAML、OAuth等。 4. **可扩展性**...

    CAS单点登录demo

    其流程主要包括:服务请求、重定向到CAS服务器、用户身份验证、返回Ticket、服务验证Ticket并获取用户信息。 2. CAS组件: - CAS Server:负责处理用户的登录请求,验证用户身份,并生成Ticket。 - CAS Client:...

    单点登录 - CAS【一】

    单点登录(Single Sign-On,简称SSO)是一种网络身份验证机制,允许用户在一个系统或应用中登录后,无需再次认证即可访问其他相互信任的系统。CAS(Central Authentication Service)是 Yale 大学开发的一个开源项目...

    集成cas实现单点登录认证.zip

    在IT行业中,单点登录(Single Sign-On, SSO)是一种常见的身份验证机制,它允许用户在一个系统上登录后,无需再次验证即可访问其他多个相互信任的系统。本压缩包"集成cas实现单点登录认证.zip"显然包含了关于如何...

    用cas实现mantis单点登录和登出

    ### 使用 CAS 实现 Mantis 单点登录与登出 #### 概述 单点登录(Single Sign-On,简称 SSO)是一种常见的身份认证模式,它允许用户在多个应用程序和服务中仅通过一次登录就能访问所有相关系统而无需多次输入密码。...

    单点登录cas源码

    单点登录(Single Sign-On, SSO)是一种网络认证机制,允许用户在一次登录后,就能访问多个相互信任的应用系统,而无需再次进行身份验证。CAS(Central Authentication Service)是单点登录的一种实现,它是一个开源...

    单点登录cas服务器demo及springboot客户端demo

    单点登录(Single Sign-On,简称SSO)是一种身份验证机制,允许用户在一次登录后访问多个相互关联的应用系统,而无需再次输入凭证。在这个场景中,"cas-server"是中央认证服务(Central Authentication Service),...

    CAS单点登录配置

    CAS(Central Authentication Service,中央认证服务)是一种广泛使用的开源单点登录(Single Sign-On, SSO)系统,它允许用户通过一个入口点登录,然后在多个应用之间无缝切换,而无需再次验证身份。CAS的目的是...

    sonar-cas-plugin sso认证插件

    CAS是一种开放源码的单点登录(Single Sign-On, SSO)框架,广泛用于企业级应用程序,以简化用户身份验证流程。通过集成Sonar-CAS插件,SonarQube用户能够利用CAS服务进行统一的身份验证,从而在多个应用之间实现...

    cas单点登录客户端--c++版

    CAS(Central Authentication Service)是中央认证服务的缩写,它是一种广泛使用的单点登录(Single Sign-On, SSO)框架,主要用于实现用户在一个系统登录后,可以无须再次验证即可访问其他相互信任的系统。...

    struts2+spring+cas单点登录

    使用struts2+spring+cas实现的单点登录功能,里面包括cas-server3.5.2项目一个,cas-client3.2.1 web项目两个,数据库脚本,请按照里面的说明文档进行部署,希望你们也能配置成功。

    基于springboot,cas5.3,shiro,pac4j,rest接口获取ticket不再跳转cas server登录页

    本文将深入探讨如何利用Spring Boot、CAS 5.3、Shiro、Pac4J这四个强大的工具来构建一个高效且用户友好的REST接口,以获取CAS(Central Authentication Service)票据,避免用户被重定向到CAS服务器的登录页面。...

    单点登录CAS与权限管理框架Shiro集成

    ### 单点登录CAS与权限管理框架Shiro集成 #### 一、概述 单点登录(Single Sign-On,简称SSO)是一种常见的身份验证技术,它允许用户通过一次登录即可访问多个应用程序和服务。这种机制提高了用户体验,同时也简化...

    sso.rar_DotNetCasClient.dll_sso_sso 单点登录_单点登录_鍗曠偣鐧诲綍

    单点登录(Single Sign-On,简称SSO)是一种网络身份验证技术,允许用户在一次登录后,无需再次输入凭证即可访问多个相互关联的应用系统。在IT领域,它极大地提升了用户体验和安全性,尤其对于大型企业或组织,管理...

    CAS单点登录配置大全

    **CAS单点登录配置大全** CAS(Central Authentication Service,中央认证服务)是一种广泛使用的开源单点登录(Single Sign-On,SSO)协议。它允许用户通过一个统一的认证系统访问多个应用系统,而无需在每个系统...

    用CAS实现框架的SSO单点登录

    ### 用CAS实现框架的SSO单点登录 #### SSO单点登录概念与原理 SSO(Single Sign-On)即单点登录技术,是一种让用户只需登录一次即可访问多个关联应用的技术。它不仅提升了用户体验,同时也加强了系统的安全性。...

Global site tag (gtag.js) - Google Analytics