sso_ssoj - CSDN
sso 订阅
单点登录(SingleSignOn,SSO),就是通过用户的一次性鉴别登录。当用户在身份认证服务器上登录一次以后,即可获得访问单点登录系统中其他关联系统和应用软件的权限,同时这种实现是不需要管理员对用户的登录状态或其他信息进行修改的,这意味着在多个应用系统中,用户只需一次登录就可以访问所有相互信任的应用系统。这种方式减少了由登录产生的时间消耗,辅助了用户管理,是目前比较流行的 [1] 展开全文
单点登录(SingleSignOn,SSO),就是通过用户的一次性鉴别登录。当用户在身份认证服务器上登录一次以后,即可获得访问单点登录系统中其他关联系统和应用软件的权限,同时这种实现是不需要管理员对用户的登录状态或其他信息进行修改的,这意味着在多个应用系统中,用户只需一次登录就可以访问所有相互信任的应用系统。这种方式减少了由登录产生的时间消耗,辅助了用户管理,是目前比较流行的 [1]
信息
外文名
Single Sign On
领    域
计算机科学
简    称
SSO
中文名
单点登录
解    释
应用系统
应    用
企业业务整合解决方案
SSO简介
在日常生活中,很多人由于忘记某些网站的登录密码而烦恼,因为大多数用户都要记忆不少于10个用户名和相应密码。为了便于记忆,很多人都在不同的站点使用相同的用户名和密码,虽然这样可以减少负担,但是同时也降低了安全性,而且使用不同的站点同样要进行多次登录。同时,随着信息化飞速发展,大型企业和政府部门等都开始使用电子系统进行办公,而且整个办公系统由多个不同的子系统构成,如办公自动化(OA)系统,财务管理系统,档案管理系统,信息查询系统等。如果每个系统都使用独立的登录和验证机制,那么每天工作人员都要登录不同的系统进行办公。用户登录的频繁操作,降低了员工的工作效率,造成工作成本的浪费。而大量的密码和用户名的记忆时间长了也会出现问题,忘记密码或者混淆密码都会造成很大的麻烦。基于以上原因,为用户提供一个畅通的登录通道变得十分重要。单点登录(SingleSign-On,SSO)是一种帮助用户快捷访问网络中多个站点的安全通信技术。单点登录系统基于一种安全的通信协议,该协议通过多个系统之间的用户身份信息的交换来实现单点登录。使用单点登录系统时,用户只需要登录一次,就可以访问多个系统,不需要记忆多个口令密码。单点登录使用户可以快速访问网络,从而提高工作效率,同时也能帮助提高系统的安全性。 [1] 
收起全文
  • 本套视频,详解讲解了两套SSO解决方案. 1、基于Cookie跨域特性,实现SSO方案 2、使用第三方框架CAS,实现SSO方案
  • 大厂竟然要考我SSO,卧槽。

    前言

    只有光头才能变强。

    文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y

    有几个网站就一直躺在我的收藏夹里边:

    收藏的一些网站

    于是我决定来整理一波

    一、什么是单点登录?

    单点登录的英文名叫做:Single Sign On(简称SSO)。

    初学/以前的时候,一般我们就单系统,所有的功能都在同一个系统上。

    所有的功能都在同一个系统上

    后来,我们为了合理利用资源和降低耦合性,于是把单系统拆分成多个子系统。

    拆分成多个子系统

    比如阿里系的淘宝和天猫,很明显地我们可以知道这是两个系统,但是你在使用的时候,登录了天猫,淘宝也会自动登录。

    登录了天猫,淘宝也登录了

    简单来说,单点登录就是在多个系统中,用户只需一次登录,各个系统即可感知该用户已经登录。

    二、回顾单系统登录

    在我初学JavaWeb的时候,登录和注册是我做得最多的一个功能了(初学Servlet的时候做过、学SpringMVC的时候做过、跟着做项目的时候做过…),反正我也数不清我做了多少次登录和注册的功能了…这里简单讲述一下我们初学时是怎么做登录功能的。

    众所周知,HTTP是无状态的协议,这意味着服务器无法确认用户的信息。于是乎,W3C就提出了:给每一个用户都发一个通行证,无论谁访问的时候都需要携带通行证,这样服务器就可以从通行证上确认用户的信息。通行证就是Cookie

    如果说Cookie是检查用户身上的”通行证“来确认用户的身份,那么Session就是通过检查服务器上的”客户明细表“来确认用户的身份的。Session相当于在服务器中建立了一份“客户明细表”

    HTTP协议是无状态的,Session不能依据HTTP连接来判断是否为同一个用户。于是乎:服务器向用户浏览器发送了一个名为JESSIONID的Cookie,它的值是Session的id值。其实Session是依据Cookie来识别是否是同一个用户

    所以,一般我们单系统实现登录会这样做:

    • 登录:将用户信息保存在Session对象中
      • 如果在Session对象中能查到,说明已经登录
      • 如果在Session对象中查不到,说明没登录(或者已经退出了登录)
    • 注销(退出登录):从Session中删除用户的信息
    • 记住我(关闭掉浏览器后,重新打开浏览器还能保持登录状态):配合Cookie来用

    我之前Demo的代码,可以参考一下:

     /**
     * 用户登陆
     */
    @PostMapping(value = "/user/session", produces = {"application/json;charset=UTF-8"})
    public Result login(String mobileNo, String password, String inputCaptcha, HttpSession session, HttpServletResponse response) {
    
        //判断验证码是否正确
        if (WebUtils.validateCaptcha(inputCaptcha, "captcha", session)) {
    
            //判断有没有该用户
            User user = userService.userLogin(mobileNo, password);
            if (user != null) {
                /*设置自动登陆,一个星期.  将token保存在数据库中*/
                String loginToken = WebUtils.md5(new Date().toString() + session.getId());
                user.setLoginToken(loginToken);
                User user1 = userService.userUpload(user);
    
                session.setAttribute("user", user1);
    
                CookieUtil.addCookie(response,"loginToken",loginToken,604800);
    
                return ResultUtil.success(user1);
    
            } else {
                return ResultUtil.error(ResultEnum.LOGIN_ERROR);
            }
        } else {
            return ResultUtil.error(ResultEnum.CAPTCHA_ERROR);
        }
    
    }
    
    /**
     * 用户退出
     */
    @DeleteMapping(value = "/session", produces = {"application/json;charset=UTF-8"})
    public Result logout(HttpSession session,HttpServletRequest request,HttpServletResponse response ) {
    
        //删除session和cookie
        session.removeAttribute("user");
    
        CookieUtil.clearCookie(request, response, "loginToken");
    
        return ResultUtil.success();
    }
    /**
    * @author ozc
    * @version 1.0
    * <p>
    * 拦截器;实现自动登陆功能
    */
    public class UserInterceptor implements HandlerInterceptor {
    
    
    @Autowired
    private UserService userService;
    
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {
        User sessionUser = (User) request.getSession().getAttribute("user");
    
        // 已经登陆了,放行
        if (sessionUser != null) {
            return true;
        } else {
            //得到带过来cookie是否存在
            String loginToken = CookieUtil.findCookieByName(request, "loginToken");
            if (StringUtils.isNotBlank(loginToken)) {
                //到数据库查询有没有该Cookie
                User user = userService.findUserByLoginToken(loginToken);
                if (user != null) {
                    request.getSession().setAttribute("user", user);
                    return true;
                } else {
                    //没有该Cookie与之对应的用户(Cookie不匹配)
                    CookieUtil.clearCookie(request, response, "loginToken");
                    return false;
                }
            } else {
    
                //没有cookie、也没有登陆。是index请求获取用户信息,可以放行
                if (request.getRequestURI().contains("session")) {
                    return true;
                }
    
                //没有cookie凭证
                response.sendRedirect("/login.html");
                return false;
            }
        }
    }
    }
    

    总结一下上面代码的思路:

    • 用户登录时,验证用户的账户和密码
    • 生成一个Token保存在数据库中,将Token写到Cookie中
    • 将用户数据保存在Session中
    • 请求时都会带上Cookie,检查有没有登录,如果已经登录则放行

    如果没看懂的同学,建议回顾Session和Cookie和HTTP:

    三、多系统登录的问题与解决

    3.1 Session不共享问题

    单系统登录功能主要是用Session保存用户信息来实现的,但我们清楚的是:多系统即可能有多个Tomcat,而Session是依赖当前系统的Tomcat,所以系统A的Session和系统B的Session是不共享的。

    系统A的Session和系统B的Session是不共享的

    解决系统之间Session不共享问题有一下几种方案:

    • Tomcat集群Session全局复制(集群内每个tomcat的session完全同步)【会影响集群的性能呢,不建议】
    • 根据请求的IP进行Hash映射到对应的机器上(这就相当于请求的IP一直会访问同一个服务器)【如果服务器宕机了,会丢失了一大部分Session的数据,不建议】
    • 把Session数据放在Redis中(使用Redis模拟Session)【建议
      • 如果还不了解Redis的同学,建议移步(Redis合集

    我们可以将登录功能单独抽取出来,做成一个子系统。

    抽取出来成为子系统

    SSO(登录系统)的逻辑如下:

    // 登录功能(SSO单独的服务)
    @Override
    public TaotaoResult login(String username, String password) throws Exception {
    	
    	//根据用户名查询用户信息
    	TbUserExample example = new TbUserExample();
    	Criteria criteria = example.createCriteria();
    	criteria.andUsernameEqualTo(username);
    	List<TbUser> list = userMapper.selectByExample(example);
    	if (null == list || list.isEmpty()) {
    		return TaotaoResult.build(400, "用户不存在");
    	}
    	//核对密码
    	TbUser user = list.get(0);
    	if (!DigestUtils.md5DigestAsHex(password.getBytes()).equals(user.getPassword())) {
    		return TaotaoResult.build(400, "密码错误");
    	}
    	//登录成功,把用户信息写入redis
    	//生成一个用户token
    	String token = UUID.randomUUID().toString();
    	jedisCluster.set(USER_TOKEN_KEY + ":" + token, JsonUtils.objectToJson(user));
    	//设置session过期时间
    	jedisCluster.expire(USER_TOKEN_KEY + ":" + token, SESSION_EXPIRE_TIME);
    	return TaotaoResult.ok(token);
    }
    
    

    其他子系统登录时,请求SSO(登录系统)进行登录,将返回的token写到Cookie中,下次访问时则把Cookie带上:

    public TaotaoResult login(String username, String password, 
    		HttpServletRequest request, HttpServletResponse response) {
    	//请求参数
    	Map<String, String> param = new HashMap<>();
    	param.put("username", username);
    	param.put("password", password);
    	//登录处理
    	String stringResult = HttpClientUtil.doPost(REGISTER_USER_URL + USER_LOGIN_URL, param);
    	TaotaoResult result = TaotaoResult.format(stringResult);
    	//登录出错
    	if (result.getStatus() != 200) {
    		return result;
    	}
    	//登录成功后把取token信息,并写入cookie
    	String token = (String) result.getData();
    	//写入cookie
    	CookieUtils.setCookie(request, response, "TT_TOKEN", token);
    	//返回成功
    	return result;
    	
    }
    

    总结:

    • SSO系统生成一个token,并将用户信息存到Redis中,并设置过期时间
    • 其他系统请求SSO系统进行登录,得到SSO返回的token,写到Cookie中
    • 每次请求时,Cookie都会带上,拦截器得到token,判断是否已经登录

    到这里,其实我们会发现其实就两个变化:

    • 将登陆功能抽取为一个系统(SSO),其他系统请求SSO进行登录
    • 本来将用户信息存到Session,现在将用户信息存到Redis

    3.2 Cookie跨域的问题

    上面我们解决了Session不能共享的问题,但其实还有另一个问题。Cookie是不能跨域的

    比如说,我们请求<https://www.google.com/>时,浏览器会自动把google.com的Cookie带过去给google的服务器,而不会把<https://www.baidu.com/>的Cookie带过去给google的服务器。

    这就意味着,由于域名不同,用户向系统A登录后,系统A返回给浏览器的Cookie,用户再请求系统B的时候不会将系统A的Cookie带过去。

    针对Cookie存在跨域问题,有几种解决方案:

    1. 服务端将Cookie写到客户端后,客户端对Cookie进行解析,将Token解析出来,此后请求都把这个Token带上就行了
    2. 多个域名共享Cookie,在写到客户端的时候设置Cookie的domain。
    3. 将Token保存在SessionStroage中(不依赖Cookie就没有跨域的问题了)

    到这里,我们已经可以实现单点登录了。

    3.3 CAS原理

    说到单点登录,就肯定会见到这个名词:CAS (Central Authentication Service),下面说说CAS是怎么搞的。

    如果已经将登录单独抽取成系统出来,我们还能这样玩。现在我们有两个系统,分别是www.java3y.comwww.java4y.com,一个SSOwww.sso.com

    现在我们有三个系统

    首先,用户想要访问系统Awww.java3y.com受限的资源(比如说购物车功能,购物车功能需要登录后才能访问),系统Awww.java3y.com发现用户并没有登录,于是重定向到sso认证中心,并将自己的地址作为参数。请求的地址如下:

    • www.sso.com?service=www.java3y.com

    sso认证中心发现用户未登录,将用户引导至登录页面,用户进行输入用户名和密码进行登录,用户与认证中心建立全局会话(生成一份Token,写到Cookie中,保存在浏览器上)

    4步过程

    随后,认证中心重定向回系统A,并把Token携带过去给系统A,重定向的地址如下:

    • www.java3y.com?token=xxxxxxx

    接着,系统A去sso认证中心验证这个Token是否正确,如果正确,则系统A和用户建立局部会话(创建Session)。到此,系统A和用户已经是登录状态了。

    第五步和第六步

    此时,用户想要访问系统Bwww.java4y.com受限的资源(比如说订单功能,订单功能需要登录后才能访问),系统Bwww.java4y.com发现用户并没有登录,于是重定向到sso认证中心,并将自己的地址作为参数。请求的地址如下:

    • www.sso.com?service=www.java4y.com

    注意,因为之前用户与认证中心www.sso.com已经建立了全局会话(当时已经把Cookie保存到浏览器上了),所以这次系统B重定向到认证中心www.sso.com是可以带上Cookie的。

    认证中心根据带过来的Cookie发现已经与用户建立了全局会话了,认证中心重定向回系统B,并把Token携带过去给系统B,重定向的地址如下:

    • www.java4y.com?token=xxxxxxx

    接着,系统B去sso认证中心验证这个Token是否正确,如果正确,则系统B和用户建立局部会话(创建Session)。到此,系统B和用户已经是登录状态了。

    系统B的流程图

    看到这里,其实SSO认证中心就类似一个中转站

    img

    涵盖Java后端所有知识点的开源项目(已有6 K star):https://github.com/ZhongFuCheng3y/3y

    如果大家想要实时关注我更新的文章以及分享的干货的话,微信搜索Java3y

    PDF文档的内容均为手打,有任何的不懂都可以直接来问我(公众号有我的联系方式)。

    展开全文
  • SSO单点登录

    2018-10-22 21:38:06
    本课程主要讲解单点登录在集群开发的作用,以及讲解了https协议的操作特点,同时利用openssl实现了证书签发与https单向、双向认证的实现。 同时本课程还讲解了CAS的使用,以及各种常用配置,同时讲解了如何将Shiro...
  • SSO(登录系统)

    2019-05-30 10:59:36
    // 登录功能(SSO单独的服务) @Override public TaotaoResult login(String username, String password) throws Exception { //根据用户名查询用户信息 TbUserExample example = new TbUserExample(); Criteria ...
    // 登录功能(SSO单独的服务)
    @Override
    public TaotaoResult login(String username, String password) throws Exception {
    
        //根据用户名查询用户信息
        TbUserExample example = new TbUserExample();
        Criteria criteria = example.createCriteria();
        criteria.andUsernameEqualTo(username);
        List<TbUser> list = userMapper.selectByExample(example);
        if (null == list || list.isEmpty()) {
            return TaotaoResult.build(400, "用户不存在");
        }
        //核对密码
        TbUser user = list.get(0);
        if (!DigestUtils.md5DigestAsHex(password.getBytes()).equals(user.getPassword())) {
            return TaotaoResult.build(400, "密码错误");
        }
        //登录成功,把用户信息写入redis
        //生成一个用户token
        String token = UUID.randomUUID().toString();
        jedisCluster.set(USER_TOKEN_KEY + ":" + token, JsonUtils.objectToJson(user));
        //设置session过期时间
        jedisCluster.expire(USER_TOKEN_KEY + ":" + token, SESSION_EXPIRE_TIME);
        return TaotaoResult.ok(token);
    }

    其他子系统登录时,请求SSO(登录系统)进行登录,将返回的token写到Cookie中,下次访问时则把Cookie带上:

    public TaotaoResult login(String username, String password, 
            HttpServletRequest request, HttpServletResponse response) {
        //请求参数
        Map<String, String> param = new HashMap<>();
        param.put("username", username);
        param.put("password", password);
        //登录处理
        String stringResult = HttpClientUtil.doPost(REGISTER_USER_URL + USER_LOGIN_URL, param);
        TaotaoResult result = TaotaoResult.format(stringResult);
        //登录出错
        if (result.getStatus() != 200) {
            return result;
        }
        //登录成功后把取token信息,并写入cookie
        String token = (String) result.getData();
        //写入cookie
        CookieUtils.setCookie(request, response, "TT_TOKEN", token);
        //返回成功
        return result;
    
    }

    总结:

    • SSO系统生成一个token,并将用户信息存到Redis中,并设置过期时间

    • 其他系统请求SSO系统进行登录,得到SSO返回的token,写到Cookie中

    • 每次请求时,Cookie都会带上,拦截器得到token,判断是否已经登录

    =======================================

    public ModelAndView login(String username, String password) {
         
            // 1.登录成功  假设A系统已经登录成功
    		
    		// 2.使用UUID生成一个唯一token
            String token = UUID.randomUUID().toString();
            // 3.把用户信息保存到redis。Key就是token,value就是user对象。
            jedis.set(token, user.toString());
    		// 4.设置key的过期时间。模拟Session的过期时间。一般半个小时。
            jedis.expire(token,1800);
            
    		 Cookie[] cookies = request.getCookies();
    		 HttpUtil httpUtil = new HttpUtil("http://sso.com/sso/authcookies", Method.GET);
             String result = httpUtil.send(cookie.getName(), cookie.getValue());
    
    		
    		return new ModelAndView("index");
    
        }
    

     

    展开全文
  • 一、简介 1、cas是有耶鲁大学研发的单点登录服务器 2、本教材所用环境 Tomcat7.2JDK6CAS Service 版本 cas-server-3.4.8-rele

     目录

        一、简介

        二、生成证书

        三、配置服务端

       四、配置客户端

       五、常见问题说明


        一、简介

                    1、cas是有耶鲁大学研发的单点登录服务器

                     2、本教材所用环境

     

    • Tomcat7.2
    • JDK6
    • CAS Service 版本    cas-server-3.4.8-release
    • CAS Client版本      cas-client-3.2.1-release                                

     

        二、生成证书

                                证书对于实现此单点登录非常之重要,证书是服务器端和客户端安全通信的凭证,本教程只是演示,所有用了

                        JDK自带的证书生成工具keytool。当然在实际项目中你可以到专门的证书认证中心购买证书。

                                中文官方网站:http://www.verisign.com/cn/

                       1、用JDK自带的keytool生成证书

                                

    命令:keytool -genkey -alias  smalllove -keyalg RSA -keystore D:/keys/smallkey

                       此命令是生成一个证书,其中 smalllove 是证书别名

     

         此命令的执行如图所示:

                        

                          其中名字与姓氏这一最好写你的 域名,如果在单击测试你可以在C:\Windows\System32\drivers\etc\hosts文件中映射一个虚拟域名,

                  注意不要写IP。

               2、导出证书

                    

    命令:C:\>keytool -export -file d:/keys/small.crt -alias smalllove -keystore d:/keys/smallkey

                    如图:

     

                          

                   密码为上步设置的密码。

               3、把证书导入到客户端JDK中。

                    

    命令:keytool -import -keystore C:\Java\jdk1.6.0_21\lib\security\cacerts -file D:/keys/small.crt -alias smalllove

               此命令是把证书导入到JDK中。

     

               如图:

                

              到此证书导入成功。

               注意:在此步有可能出现如下错误

         

               C:\>keytool -import -keystore C:\Java\jdk1.6.0_21\lib\security\cacerts -file D:/keys/small.crt -alias smalllove
                  输入keystore密码:
                keytool错误: java.io.IOException: Keystore was tampered with, or password was incorrect

                         次错误的解决方法是,把%JAVA_HOME%\lib\security下的cacerts文件删除掉,在执行。

     

                     

        三、配置服务端

                          1、 下载CAS的服务端,解压,把解压后的文件中modules文件夹中的cas-server-webapp-3.4.8.war文件拷贝的%TOMCAT_HOME%\webapps

                   下,并修改文件名为:cas.war。

                                 源码下载地址:https://github.com/Jasig/cas/releases

                          2、修改%TOMCAT_HOME%\conf\server.xml文件

                                   去掉此文件83到93行之间的注释,修改为:

                           

    <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
                   maxThreads="150" scheme="https" secure="true"
                   clientAuth="false" sslProtocol="TLS" 
    			   keystoreFile="D:/keys/smallkey"  <!--在2.1中生成的证书的位置-->
    			   keystorePass="smalllove"/>       <!--在2.1中设置的密码-->

                         3、以上配置完成访问http://yourhost:8443/cas出现一下页面

     

                                       

                              点击继续浏览会出现

                                             

                             输入用户名admin和密码admin登录则会出现

                                          

                             登录成功。

                             至此,说明服务端配置成功。

       四、配置客户端

                       1、添加客户端到你的项目中

                              ·手动下载下载cas-client,地址:http://downloads.jasig.org/cas-clients/,然后解压cas-client-3.1.12.zip,在modules文件夹中有需要的jar包,                         请根据自己的项目情况选择使用,把相应的jar包放到你项目WEB-INF/lib下。

                       ·使用maven

                                  

    <!-- cas -->
    <dependency>
    	<groupId>org.jasig.cas.client</groupId>
    	<artifactId>cas-client-core</artifactId>
    	<version>3.1.12</version>
    </dependency>

                    2、在客户端项目的web.xml配置过滤器

                            

    <!-- ======================== 单点登录开始 ======================== -->
    	<!-- 用于单点退出,该过滤器用于实现单点登出功能,可选配置 -->
    	<listener>
    		<listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
    	</listener>
    
    	<!-- 该过滤器用于实现单点登出功能,可选配置。 -->
    	<filter>
    		<filter-name>CAS Single Sign Out Filter</filter-name>
    		<filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
    	</filter>
    	<filter-mapping>
    		<filter-name>CAS Single Sign Out Filter</filter-name>
    		<url-pattern>/*</url-pattern>
    	</filter-mapping>
    
    	<!-- 该过滤器负责用户的认证工作,必须启用它 -->
    	<filter>
    		<filter-name>CASFilter</filter-name>
    		<filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
    		<init-param>
    			<param-name>casServerLoginUrl</param-name>
    			<param-value>https://www.travel.com:8443/cas/login</param-value>
    			<!--这里的server是服务端的IP -->
    		</init-param>
    		<init-param>
    			<param-name>serverName</param-name>
    			<param-value>http://www.travel.com:8080</param-value><span style="color:#FF0000;"> ①</span>
    		</init-param>
    	</filter>
    	<filter-mapping>
    		<filter-name>CASFilter</filter-name>
    		<url-pattern>/*</url-pattern>
    	</filter-mapping>
    
    	<!-- 该过滤器负责对Ticket的校验工作,必须启用它 -->
    	<filter>
    		<filter-name>CAS Validation Filter</filter-name>
    		<filter-class>
    			org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>
    		<init-param>
    			<param-name>casServerUrlPrefix</param-name>
    			<param-value>https://www.travel.com:8443/cas</param-value>
    		</init-param>
    		<init-param>
    			<param-name>serverName</param-name>
    			<param-value>http://www.travel.com:8080</param-value>  <span style="color:#FF0000;">②</span>
    		</init-param>
    	</filter>
    	<filter-mapping>
    		<filter-name>CAS Validation Filter</filter-name>
    		<url-pattern>/*</url-pattern>
    	</filter-mapping>
    
    	<!-- 该过滤器负责实现HttpServletRequest请求的包裹, 比如允许开发者通过HttpServletRequest的getRemoteUser()方法获得SSO登录用户的登录名,可选配置。 -->
    	<filter>
    		<filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
    		<filter-class>
    			org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
    	</filter>
    	<filter-mapping>
    		<filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
    		<url-pattern>/*</url-pattern>
    	</filter-mapping>
    
    	<!-- 该过滤器使得开发者可以通过org.jasig.cas.client.util.AssertionHolder来获取用户的登录名。 比如AssertionHolder.getAssertion().getPrincipal().getName()。 -->
    	<filter>
    		<filter-name>CAS Assertion Thread Local Filter</filter-name>
    		<filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
    	</filter>
    	<filter-mapping>
    		<filter-name>CAS Assertion Thread Local Filter</filter-name>
    		<url-pattern>/*</url-pattern>
    	</filter-mapping>
    
    	<!-- ======================== 单点登录结束 ======================== -->

                 

     

     

       五、常见问题说明

                      错误一、

                               

             若出现以上错原因是:你在客户端的web.xml中①,②的配置有误。

                 错误二、

                             

    javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: 
    PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: 
    unable to find valid certification path to requested target

                      若出现次错误是有与你客户端的证书有问题。重新导入你证书。

     

    展开全文
  • Web SSO

    2019-01-20 15:41:12
    干什么的: 用户访问第一次访问页面的时候已经登陆过了,当访问页面中的其他链接的时候,如何让这一次的访问知道用户已经登陆过了。

    干什么的:
    用户访问第一次访问页面的时候已经登陆过了,当访问页面中的其他链接的时候,如何让这一次的访问知道用户已经登陆过了。

    展开全文
  • 在程序开发中,特别是网站类开发,会接触到单点登录(SSO),什么是单点登录?,单点登录(SSO)有什么用?下面软币网小编来来介绍一下: 一、什么是单点登录? 单点登录的英文名叫做:Single Sign On(简称SSO)。 ...
  • java实现SSO 什么是SSO SSO(Single Sign On)单点登录是实现多个系统之间统一登录的验证系统,简单来说就是:有A,B,C三个系统,在A处登录过后,再访问B系统,B系统就已经处于了登录状态,C系统也是一样。举个...
  • 1. 摘要   ( 注意:请仔细看下摘要,留心此文是否是您的菜,若浪费宝贵时间,...如:开源的有OpenSSO、CAS ,微软的AD SSO,及基于kerberos 的SSO等等……以上列举的都是些比较成熟的产品或解决方案,安全方面...
  • 什么是SSO

    2019-06-18 11:17:12
    SSO(Single Sign On)单点登录。SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。它包括可以将这次主要的登录映射到其他应用中用于同一个用户的登录的机制。它是目前比较流行的企业...
  • 漫谈单点登录(SSO

    2019-08-05 22:26:11
    1. 摘要 ( 注意:请仔细看下...开源的有OpenSSO、CAS ,微软的AD SSO,及基于kerberos 的SSO等等……这些优秀的解决方案尽显开发及使用者的逼格,当然需求所致无谓好坏高低,满足实际之需才是王道! 本文并不讨...
  • sso 原理详解

    2017-06-20 23:18:22
    1. 摘要 ( 注意:请仔细看下摘要,留心此文是否...SSO这一概念由来已久,网络上对应不同场景的成熟SSO解决方案比比皆是,从简单到复杂,各式各样应有尽有!开源的有OpenSSO、CAS ,微软的AD SSO,及基于kerberos 的S
  • SSO 单点登录

    2018-09-09 22:12:01
    SSO英文全称Single Sign On 单点登录是一种控制多个相关但彼此独立的系统访问权限的机制, 拥有这一权限的用户 可以使用单一的ID和密码访问某个或多个系统从而避免使用不同的用户名或密码,或者通过某种配置无缝地...
  • 一、不落俗套的开始1、背景介绍单点登录:Single Sign On,简称SSOSSO使得在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。CAS框架:CAS(Central Authentication Service)是实现SSO单点...
  • 单点登录SSO(Single Sign On)说得简单点就是在一个多系统共存的环境下,用户在一处登录后,就不用在其他系统中登录,也就是用户的一次登录能得到其他所有系统的信任。单点登录在大型网站里使用得非常频繁,...
  • 啊。。。。。。it's quite a long time。好久没更新博客了,有一年之久了,一直在忙于公司的一些项目。2014年到2015年工作太忙,对于一些经常跟我博客的读者们深深说一声抱歉。...SSO即Single Sign
  • sso单点登录实现

    2018-12-13 18:22:22
    一、sso单点登录原理 单点登录全称Single Sign On(简称SSO),是指在多系统应用群中登录一个系统,便可在其他所有系统中得到授权而无需再次登录,包括单点登录与单点注销两部分 结合本项目案例,画了下SSO单点...
  • spring boot整合spring security 实现SSO单点登陆 完整DEMO. ...2、先后启动SsoServer、sso-resource、sso-client1、sso-client2 3、访问http://sso-taobao:8083/client1/ 或 http://sso-tmall:8084/client2/
  • 最近在研究SSO单点登录技术,其中有一种就是通过js的跨域设置cookie来达到单点登录目的的,下面就已京东商城为例来解释下跨域设置cookie的过程 涉及的关键知识点: 1、jquery ajax跨域重定向,要理ajax解跨域重定向...
  •   那篇文章主要说明完全跨域SSO单点登录的实现,但是我最终并没有使用那篇,当然,那篇完全可以实现SSO跨域,但是那篇有一些不太优雅的地方,我综合我的场景等各方面考虑,最终选择了我下面的这个方案。...
1 2 3 4 5 ... 20
收藏数 40,203
精华内容 16,081
关键字:

sso