CAS实战の获取多用户信息

  先列出版本号:

  服务端版本:cas server 4.0.0

  客户端版本:cas client 3.3.3

   cas server

   step1:先将primaryPrincipalResolver bean属性attributeRepository注释,因为cas 默认是通过配置xml来获取多用户信息的。

 <bean id="primaryPrincipalResolver"
          class="org.jasig.cas.authentication.principal.PersonDirectoryPrincipalResolver" >
        <!--<property name="attributeRepository" ref="attributeRepository" />-->
    </bean>

   step2:自定义获取多用户信息类,此类继承PrincipalResolver,重写resolve和supports,另附代码如下:

    @Autowired
    private J1DBService dbService;

    @Override
    public Principal resolve(Credential credential) {
        // TODO Auto-generated method stub
        final UsernamePasswordCredential usernamePasswordCredentials = (UsernamePasswordCredential) credential;
        String userStr = "";
        try {
            String username = usernamePasswordCredentials.getUsername();
            String password = usernamePasswordCredentials.getPassword();
            password = MD5.getMD5(password);
            User r = new User();
            r.setUserName(username);
            r.setPassword(password);
            Map<String,Object> m = dbService.getUser(r);
            if (null!=m) {
                r.setUserId(Integer.parseInt(m.get("userId").toString()));
                r.setUserRealName(m.get("userRealName")==null?null:m.get("userRealName").toString());
            }
            userStr = JSON.toJSONString(r);
            userStr = Base64.getBase64(userStr);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return new SimplePrincipal(userStr, null);
    }
    /**
     * @Description(功能描述)        : 确定一个凭证类型支持这个解析器
     * @author(作者)                : hhl
     * @date (开发日期)            : 2015年3月16日 下午15:17:25
     * @param credentials        : 确定一个凭证类型支持这个解析器
     * @return  boolean         : 返回true,支持这些凭证,否则假。
     */
    @Override
    public boolean supports(Credential credential) {
        // TODO Auto-generated method stub
        return credential != null && UsernamePasswordCredential.class.isAssignableFrom(credential.getClass());
    }

  由于返回给客户端用户信息中存在中文,所以进行了Base64加密。

  step3:将primaryPrincipalResolver bean映射的类路径变更为你自定义的类。

 <bean id="primaryPrincipalResolver"
          class="xx.xx.xx" >
        <!--<property name="attributeRepository" ref="attributeRepository" />-->
    </bean>

  cas client

  如在class中:

/**
     * 从中央授权服务器获取得到用户信息
     * @param request
     */
    @RequestMapping(value="/sysuser/saveUserIntoSession")
    @ResponseBody
    public String saveUserInfoIntoSession(HttpServletRequest request){
        Assertion assertion = (Assertion)request.getSession().getAttribute(AbstractCasFilter.CONST_CAS_ASSERTION);
        String json=null;
        if (null!=assertion) {
            AttributePrincipal principal = assertion.getPrincipal();
            String userStr=principal.getName();
            userStr = Base64.getFromBase64(userStr);
            User u  = JSON.parseObject(userStr, User.class);
            String tokenId = UUID.randomUUID().toString();
            request.getSession().setAttribute("password",u.getPassword());
            request.getSession().setAttribute("userName",u.getUserName());
            request.getSession().setAttribute("realName",u.getUserRealName());
            SysUser e = systemService.getUser(u.getUserName());
            //取得用户的角色id
            String roleId = getUserRoleById(e.getUserId());
            request.getSession().setAttribute("userId",e.getUserId());
            request.getSession().setAttribute("tokenId",tokenId);
            request.getSession().setAttribute("roleId",roleId);

            LoginBto b = new LoginBto();
            b.setPassword(u.getPassword());
            b.setRealName(u.getUserRealName());
            b.setRoleId(roleId);
            b.setTokenId(tokenId);
            b.setUserId(e.getUserId());
            b.setUserName(u.getUserName());
            json = JSON.toJSONString(b);
        }
        return json;
    }

  如在jsp中:

<%@ page import="org.jasig.cas.client.validation.Assertion" %>
<%@ page import="org.jasig.cas.client.authentication.AttributePrincipal" %>
<%@ page import="org.jasig.cas.client.util.AbstractCasFilter" %>
<%@ page import="com.founder.ec.sso.model.User" %>
<%@ page import="com.alibaba.fastjson.JSON" %>
<%@ page import="com.founder.ec.sso.util.Base64" %>
<%@ page import="java.util.UUID" %>
<span style="float: right; padding-right: 20px; margin-top: 10px;" class="head">
        <% Assertion assertion = (Assertion)request.getSession().getAttribute(AbstractCasFilter.CONST_CAS_ASSERTION);
             String userName = null;
            String realName = null;
            String flag = null;
            if(null!=assertion){
                AttributePrincipal principal = assertion.getPrincipal();
                 String userStr=principal.getName();
                 userStr = Base64.getFromBase64(userStr);
                 User u  = JSON.parseObject(userStr, User.class);
                 userName = u.getUserName();
                 realName = u.getUserRealName();
                 flag = "cas";
            }
            %>
            <% if(null!=flag){ %>
                    欢迎&nbsp;&nbsp;<%=realName %>(<%=userName %>)&nbsp;&nbsp;
            <% }%>
            <% if(null==flag){ %>
                    欢迎&nbsp;&nbsp;${sessionScope.realName}(${sessionScope.userName})&nbsp;&nbsp;
            <% }%>
            <a href="javascript:void(0)" id="editpass" style="color: #000"> 修改密码</a>&nbsp;
            <a href="http://192.168.2.11:8080/cas/logout?service=http://101.test.com/" style="color: #000">注销登录</a>&nbsp;
            <!-- <a href="javascript:void(0)" id="loginOut" style="color:#000 ">注销登录</a>&nbsp; -->
            <a href="javascript:void(0)" id="colNorth"><img border="0" style="margin-bottom: 0px" src="${ctx }/images/system/icon/detail-collapse.png" /></a>
            <a href="javascript:void(0)" id="newWindow"><img border="0" style="margin-bottom: 0px" src="${ctx }/images/common/fullscreen.gif" /></a>
        </span>

  

时间: 2025-01-07 09:33:58

CAS实战の获取多用户信息的相关文章

[Teamcenter 2007 开发实战] 获取错误或提示信息

前言 TC 的开发分为CF 端开发和Web 端开发. CF端和Web 端各自有自己的错误信息提示方式. 两种方式是否可以有一些整合? 整合的好处即统一了显示, 又减少了重复 CF 端错误信息 CF 端错误一般是给OMF 端来使用的. OMF是一个富客户端的程序. 错误方式就是弹出一个窗口. 代码开发方式如下: CheckDstat(uiShowText("errText001", NULL, UI_ATTENTION_TEXT, *mfail, WHERE)); *mfail = 11

iOS项目开发实战——获取网页源代码的二进制数据

我在上一篇博客<iOS项目开发实战--iOS网络编程获取网页Html源代码>中讲述了如何获取一个网页的HTML源代码,可以满足一定的需求.但是由于特殊原因,我们想获取的是一个网页的二进制数据,那么应该怎么办呢? 具体实现如下: (1)创建一个iOS项目,Language选择Swift,然后在ViewController.swift 中写入如下代码: override func viewDidLoad() { super.viewDidLoad() var data = NSData(conte

python基础项目实战:获取本机所有IP地址的方法

前言 今天为大家介绍一个利用python获取本机所有IP地址的具体代码,具有一定的参考价值,希望能够帮助到大家,代码如下: 导入第三方库 查看主机名 主机IP 大家在学python的时候肯定会遇到很多难题,以及对于新技术的追求,这里推荐一下我们的Python学习扣qun:784758214,这里是python学习者聚集地!!同时,自己是一名高级python开发工程师,从基础的python脚本到web开发.爬虫.django.数据挖掘等,零基础到项目实战的资料都有整理.送给每一位python的小伙

CAS实战の遇到的问题

1.客户端启动报错,报错信息如下: 严重: Exception starting filter CAS Single Sign Out Filter java.lang.IllegalArgumentException: casServerUrlPrefix cannot be null. at org.jasig.cas.client.util.CommonUtils.assertNotNull(CommonUtils.java:80) at org.jasig.cas.client.sess

CAS实战のclient自定义过滤器

我们在配置cas client肯定写过如下代码: <filter> <filter-name>CASFilter</filter-name> <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class> <filter-class>com.founder.ec.sso.filter.CASFilter</filter-c

CAS实战の自定义注销

步骤一 在cas server端,设置/WebContent/WEB-INF/cas-servlet.xml: <bean id="logoutAction" class="org.jasig.cas.web.flow.LogoutAction" p:servicesManager-ref="servicesManager" p:followServiceRedirects="${cas.logout.followServiceR

CAS 实现单点登录(SSO)返回更多用户信息(五)

配置转换器返回更多用户信息 从cas server登录成功后,默认只能从cas server得到用户名.但程序中也可能遇到需要得到更多如姓名,手机号,email等更多用户信息的情况. cas client拿到用户名后再到数据库中查询,的确可以得到关于该用户的更多信息. 但是如果用户登录成功后,直接从cas server返回给cas client用户的详细信息,这也是一个不错的做法.这个好处,尤其是在分布式中得以彰显,cas server可以把用户信息传递给各个应用系统,如果是上面那种做法,那么各

CAS—认证原理

CAS,Central Authentication Service-中央认证服务,是Yale 大学发起的一个企业级的.开源的项目,旨在为Web应用系统提供一种可靠的SSO解决方案.下面简单介绍SSO,重点介绍CAS认证过程. 一.    SSO简介 1.1   概念 SSO英文全称Single Sign On,是目前比较流行的服务于企业业务整合的解决方案之一, SSO 使得在多个应用系统中,用户只需要登录一次 就可以访问所有相互信任的应用系统. 1.2  角色 一般 SSO 体系主要角色有三种

单点登录实现----CAS(一)

最近我们部门交接了一个新项目--- passport,即我司的单点登录系统,虽然没有交接给我,但是个人觉得登录技术是个很好的知识,于是就忙里偷闲简单地学习了下. 单点登录SSO(single sign on)是一个当前流行的企业级多应用整合用户认证解决方案.从多个web应用中分离出登录.认证操作,进行同意管理,这样个web应用也不需要重复设计登录认证操作,专注各自的业务. 目前最应用最多的SSO实现方案是耶鲁(Yale)大学发起的一个开源项目----CAS(Central Authenticai