CAS客户端获取更多用户信息.docx

上传人:b****6 文档编号:7002423 上传时间:2023-01-16 格式:DOCX 页数:10 大小:252.05KB
下载 相关 举报
CAS客户端获取更多用户信息.docx_第1页
第1页 / 共10页
CAS客户端获取更多用户信息.docx_第2页
第2页 / 共10页
CAS客户端获取更多用户信息.docx_第3页
第3页 / 共10页
CAS客户端获取更多用户信息.docx_第4页
第4页 / 共10页
CAS客户端获取更多用户信息.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

CAS客户端获取更多用户信息.docx

《CAS客户端获取更多用户信息.docx》由会员分享,可在线阅读,更多相关《CAS客户端获取更多用户信息.docx(10页珍藏版)》请在冰豆网上搜索。

CAS客户端获取更多用户信息.docx

CAS客户端获取更多用户信息

 

CAS客户端获取更多用户信息

总述

首先,我是用的CASServer版本是3.5.2,Servlet容器是Tomcat

程序中也可能遇到客户端需要得到更多的用户信息,如姓名,手机号,email等更多用户信息的情况。

cas各种版本配置方式也不尽相同,这里讲的是3.5.2版本。

此文章中的CAS基础环境如下:

CAS服务端:

cas-server-3.5.2

CAS客户端:

cas-client-3.2.1

第一种方式

服务器端配置

 

一、首先需要配置属性attributeRepository

首先,你需要到WEB-INF目录找到 

deployerConfigContext.xml文件,同时配置attributeRepository如下:

 

        

        

        

            

                  

//这里的key需写username,value对应数据库用户名字段

            

        

        

            

//在这里key代表返回数据库对应的字段名

//value对应的是客户端获取值的时候的key值

//有的资料说返回的名称字段不能有下划线,这里特意测试了一下发现有下划线也是可以正常能拿到值的,所以如果客户端获取不到值不用担心这里的问题,可能是其它的地方导致的问题。

                

                

                

            

        

    

其中:

queryAttributeMapping是组装sql用的查询条件属性,上述配置后,结合封装成查询sql就是 select*fromlead_system_userwherelogin_name=#username#

resultAttributeMapping是sql执行完毕后返回的结构属性, key对应数据库字段,value对应客户端获取参数。

  

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

也是在deployerConfigContext.xml中,找到credentialsToPrincipalResolvers,为UsernamePasswordCredentialsToPrincipalResolver注入attributeRepository,那么attributeRepository就会被触发并通过此类进行解析,红色为新添部分。

                    

                

                    

                

                

            

 

三、修改属性registeredServices

修改 deployerConfigContext.xml中的 org.jasig.cas.services.InMemoryServiceRegistryDaoImpl的属性 registeredServices

修改 registeredServices  列表中的每个协议中的allowedAttributes属性的值。

列出的每个值,在客户端就可以访问了

      

        

          

            

            

            

            

|imaps?

):

//.*"/>

            

             //客户端需要使用的对象的属性名称

                

                    user_name

                    user_email

                    user_mobile

                 

            

          

此步骤灰常重要,可以看看 org.jasig.cas.services.RegexRegisteredService的源码,其中的 allowedAttributes是关键

【提示】网上说 ignoreAttributes属性控制,查看了CAS3.5.2版本的 AbstractRegisteredService 源码后,发现其默认值就是false,即:

添加属性后,客户端就可见了

四、修改WEB-INF/view/jsp/protocol/2.0/casServiceValidationSuccess.jsp

在server验证成功后,这个页面负责生成与客户端交互的xml信息,在默认的casServiceValidationSuccess.jsp中,只包括用户名,并不提供其他的属性信息,因此需要对页面进行扩展,如下,红色为新添加部分 

serviceResponsexmlns:

cas='http:

//www.yale.edu/tp/cas'>

 

authenticationSuccess>

user>${fn:

escapeXml(assertion.chainedAuthentications[fn:

length(assertion.chainedAuthentications)-1].principal.id)}

user>

  

iftest="${fn:

length(assertion.chainedAuthentications[fn:

length(assertion.chainedAuthentications)-1].principal.attributes)>0}">

           

attributes>

               

forEachvar="attr"items="${assertion.chainedAuthentications[fn:

length(assertion.chainedAuthentications)-1].principal.attributes}">

                   

${fn:

escapeXml(attr.key)}>${fn:

escapeXml(attr.value)}

${fn:

escapeXml(attr.key)}>

               

forEach>

           

attributes>

       

if>

iftest="${notemptypgtIou}">

  

proxyGrantingTicket>${pgtIou}

proxyGrantingTicket>

if>

iftest="${fn:

length(assertion.chainedAuthentications)>1}">

proxies>

forEachvar="proxy"items="${assertion.chainedAuthentications}"varStatus="loopStatus"begin="0"end="${fn:

length(assertion.chainedAuthentications)-2}"step="1">

   

proxy>${fn:

escapeXml(proxy.principal.id)}

proxy>

forEach>

proxies>

if>

 

authenticationSuccess>

serviceResponse>

 

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

下面进行说明

 

客户端获取用户信息

java客户端获取用户信息:

直接根据key值获取:

AssertionHolder.getAssertion().getPrincipal().getAttributes().get("user_name");

获取全部返回信息后通过map获取

AttributePrincipalprincipal=(AttributePrincipal)request.getUserPrincipal();

Mapattributes=principal.getAttributes();

Stringuser_username=attributes.get("user_name");

Stringuser_mobile=attributes.get("user_mobile");

Stringuser_email=attributes.get("user_email");

注意事项

如果都配置成功后遇到客户端访问报如下错误:

出现这种问题的原因是由于返回用户的信息中有中文值,由于cas中默认返回用户信息的时候的编码是ISO-8859-1,而我们的客户端可能是UTF-8或者是GBK的,在解析的时候由于乱码解析报错,所以要解决这种问题就必须要服务端和客户端统一编码,解决方式如下:

首先在CAS的服务端找到如果页面,其实就是上面我们加上代码的jsp文件

/sso-server/WebRoot/WEB-INF/view/jsp/protocol/2.0/casServiceValidationSuccess.jsp

找到这个文件修改这个文件的编码,我这里统一UTF-8的编码。

服务端修改完毕。

然后在CAS客户端修改,找到Cas20ProxyReceivingTicketValidationFilter过滤器源码,路径为:

/org/jasig/cas/client/validation/Cas20ProxyReceivingTicketValidationFilter.java文件

找到getTicketValidator方法

在这个方法中进行设置编码

默认为null,现在我们统一设置为utf-8的编码,如下

在进行重启服务进行访问就可以获取更多的用户信息了包括中文值的也可以获取得到了。

到这里整个配置完成。

 

第二种方式:

编写实现类

通过实现CredentialsToPrincipalResolver类来实现客户端获取更多用户信息

自己写一个java类/sso-server/src/org/jasig/cas/authentication/principal/MyCredentialsToPrincipalResolver.java实现方式如下代码:

@Override

publicPrincipalresolvePrincipal(Credentialscredentials){

//TODOAuto-generatedmethodstub

finalUsernamePasswordCredentialsusernamePasswordCredentials=(UsernamePasswordCredentials)credentials;

Stringusername=usernamePasswordCredentials.getUsername();

Connectionconn=null;

PreparedStatementstmt=null;

ResultSetrs=null;

StringloginStr="";

try{

conn=InitCacheConfig.getConnection();

stmt=conn.prepareStatement("SELECT*FROMLEAD_SYSTEM_USERWHERELOGIN_NAME=?

");

stmt.setString(1,username);

rs=stmt.executeQuery();

if(rs!

=null){

if(rs.next()){

Loginlogin=newLogin();

login.setResourceId(rs.getString("RESOURCEID"));

login.setLoginName(rs.getString("LOGIN_NAME"));

login.setUserName(rs.getString("USER_NAME"));

login.setUserEmail(rs.getString("USER_EMAIL"));

//如果需要返回更多字段在这里添加

loginStr=JSON.toJSONString(login);

}

}

}catch(ClassNotFoundExceptione){

e.printStackTrace();

}catch(SQLExceptione){

e.printStackTrace();

}finally{

InitCacheConfig.closeAllConn(rs,stmt,conn);

}

returnnewSimplePrincipal(loginStr,null);

}

@Override

publicbooleansupports(Credentialscredentials){

returncredentials!

=null&&UsernamePasswordCredentials.class.isAssignableFrom(credentials.getClass());

}

当前类主要是直接通过jdbc方式通过username像数据库查询所有数据信息通过json方式返回出来。

配置

再到deployerConfigContext.xml中做如下配置:

找到

注释如下配置

添加如下配置

最后变成

客户端获取

StringuserJson=AssertionHolder.getAssertion().getPrincipal().getName();

返回的是一串json字符串,里面存有所有的用户信息,整个配置完毕。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1