精华内容
下载资源
问答
  • 前面的博客中,我们说道了Shiro的两个最大的特点,认证和授权,而单点登录也是属于认证的一部分,默认情况下,Shiro已经为我们实现了和Cas的集成,我们加入集成的一些配置就ok了。 1、加入shiro-cas包 org.apache....

    Shiro是什么

    Shiro是一个Java平台的开源权限框架,用于认证和访问授权。具体来说,满足对如下元素的支持:

    用户,角色,权限(仅仅是操作权限,数据权限必须与业务需求紧密结合),资源(url)。

    用户分配角色,角色定义权限。

    访问授权时支持角色或者权限,并且支持多级的权限定义。

    Q:对组的支持?

    A:shiro默认不支持对组设置权限。

    Q:是否可以满足对组进行角色分配的需求?

    A:扩展Realm,可以支持对组进行分配角色,其实就是给该组下的所有用户分配权限。

    Q:对数据权限的支持? 在业务系统中定义?

    A:shiro仅仅实现对操作权限的控制,用于在前端控制元素隐藏或者显示,以及对资源访问权限进行检查。数据权限与具体的业务需求紧密关联,shiro本身无法实现对数据权限的控制。

    Q:动态权限分配?

    A:扩展org.apache.shiro.realm.Realm,支持动态权限分配。

    Q:与Spring集成?

    A:可以支持与Spring集成,shiro还支持jsp标签。

    前面的博客中,我们说道了Shiro的两个最大的特点,认证和授权,而单点登录也是属于认证的一部分,默认情况下,Shiro已经为我们实现了和Cas的集成,我们加入集成的一些配置就ok了。

    1、加入shiro-cas包

    org.apache.shiro

    shiro-cas

    1.2.4

    2、加入单点登录的配置

    这里,我将所有的配置都贴出来,方便参考,配置里面已经加了详尽的说明。

    package com.chhliu.springboot.shiro.config;

    import java.util.LinkedHashMap;

    import java.util.Map;

    import javax.servlet.Filter;

    import org.apache.shiro.cache.ehcache.EhCacheManager;

    import org.apache.shiro.cas.CasFilter;

    import org.apache.shiro.cas.CasSubjectFactory;

    import org.apache.shiro.spring.LifecycleBeanPostProcessor;

    import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;

    import org.apache.shiro.spring.web.ShiroFilterFactoryBean;

    import org.apache.shiro.web.mgt.DefaultWebSecurityManager;

    import org.jasig.cas.client.session.SingleSignOutFilter;

    import org.jasig.cas.client.session.SingleSignOutHttpSessionListener;

    import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;

    import org.springframework.boot.web.servlet.FilterRegistrationBean;

    import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;

    import org.springframework.context.annotation.Bean;

    import org.springframework.context.annotation.Configuration;

    import org.springframework.context.annotation.DependsOn;

    import org.springframework.core.Ordered;

    import org.springframework.core.annotation.Order;

    import org.springframework.web.filter.DelegatingFilterProxy;

    /**

    * Shiro 配置

    *

    * Apache Shiro 核心通过 Filter 来实现,就好像SpringMvc 通过DispachServlet 来主控制一样。 既然是使用

    * Filter 一般也就能猜到,是通过URL规则来进行过滤和权限校验,所以我们需要定义一系列关于URL的规则和访问权限。

    *

    * @author chhliu

    */

    @Configuration

    public class ShiroConfiguration {

    // cas server地址

    public static final String casServerUrlPrefix = "http://127.0.0.1";

    // Cas登录页面地址

    public static final String casLoginUrl = casServerUrlPrefix + "/login";

    // Cas登出页面地址

    public static final String casLogoutUrl = casServerUrlPrefix + "/logout";

    // 当前工程对外提供的服务地址

    public static final String shiroServerUrlPrefix = "http://127.0.1.28:8080";

    // casFilter UrlPattern

    public static final String casFilterUrlPattern = "/index";

    // 登录地址

    public static final String loginUrl = casLoginUrl + "?service=" + shiroServerUrlPrefix + casFilterUrlPattern;

    // 登出地址(casserver启用service跳转功能,需在webapps\cas\WEB-INF\cas.properties文件中启用cas.logout.followServiceRedirects=true)

    public static final String logoutUrl = casLogoutUrl+"?service="+loginUrl;

    // 登录成功地址

    // public static final String loginSuccessUrl = "/index";

    // 权限认证失败跳转地址

    public static final String unauthorizedUrl = "/error/403.html";

    /**

    * 实例化SecurityManager,该类是shiro的核心类

    * @return

    */

    @Bean

    public DefaultWebSecurityManager securityManager() {

    DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();

    securityManager.setRealm(myShiroCasRealm());

    //

    securityManager.setCacheManager(getEhCacheManager());

    // 指定 SubjectFactory,如果要实现cas的remember me的功能,需要用到下面这个CasSubjectFactory,并设置到securityManager的subjectFactory中

    securityManager.setSubjectFactory(new CasSubjectFactory());

    return securityManager;

    }

    /**

    * 配置缓存

    * @return

    */

    @Bean

    public EhCacheManager getEhCacheManager() {

    EhCacheManager em = new EhCacheManager();

    em.setCacheManagerConfigFile("classpath:config/ehcache-shiro.xml");

    return em;

    }

    /**

    * 配置Realm,由于我们使用的是CasRealm,所以已经集成了单点登录的功能

    * @param cacheManager

    * @return

    */

    @Bean

    public MyShiroRealm myShiroCasRealm() {

    MyShiroRealm realm = new MyShiroRealm();

    // cas登录服务器地址前缀

    realm.setCasServerUrlPrefix(ShiroConfiguration.casServerUrlPrefix);

    // 客户端回调地址,登录成功后的跳转地址(自己的服务地址)

    realm.setCasService(ShiroConfiguration.shiroServerUrlPrefix + ShiroConfiguration.casFilterUrlPattern);

    // 登录成功后的默认角色,此处默认为user角色

    realm.setDefaultRoles("user");

    return realm;

    }

    /**

    * 注册单点登出的listener

    * @return

    */

    @SuppressWarnings({ "rawtypes", "unchecked" })

    @Bean

    @Order(Ordered.HIGHEST_PRECEDENCE)// 优先级需要高于Cas的Filter

    public ServletListenerRegistrationBean> singleSignOutHttpSessionListener(){

    ServletListenerRegistrationBean bean = new ServletListenerRegistrationBean();

    bean.setListener(new SingleSignOutHttpSessionListener());

    bean.setEnabled(true);

    return bean;

    }

    /**

    * 注册单点登出filter

    * @return

    */

    @Bean

    public FilterRegistrationBean singleSignOutFilter(){

    FilterRegistrationBean bean = new FilterRegistrationBean();

    bean.setName("singleSignOutFilter");

    bean.setFilter(new SingleSignOutFilter());

    bean.addUrlPatterns("/*");

    bean.setEnabled(true);

    return bean;

    }

    /**

    * 注册DelegatingFilterProxy(Shiro)

    */

    @Bean

    public FilterRegistrationBean delegatingFilterProxy() {

    FilterRegistrationBean filterRegistration = new FilterRegistrationBean();

    filterRegistration.setFilter(new DelegatingFilterProxy("shiroFilter"));

    // 该值缺省为false,表示生命周期由SpringApplicationContext管理,设置为true则表示由ServletContainer管理

    filterRegistration.addInitParameter("targetFilterLifecycle", "true");

    filterRegistration.setEnabled(true);

    filterRegistration.addUrlPatterns("/*");

    return filterRegistration;

    }

    /**

    * 该类可以保证实现了org.apache.shiro.util.Initializable接口的shiro对象的init或者是destory方法被自动调用,

    * 而不用手动指定init-method或者是destory-method方法

    * 注意:如果使用了该类,则不需要手动指定初始化方法和销毁方法,否则会出错

    * @return

    */

    @Bean(name = "lifecycleBeanPostProcessor")

    public LifecycleBeanPostProcessor getLifecycleBeanPostProcessor() {

    return new LifecycleBeanPostProcessor();

    }

    /**

    * 下面两个配置主要用来开启shiro aop注解支持. 使用代理方式;所以需要开启代码支持;

    * @return

    */

    @Bean

    @DependsOn("lifecycleBeanPostProcessor")

    public DefaultAdvisorAutoProxyCreator getDefaultAdvisorAutoProxyCreator() {

    DefaultAdvisorAutoProxyCreator daap = new DefaultAdvisorAutoProxyCreator();

    daap.setProxyTargetClass(true);

    return daap;

    }

    /**

    * @param securityManager

    * @return

    */

    @Bean

    public AuthorizationAttributeSourceAdvisor getAuthorizationAttributeSourceAdvisor(DefaultWebSecurityManager securityManager) {

    AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();

    authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);

    return authorizationAttributeSourceAdvisor;

    }

    /**

    * CAS过滤器

    * @return

    */

    @Bean(name = "casFilter")

    public CasFilter getCasFilter() {

    CasFilter casFilter = new CasFilter();

    casFilter.setName("casFilter");

    casFilter.setEnabled(true);

    // 登录失败后跳转的URL,也就是 Shiro 执行 CasRealm 的 doGetAuthenticationInfo 方法向CasServer验证tiket

    casFilter.setFailureUrl(loginUrl);// 我们选择认证失败后再打开登录页面

    casFilter.setLoginUrl(loginUrl);

    return casFilter;

    }

    /**

    * 使用工厂模式,创建并初始化ShiroFilter

    * @param securityManager

    * @param casFilter

    * @return

    */

    @Bean(name = "shiroFilter")

    public ShiroFilterFactoryBean getShiroFilterFactoryBean(DefaultWebSecurityManager securityManager, CasFilter casFilter) {

    ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();

    // 必须设置 SecurityManager

    shiroFilterFactoryBean.setSecurityManager(securityManager);

    // 如果不设置默认会自动寻找Web工程根目录下的"/login.jsp"页面

    shiroFilterFactoryBean.setLoginUrl(loginUrl);

    /*

    * 登录成功后要跳转的连接,不设置的时候,会默认跳转到前一步的url

    * 比如先在浏览器中输入了http://localhost:8080/userlist,但是现在用户却没有登录,于是会跳转到登录页面,等登录认证通过后,

    * 页面会再次自动跳转到http://localhost:8080/userlist页面而不是登录成功后的index页面

    * 建议不要设置这个字段

    */

    // shiroFilterFactoryBean.setSuccessUrl(loginSuccessUrl);

    // 设置无权限访问页面

    shiroFilterFactoryBean.setUnauthorizedUrl(unauthorizedUrl);

    /*

    * 添加casFilter到shiroFilter中,注意,casFilter需要放到shiroFilter的前面,

    * 从而保证程序在进入shiro的login登录之前就会进入单点认证

    */

    Map filters = new LinkedHashMap<>();

    filters.put("casFilter", casFilter);

    // logout已经被单点登录的logout取代

    // filters.put("logout",logoutFilter());

    shiroFilterFactoryBean.setFilters(filters);

    loadShiroFilterChain(shiroFilterFactoryBean);

    return shiroFilterFactoryBean;

    }

    /**

    * 加载shiroFilter权限控制规则(从数据库读取然后配置),角色/权限信息由MyShiroCasRealm对象提供doGetAuthorizationInfo实现获取来的

    * 生产中会将这部分规则放到数据库中

    * @param shiroFilterFactoryBean

    */

    private void loadShiroFilterChain(ShiroFilterFactoryBean shiroFilterFactoryBean){

    /// 下面这些规则配置最好配置到配置文件中,注意,此处加入的filter需要保证有序,所以用的LinkedHashMap ///

    Map filterChainDefinitionMap = new LinkedHashMap();

    filterChainDefinitionMap.put(casFilterUrlPattern, "casFilter");

    //2.不拦截的请求

    filterChainDefinitionMap.put("/css/**","anon");

    filterChainDefinitionMap.put("/js/**","anon");

    filterChainDefinitionMap.put("/login", "anon");

    // 此处将logout页面设置为anon,而不是logout,因为logout被单点处理,而不需要再被shiro的logoutFilter进行拦截

    filterChainDefinitionMap.put("/logout","anon");

    filterChainDefinitionMap.put("/error","anon");

    //3.拦截的请求(从本地数据库获取或者从casserver获取(webservice,http等远程方式),看你的角色权限配置在哪里)

    filterChainDefinitionMap.put("/user", "authc"); //需要登录

    //4.登录过的不拦截

    filterChainDefinitionMap.put("/**", "authc");

    shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);

    }

    }

    3、编写Realm

    由于需要集成单点登录的功能,所以需要集成CasRealm类,该类已经为我们实现了单点认证的功能,我们要做的就是实现授权部分的功能,示例代码如下:

    package com.chhliu.springboot.shiro.config;

    import javax.annotation.Resource;

    import org.apache.shiro.SecurityUtils;

    import org.apache.shiro.authc.AuthenticationInfo;

    import org.apache.shiro.authc.AuthenticationToken;

    import org.apache.shiro.authz.AuthorizationInfo;

    import org.apache.shiro.authz.SimpleAuthorizationInfo;

    import org.apache.shiro.cas.CasRealm;

    import org.apache.shiro.subject.PrincipalCollection;

    import com.chhliu.springboot.shiro.mode.SysPermission;

    import com.chhliu.springboot.shiro.mode.SysRole;

    import com.chhliu.springboot.shiro.mode.UserInfo;

    import com.chhliu.springboot.shiro.service.UserInfoService;

    /**

    * 权限校验核心类; 由于使用了单点登录,所以无需再进行身份认证 只需要授权即可

    *

    * @author chhliu

    */

    public class MyShiroRealm extends CasRealm {

    @Resource

    private UserInfoService userInfoService;

    /**

    * 1、CAS认证 ,验证用户身份

    * 2、将用户基本信息设置到会话中,方便获取

    * 3、该方法可以直接使用CasRealm中的认证方法,此处仅用作测试

    */

    @Override

    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) {

    // 调用父类中的认证方法,CasRealm已经为我们实现了单点认证。

    AuthenticationInfo authc = super.doGetAuthenticationInfo(token);

    // 获取登录的账号,cas认证成功后,会将账号存起来

    String account = (String) authc.getPrincipals().getPrimaryPrincipal();

    // 将用户信息存入session中,方便程序获取,此处可以将根据登录账号查询出的用户信息放到session中

    SecurityUtils.getSubject().getSession().setAttribute("no", account);

    return authc;

    }

    /**

    * 此方法调用 hasRole,hasPermission的时候才会进行回调.

    *

    * 权限信息.(授权): 1、如果用户正常退出,缓存自动清空; 2、如果用户非正常退出,缓存自动清空;

    * 3、如果我们修改了用户的权限,而用户不退出系统,修改的权限无法立即生效。 (需要手动编程进行实现;放在service进行调用)

    * 在权限修改后调用realm中的方法,realm已经由spring管理,所以从spring中获取realm实例, 调用clearCached方法;

    * :Authorization 是授权访问控制,用于对用户进行的操作授权,证明该用户是否允许进行当前操作,如访问某个链接,某个资源文件等。

    *

    * @param principals

    * @return

    */

    @Override

    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {

    System.out.println("权限配置-->MyShiroRealm.doGetAuthorizationInfo()");

    SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();

    // 获取单点登陆后的用户名,也可以从session中获取,因为在认证成功后,已经将用户名放到session中去了

    String userName = (String) super.getAvailablePrincipal(principals);

    // principals.getPrimaryPrincipal(); 这种方式也可以获取用户名

    // 根据用户名获取该用户的角色和权限信息

    UserInfo userInfo = userInfoService.findByUsername(userName);

    // 将用户对应的角色和权限信息打包放到AuthorizationInfo中

    for (SysRole role : userInfo.getRoleList()) {

    authorizationInfo.addRole(role.getRole());

    for (SysPermission p : role.getPermissions()) {

    authorizationInfo.addStringPermission(p.getPermission());

    }

    }

    return authorizationInfo;

    }

    }

    下面,我们就可以进行验证测试了!

    在浏览器输入http:127.0.1.28:8080/userInfo/userList 我们会发现,会自动跳转到单点的登录页面

    然后我们输入用户名和密码,就会自动跳转到http:127.0.1.28:8080/userInfo/userList页面了。

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    展开全文
  • 本文主要介绍在使用SpringBoot的开发过程中如何整合CAS Client实现单点登录的功能。 准备工作 (1)搭建好CAS服务端(参考:https://blog.csdn.net/u014553029/article/details/88102311) (2)准备好一个普通的...

    本文主要介绍在使用SpringBoot的开发过程中如何整合CAS Client实现单点登录的功能。

    准备工作

    (1)搭建好CAS服务端(参考:https://blog.csdn.net/u014553029/article/details/88102311
    (2)准备好一个普通的SpringBoot Web项目

    集成

    一、引入CAS client依赖

    在pom.xml中引入CAS Client的依赖包。代码如下:

    <dependency>
        <groupId>net.unicon.cas</groupId>
        <artifactId>cas-client-autoconfig-support</artifactId>
        <version>2.1.0-GA</version>
    </dependency>
    

    二、配置

    在application.properties或者application.yml中添加相关配置,主要配置内容包括服务器的相关地址,客户端的相关地址等。我这里是application.yml,配置内容如下:

    cas:
      #后端服务地址
      client-host-url: http://127.0.0.1:8888
      #cas认证中心地址
      server-url-prefix: http://146.56.192.87:8080/cas
      #cas认证中心登录地址
      server-login-url: http://146.56.192.87:8080/cas/login
      validation-type: cas3
    

    三、在启动类中添加启用注解

    //启用CAS
    @EnableCasClient
    @SpringBootApplication
    public class SpringBootSsoApplication {
        //省略部分内容
    }
    

    四、编写测试方法

    @Controller
    public class TestController {
    
        @Value(value = "${cas.server-url-prefix}")
        private String serverUrlPrefix = "";
    
        @Value(value = "${cas.client-host-url}")
        private String clientHostUrl = "";
    
        @GetMapping("user")
        @ResponseBody
        public String user(HttpServletRequest request) {
            Assertion assertion = (Assertion) request.getSession().getAttribute(AbstractCasFilter.CONST_CAS_ASSERTION);
            String loginName = null;
            if (assertion != null) {
                AttributePrincipal principal = assertion.getPrincipal();
                loginName = principal.getName();
                System.out.println("访问者:" + loginName);
            }
            return "访问者:" + loginName;
        }
    
        @RequestMapping("/logout")
        public String logout(HttpSession session) {
            session.invalidate();
            return "redirect:" + serverUrlPrefix + "/logout?service=" + clientHostUrl + "/sso-client/user";
        }
    }
    

    五、测试登录与退出

    5.1 登录

    (1)打开浏览器访问:http://127.0.0.1:8888/sso-client/user
    (2)由于没有登录,重定向到:http://146.56.192.87:8080/cas/login?service=http://127.0.0.1:8888/sso-client/user
    (3)输入用户名密码,点击登录,成功之后跳转到http://127.0.0.1:8888/sso-client/user

    在这里插入图片描述

    5.2 退出

    (4)访问:http://127.0.0.1:8888/sso-client/logout
    (5)cas完成退出,并跳转到http://127.0.0.1:8888/sso-client/user,由于该地址需要登录,仍会重定向到登录界面
    在这里插入图片描述

    5.3 验证单点

    (6)在启动一个客户端,端口为8889,项目名称为sso-client1
    在这里插入图片描述

    在这里插入图片描述
    (7)访问:http://127.0.0.1:8889/sso-client1/user,直接获取到用户信息,不需要登录。单点认证验证完成。
    在这里插入图片描述

    注意

    (1)未认证授权的服务,不允许使用CAS来认证您访问的目标应用。
    修改WEB-INF\classes\services\HTTPSandIMAPS-10000001.json

    "serviceId" : "^(https|imaps)://.*"  
    改为 
    "serviceId" : "^(https|imaps|http)://.*"
    

    (2)WEB-INF\classes\application.properties

    # Service Registry(服务注册)
    # 开启识别Json文件,默认false
    cas.serviceRegistry.initFromJson=true
    # 保存tgc
    cas.tgc.secure=false
    # 默认情况下退出登录时,页面将会跳转到CAS服务器内部的注销页面 casLogoutView.jsp ,
    # 如果我们需要在退出登录后,跳转到指定页面,需要将下列参数设为true,在退出登录的url里需要添加service参数,
    # 该参数指定在注销后需要跳转的页面,配置允许登出后跳转到指定页面
    cas.logout.followServiceRedirects=true
    #跳转到指定页面需要的参数名为 service(default)
    cas.logout.redirectParameter=service
    #在退出时是否需要 确认一下  true确认 false直接退出
    cas.logout.confirmLogout=false
    #是否移除子系统的票据
    cas.logout.removeDescendantTickets=true
    

    源码传送门:https://github.com/oycyqr/springboot-learning-demo/tree/master/springboot-sso

    展开全文
  • 文章目录一. 需求说明二. 各关键流程实现1. web-view2....难点在于此公共产品集成了单点登录,所以移动端用应用要集成公共产品的页面,应首先进行单点登录。 详细说明如下: ​ 移动端是微信小程序通过we

    一. 需求说明

    ​ 公司做了个移动端 应用,在此应用中需要集成一个公共产品,集成方式为:链接到此产品中的首页,类似ifram加载第三方应用页面。难点在于此公共产品集成了单点登录,所以移动端用应用要集成公共产品的页面,应首先进行单点登录。 详细说明如下:

    ​ 移动端是微信小程序通过web-view加载的vue前端项目[称作:项目1],此前端项目需要集成另一个**vue**项目[称作:项目2],类似iframe链接外部网站方式。项目2集成了cas单点登录,项目1集成项目2页面时需要先单点登录。以上需求分解为以下任务:

    1. 微信小程序登录、登出逻辑放到项目1中,将小程序相关配置(appId,secret,code)传递到项目1中

    2. 项目1中加载cas登录页,实现登录逻辑、登出逻辑、路由守卫逻辑、参数缓存,涉及以下页面:

      2.1 登录页,负责跳转到cas登录页
      2.2 首页,发送请求到接口项目1,认证(微信openId与平台账号绑定)、获取token并缓存、获取用户信息、缓存以上信息、跳转到业务首页

    3. 项目1后端项目[称作:接口项目1]配置shiro-cas,实现单点登录后跳转到接口项目1中指定action[称作: 跳转action],跳转action负责:

      3.1 获取相关配置,如加载项目2的页面地址;项目1地址

      3.2 跳转到项目1,并传递参数

    4. cas实现子系统主题,也就是项目1访问cas时,应该显示移动端的登录页,pc端访问cas时保持原有的登录页不变,实现多主题,每个子系统可以显示对应的主题登录页

      经过思考设计关键流程如下:

    已登录
    未登录
    web-view
    vue登录页
    接口项目
    cas
    是否登录
    回调action
    cas登录页
    vue首页
    业务首页
    页面流程

    二. 各关键流程实现

    1. web-view

    此流程就是加载vue登录页,并传递微信小程序相关参数,话不多说,关键方法如下:

    toLogin: function(e){
        var _this = this;
        var p = '?appid=' + appid + '&d=' + new Date().getTime() + '&secret=' + secret + '&xcxVersion=' + app.globalData.xcxVersion + '&classification=' + app.globalData.classification + '&rootpath=' + rootpath_jk;
        wx.login({
          success: res => {
            p = p + '&code=' + res.code;
            var vueUrl = rootpath + 'casLogin' + p ;
            console.log(vueUrl)
            _this.setData({
              webviewUrl_: vueUrl
            });
          }
        })
      }
    

    2. vue登录页

    实现:

    • 读取接口项目地址
    • 重定向到接口项目地址
    let loginPath = data.apiLoginPath + '/front/login/toIndexPage.action'
              // 不同域名cookie传参失效,改为通过后台传参
              // this.$cookies.set('appid', this.$route.query.appid)
              // this.$cookies.set('secret', this.$route.query.secret)
              // this.$cookies.set('code', this.$route.query.code)
              // this.$cookies.set('xcxVersion', this.$route.query.xcxVersion)
              // this.$cookies.set('classification', this.$route.query.classification)
              // this.$cookies.set('knowerPath', data.knowerPath)
              var p = '?sys=xsscapi&login-at=true&appid=' + this.$route.query.appid + '&secret=' + this.$route.query.secret + '&xcxVersion=' + this.$route.query.xcxVersion + '&classification=' + this.$route.query.classification + '&code=' + this.$route.query.code
              console.log(loginPath + p)
              document.location.href = loginPath + p
    

    注意这里的坑:

    • 将小程序中传过来的参数存在cookie中storage中,当域名发生变化时,参数会获取不到,所以我又将这些参数传递到了后台,后台跳回到vue项目时,还需要将参数传递回来
    • sys=xsscapi&login-at=true,这两个参数传递,否则单点登录成功后,回调action获取不到参数。这块我们对cas做了改动,引入了子系统的概念,有时间再解剖。如果没有定制,注意就行。

    3. 接口项目

    前端vue项目的后台接口,此项目和需要集成的项目都是cas的客户端系统。此项目使用shiro做权限管理,使用shiro-cas作为cas[^apereo]

    客户端,实现:

    • 当未登录时,过滤器拦截将重定向到cas登录页
    • 配置单点成功后回调地址,applicationContext-shiro.xml配置:略
    • 回调action:读取用户信息,传递参数,重定向到vue项目首页
     public String toIndexPage(HttpServletRequest request) {
            String prefix = GlobalContext.getProperty("xsscwirless.url");
            User user = SystemSecurityUtils.getUser();
            System.out.println(user.getLoginName());
            StringBuffer buffer = new StringBuffer();
            buffer.append("?appid=" + request.getParameter("appid"));
            buffer.append("&secret=" + request.getParameter("secret"));
            buffer.append("&xcxVersion=" + request.getParameter("xcxVersion"));
            buffer.append("&classification=" + request.getParameter("classification"));
            buffer.append("&code=" + request.getParameter("code"));
            buffer.append("&loginName=" + user.getLoginName());
            buffer.append("&knowerPath=" + GlobalContext.getProperty("xsscwireless.knower.path"));
            buffer.append("&casPath=" + GlobalContext.getProperty("cas.casServerUrl"));
            String entryPath = prefix + "/#/casIndex" + buffer.toString();
            System.out.println("--------entryPath-------" + entryPath);
            return "redirect:" + entryPath;
        }
    

    4. cas

    什么是cas?

    1. 官方首页
    2. 官方架构说明
    3. 协议流程
    4. 松哥介绍
    5. war包安装

    本需求中,改造CAS,主要实现:不同的客户端可以有不同的登录页,移动端系统访问cas时跳转移动登录页,不应用其他系统访问cas时跳转的登录页。具体实现利用cas主题机制,步骤如下:

    4.1. 增加service

    在这里插入图片描述

    {
      "@class": "org.apereo.cas.services.RegexRegisteredService",
      "serviceId": "^(https|imaps|http)://.*xsscapi/login$",
      "name": "移动端",
      "id": 999,
      "description": "移动端登录页",
      "evaluationOrder": 1,
      "theme": "mobile",
      "attributeReleasePolicy" : {
        "@class" : "org.apereo.cas.services.ReturnAllAttributeReleasePolicy"
      }
    }
    

    这里面注意serviceId的配置,移动端前端访问后端api,在没有进行单点登录的时候,api中cas客户端过滤器拦截跳转到cas,路径类似:http://XXX/xsscapi/login,此时serviceId匹配成功,跳转到mobile主题的登录页。

    4.2 增加theme

    在这里插入图片描述

    这里的js、images、css等静态资源都是在mobile主题登录页中使用的,如下

    4.3 增加主题登录页

    在这里插入图片描述

    同时添加mobile.properties,引用静态资源

    mobile.css.style=/themes/mobile/css/style.css
    mobile.js.jq=/themes/mobile/js/jquery.min.js
    

    然后在登录中(casLoginView.html)引用:

    <link rel="stylesheet" th:href="@{${#themes.code('cas.myself.css.classic')}}"/>
            <link rel="stylesheet" th:href="@{${#themes.code('cas.myself.css.iconfont')}}"/>
            <script th:src="@{${#themes.code('cas.javascript.file')}}"></script>
            <script th:src="@{${#themes.code('cas.javascript.gyss')}}"></script>
    

    当然也可以直接引用:

    <link href="../../static/themes/mobile/css/style.css">
    

    注意登录页名称不可更改。

    经过以上三步,cas的需求就实现完了。

    cas跳转到回调action,此action代码已在接口项目部分中贴出,主要是构造参数,跳转移动端vue首页。

     mounted () {
        // loginName
        var loginName = this.$route.query.loginName
        if (loginName) {
          this.setEnv(loginName)
          // authFlag=0,待认证;authFlag=1,已认证
          if (storage.get('authFlag') !== '1') {
            this.authUser()
          } else {
            this.readUser()
          }
        } else {
          console.log('-----单点登录失败----')
          this.$router.push({ path: 'casLogin' })
        }
      }
    

    注意loginName,存入了缓存中,它是进一步获取用户信息的key。此首页后面的代码是获取用户完整信息,然后跳转到业务首页。此两部分涉及具体业务,不再赘述。还有一个问题,就是vue项目的路由守卫。

    5. vue路由守卫

    解决的问题:

    • 判断是否进行单点登录,未登录跳转到登录页

    逻辑很简单,就是判断缓存中是否有loginName,存在即登录,next(),不存在跳转到登录页。

    三. 部署注意事项

    这部分有些坑,得从小程序说起,小程序要求业务域名必须是https协议,其通过web-view集成了vue项目,此时要求vue项目使用https地址,vue项目首先访问(redirect)其后端api,代码已在vue登录页贴出,所以要求api项目使用https地址,同理要求cas使用https地址。

    https使用配置:注意api的tomcat配置,host节点增加valve

    <Host name="localhost"  appBase="webapps"
                unpackWARs="true" autoDeploy="true">
    
            <!-- SingleSignOn valve, share authentication between web applications
                              Documentation at: /docs/config/valve.html -->
            <!--
                         <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
            -->
    
            <!-- Access log processes all example.
                              Documentation at: /docs/config/valve.html
                 Note: The pattern used is equivalent to using pattern="common" -->
            <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
                   prefix="localhost_access_log" suffix=".txt"
                   pattern="%h %l %u %t &quot;%r&quot; %s %b" />
           <Valve className="org.apache.catalina.valves.RemoteIpValve"
    		remoteIpHeader="X-Forwarded-For"
    		protocolHeader="X-Forwarded-Proto"
    		protocolHeaderHttpsValue="https"/>
    
          </Host>
    
    展开全文
  • 配置设备单点登录 (SSO)Note:This page is not updated. Please refer to the corresponding English content for the latest on this topic.概述IBM Mobile Foundation 提供单点登录 (SSO) 功能,支持在同一设备上...

    配置设备单点登录 (SSO)

    Note:

    This page is not updated. Please refer to the corresponding English content for the latest on this topic.

    概述

    IBM Mobile Foundation 提供单点登录 (SSO) 功能,支持在同一设备上的多个应用程序间共享任何定制安全性检查的状态。 例如,通过使用设备 SSO,用户可成功登录到其设备上的一个应用程序,也可以在使用同一实现的相同设备上的其他应用程序上进行认证。

    先决条件:确保阅读认证和安全教程。

    配置 SSO

    在 MobileFirst Operations Console 中:

    导航至[您的应用程序] →“安全”选项卡 → 安全性检查配置部分。

    单击新建按钮以创建新的安全性检查配置,或在安全性检查配置已存在的情况下单击编辑图标。

    在配置安全性检查属性对话框中,将启用设备 SSO 设置设定为 true,然后按确定。

    对您想要为其启用设备 SSO 的每个应用程序重复这些步骤。

    6e3008d281b4ad5312891fc8c6694671.png

    您还可以使用必需的配置来手动编辑应用程序的配置 JSON 文件,并将更改推送回 MobileFirst Server。

    从命令行窗口导航至项目的根文件夹,然后运行 mfpdev app pull。

    打开位于 [project-folder]\mobilefirst 文件夹的配置文件。

    编辑文件,为所选定制安全性检查启用设备 SSO:通过将定制安全性检查的 enableSSO 属性设置为 true 来启用设备 SSO。 该属性配置包含在 securityCheckConfigurations 对象中嵌套的安全性检查对象内。 在应用程序描述符文件中查找这些对象,如果缺失,就创建这些对象。 例如:

    "securityCheckConfigurations": {

    "UserAuthentication": {

    ...

    ...

    "enableSSO": true

    }

    }

    运行以下命令来部署更新的配置 JSON 文件:mfpdev app push。

    将设备 SSO 与预先存在的样本一起使用

    阅读凭证验证教程,因为其样本用于配置设备 SSO。

    对于此演示,将使用 Cordova 样本应用程序,但也可以使用 iOS、Android 和 Windows 样本应用程序完成相同的操作。

    使用不同的样本名称和应用程序标识重复这些步骤。

    在相同的设备上运行两个应用程序。 请注意在每个应用程序中是如何提示您输入 PIN 码 (“1234”) 的。

    如上所指示,在 MobileFirst Operations Console 中,针对每个应用程序将启用设备 SSO 设置为 true。

    退出两个应用程序,然后重试。 在打开的第一个应用程序中,会提示您点击获取余额按钮来输入 PIN 码一次。 打开第二个应用程序并点击获取余额按钮后,无需再次输入 PIN 码来获取余额。

    `

    请注意,PinCodeAttempts 安全性检查有一个 60 秒到期令牌。 因此,在 60 秒过后再次尝试后,第二个应用程序将需要 PIN 码。

    ac61b7d298b8d92c2d57b4741ad23f85.png

    Last modified on June 19, 2020

    展开全文
  • Spring Cloud Security 为构建安全的SpringBoot应用提供了一系列解决方案,结合Oauth2可以实现单点登录功能,本文将对其单点登录用法进行详细介绍。 单点登录简介 单点登录简介 单点登录(Single Sign On)指的是当...
  • 要配置 Red Hat Enterprise Linux 虚拟机使用 GNOME 和 KDE 图形桌面系统和 IPA(IdM)服务器实现单点登录,您需要在虚拟机上安装rhevm-guest-agent软件包,以及和您的 window manager 相关的软件包。重要:以下操作...
  • 默认情况下,Shiro已经...-- shiro整合cas单点 --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-cas</artifactId> <version>1.2.4</versio
  • wordpress 单点登录教程

    2021-07-23 11:02:45
    被老大安排做个 wordpress 的单点登录教程开发者文档,百度 Google 了一个世纪都没找到一个合适的配置教程,要不就是教程太老旧,要不就是某个步骤上发现链接不可用。快放弃的时候,昨晚从好基友那白嫖了一个让我...
  • Spring Boot2 使用 Spring Security + OAuth2 实现单点登录SSO

    千次阅读 热门讨论 2021-03-25 09:21:14
    前言 目前系统都是比较流行的微服务架构,在企业发展初期,企业使用的系统很少,通常一个或者两个,每个系统都...这就是单点登录要解决的问题。 单点登录英文全称Single signOn,简称就是SSO。它的解释是:在多个应用.
  • 点击上方☝码猿技术专栏轻松关注,设为星标!及时获取有趣有料的技术单点登录是多域名企业站点流行的登录方式。本文以现实生活场景辅助理解,力争彻底理清 OAuth2.0 实现单点登录的原理流程...
  • 这篇文章,我们主要来系统的串起来讲一下,从宏观的层面来讲述一下单点登录,并且来实现一个demo。 首先,我们来借助一个真实的案例来切入: 相信大家都登录过码云吧:(https://gitee.com/) 在登录选项里我们选择...
  • @EnableOAuth2Sso注解可以启用OAuth2单点登录(SingleSignOn,SSO)。默认情况下,所有的路径都是需要安全的。 我们可以在Spring Security的Java配置中使用WebSecurityConfigurerAdapter来定制它。我们可以使用ap
  • CAS企业单点登录-v5.3.x 单点登录:Single Sign On,简称SSO,SSO使得在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。 CAS框架:CAS(Central Authentication Service)是实现SSO单点登录...
  • 启用第三方系统登录授权2 测试第三方系统单点登陆使用生成的链接测试是否能正常的单点登录。3 在第三方系统中生成签名授权的URL【参数格式】:ud={"dbid":"5be178b96562c0","username":"Administrator","appid":"1",...
  • 1、CAS 单点登录分为两个部分,第一个是认证中心 Cas Server,第二个是 Cas Server。 我们使用 SpringBoot 集成 Cas 只需要集成Client。 2、CAS API官方文档 3、cas 简介博客 二级目录 三级目录 ...
  • 、因为我们启用了应用A的单点登录功能(即在启动类上增加了@EnableOAuth2Sso注解),当我们访问应用A的登录http://localhost:8082/login时,经过单点登录的过滤器,会重定向到授权服务的http://loc
  • web系统早已从久远的系统发展成为如今由多系统组成的应用群,面对如此众多的系统,用户难道要一个一个登录、然后一个一个注销吗?就像下图描述的这样  web系统由系统发展成多系统组成的应用群,复杂性应该由...
  • 作者:王克锋kefeng.wang/2018/04/06/oauth2-sso单点登录是多域名企业站点流行的登录方式。本文以现实生活场景辅助理解,力争彻底理清 OAuth2.0 实现单点登...
  • refresh token 的实现和意义 session 和 token 有什么异同和优缺点 单点登录是什么?实现思路和在浏览器下的处理 从状态说起 「HTTP 无状态」 我们知道,HTTP 是无状态的。也就是说,HTTP 请求方和响应方间无法维护...
  • 基于CAS与LDAP的单点登录(SSO)的架构与实现(子系统分别基于Drupal和Moodle)。 1.2 要求 实现在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用子系统,从而实现一次登录多次使用。 原有的子...
  • Spring Boot+Spring Security+CAS实现单点登录

    千次阅读 多人点赞 2021-01-23 21:49:06
    CAS的概述1.1、SSO1.2、CAS第二章 CAS的流程2.1、CAS服务端2.2、CAS客户端2.3、CAS流程图第三章 CAS的部署3.1、源码下载3.2、源码打包3.3、部署运行第四章 CAS的定制4.1、定制数据源4.2、兼容 HTTP4.3、定制登录页第...
  • 一、前言由于leader要求在搭好的spring cloud 框架中加入对微服务的认证包括单点登录认证,来确保系统的安全,所以研究了Spring Cloud Security这个组件。在前面搭好的demo中,如何确保微服务的安全,为整个系统添加...
  • 如何实现单点登录

    2021-02-18 10:07:39
    ManageEngine ADSelfService Plus是一个活动目录用户自助管理及单点登录解决方案,使用该方案可以实现这个场景。 配置ADSelfService Plus与其他平台的单点登录。 (其他平台应该支持SAML 2.0..
  • 有关单点问题的详解

    千次阅读 2021-01-20 16:46:42
    如何解决云服务上的单点问题? 云服务一般都存在哪些单点故障隐患 1、数据库: 我们知道数据库的单点隐患会对业务产生很大的影响。数据库故障会导致整个应用无法提供服务。随着业务规模的发展,当单台数据库可处理...
  • 什么是单点登陆单点登录(英语:Single sign-on,缩写为 SSO),又译为单一签入,一种对于许多相互关连,但是又是各自独立的软件系统,提供访问控制的属性。当拥有这项属性时,当用户登录时,就可以获取所有系统的访问...
  • 单点登录是多域名企业站点流行的登录方式。本文以现实生活场景辅助理解,力争彻底理清 OAuth2.0 实现单点登录的原理流程。同时总结了权限控制的实现方案,及其在微服务架构中的应用。作者:王克锋出处:...
  • 今天介绍创建域用户账户,启用这个账户可以登录域,能够访问网络上的资源。小伙伴们可能不一定了解,当安装完Windows Server 2012 R2操作系统并完成操作系统的环境配置后,管理员应规划一个安全的网络环境,为用户...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 228,812
精华内容 91,524
关键字:

启用单点登录