单点登录CAS学习(四)应用子系统接入

CAS统一登录认证(3): CAS 客户端接入实践 CAS 客户端接入实践 一、接入准备 为了实现Cas单点登录的接入与验证,我这里准备部署三个系统,一个是之前我们搭建的服务端,这个服务端完全是Cas提供的,还有两个是我们自己编写的并且引入的Cas 客户端的接入应用,具体情况如下表所示: 应用 域名 端口 系统描述 来源 url C... 阅读详情

       前面学习实践了CAS服务端的配置和登陆验证等内容,下面要进行单点登录的应用子系统接入的实践。单点登录最大的使用场景就是解决多个子系统的多次登陆问题,使用CAS框架可以将多次登陆化简为统一一次登陆认证。

1、服务端配置service

客户端接入 CAS 首先需要在服务端进行注册,否则客户端访问将提示“未认证授权的服务”警告: 

我们可以参考原来的service配置进行修改,原来的配置文件在war解压后的如下位置:

将这个文件拷贝到工程中的resources/services下,打开这个文件,如下图

分析一下里面的内容

{
//这是注册类,除非自己实现了一个注册类,否则不用动

  "@class" : "org.apereo.cas.services.RegexRegisteredService",

  //匹配url
"serviceId" : "^(https|imaps)://.*",
//服务的全局名称

  "name" : "HTTPS and IMAPS",
//服务的id

  "id" : 10000001,
//描述:描述客户端的服务

  "description" : "This service definition authorizes all application urls that support HTTPS and IMAPS protocols.",
//定义多个服务的执行顺序

  "evaluationOrder" : 10000

}
}

Json文件的命名必须满足如下规则:

${name}-${id}.json  其中 id 与文件中的id一致,名称

下面我们参考上面的内容建立一个要加入到单点登录的子应用的配置文件

名字就设定为APP1-10000003.json

然后在配置文件application.properties下添加配置:

##

# Service Registry(服务注册)

#

# 开启识别Json文件,默认false

cas.serviceRegistry.initFromJson=true



#自动扫描服务配置,默认开启

#cas.serviceRegistry.watcherEnabled=true

#120秒扫描一遍

cas.serviceRegistry.schedule.repeatInterval=120000

#延迟15秒开启

# cas.serviceRegistry.schedule.startDelay=15000

##

# Json配置

cas.serviceRegistry.json.location=classpath:/services

添加完成后,启动CAS服务端,可以看到有2个service已经启动。本例是因为删除了原来的配置json,否则的话,会看到4个services

启动日志看到,有两个service,因为默认的war包下面还有一个service。看到app1

已经注册成功

2、 客户端1(业务系统1)接入

2.1 准备一个客户端工程

首先我们准备一个待接入的客户端1,我们命名为app1,下面我们先将app1工程调起来,本例子中使用的是一个基于maven的简单SSM工程。这个工程,通过从数据库中获取账号和密码进行登录验证,这个工程的详细内容,已经放到github上,可以从github的下面url 获取这个初始工程:https://github.com/cwqsolo/StudySsm.git

这个工程,没有集成cas客户端时,运行起来的登陆界面如下图所示:

完成后,初始工作完成后,我们开始客户端应用1的接入。注意应用1的运行端口配置如下

 

启动应用1以后,打开url:http://localhost:8380/login.jsp 用账号admin 密码 123456

下面我们需要在此工程的基础上添加基于cas的单点登录。好,让我们开始吧。

 

2.2 导入证书

客户端证书和服务端证书是同一个证书,不然就会报错,我因为是在同一台机器,所以就没有进行以下操作。

 

sudo keytool -import -file E:/tmp/tomcat-key/tomcat.cer -alias tomcat -keys

 

2.3 修改pom.xml 文件

首先修改pom.xml 文件,添加cas客户端依赖

<dependency>

   <groupId>org.jasig.cas.client</groupId>

   <artifactId>cas-client-core</artifactId>

   <version>3.5.0</version>

</dependency>
如下图:

添加完成后,重新导入依赖。可以采用下面的方式用右键方式进行重新导入

2.4 修改web.xml

1)增加displayname

 

2)添加单点登录的相关内容

注意这里的单点登录的内容中涉及到的服务端url和客户端url需要和实际的一致


<!-- ========================单点登录开始 ======================== -->
<!-- 用于单点退出,该过滤器用于实现单点登出功能,可选配置 -->
<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>
    <init-param>
        <param-name>casServerUrlPrefix</param-name>
        <param-value>http://server.cas.com:8080/cas</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>CAS Single Sign Out Filter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<!-- 该过滤器用于实现单点登录功能 -->
<filter>
    <filter-name>CAS Filter</filter-name>
    <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
    <init-param>
        <param-name>casServerLoginUrl</param-name>
        <param-value>http://server.cas.com:8080/cas/login</param-value>
        <!-- 使用的CAS-Server的登录地址,一定是到登录的action -->
    </init-param>
    <init-param>
        <param-name>serverName</param-name>
        <param-value>http://app1.cas.com:8380/node1/login.jsp</param-value>
        <!-- 当前Client系统的地址 -->
    </init-param>

</filter>
<filter-mapping>
    <filter-name>CAS Filter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>


<!-- 该过滤器负责对Ticket的校验工作 -->
<filter>
    <filter-name>CAS Validation Filter</filter-name>
    <filter-class>org.jasig.cas.client.validation.Cas30ProxyReceivingTicketValidationFilter</filter-class>
    <init-param>
        <param-name>casServerUrlPrefix</param-name>
        <param-value>http://server.cas.com:8080/cas</param-value>
        <!-- 使用的CAS-Server的地址,一定是在浏览器输入该地址能正常打开CAS-Server的根地址 -->
    </init-param>
    <init-param>
        <param-name>serverName</param-name>
        <param-value>http://app1.cas.com:8380/node1/login.jsp</param-value>
        <!-- 当前Client系统的地址 -->
    </init-param>
    <!--<init-param>-->
        <!--<param-name>redirectAfterValidation</param-name>-->
        <!--<param-value>true</param-value>-->
    <!--</init-param>-->
    <init-param>
        <param-name>useSession</param-name>
        <param-value>true</param-value>
    </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()
        或者request.getUserPrincipal().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>
<!-- ========================单点登录结束 ======================== -->

 

2.5 单点退出

原来客户端的登出是在controller(本例是userController.java)中,在该文件中,将退出重新指向login.jsp。 现在使用cas单点登出后,需要到服务端的退出,这样就实现了单点登出。

2.6 启动客户端1:

客户端的url是http://app1.cas.com:8380/login.jsp, 账号和密码为 admin, 123456。账号和密码登陆后,展示的url是:http://app1.cas.com:8380/index.jsp。

我们预期的结果是:

1)当输入http://app1.cas.com:8380/index.jsp页面的时候,如果当前系统没有登录,则跳转到cas进行登录,登录后,打开index页面。

2)登陆成功后,在app1中进行业务操作跳转时,和原来app1应用一样。

3)单点登出:执行完成后,退出系统,会退出cas服务端,这样下次再访问客户端1的时候,会要求继续输入账号和密码

下面我们分别在cas服务端没有开启和开启的情况下分别查看一下单点登录SSO的情况是否符合我们的预期。

2.6.1 CAS服务未启动

首先测试一下如果cas服务端没有开启的情况下,启动工程会如何。启动完成后,我打开上面的应用1的url,弹出下面的网页,说明应用1去连接cas服务端,但是没有连接上。

2.6.2 开启CAS服务端

在确保CAS服务端正确开启的情况下,我们输入客户端1(app1)的url,http://app1.cas.com:8380/index.jsp   (这个页面是正常登陆后的页面),这个时候,客户端1(app1)没有弹出自己的登陆页面,而是弹出cas的登陆界面

在登录界面的右上角,显示出当前登陆的是app1.

我们输入app1的账号 admin 和密码 123456,这个时候,会跳出来下面的界面

看到这个界面说明客户端应用1已经通过单点登录登录到应用。之后,在系统中的测试都和使用原系统一致。

我们现在测试一下退出登录,点击退出登录-退出后显示下面的界面:

说明退出客户端,并且在服务端也注销了。这个时候访问客户端的应用http://app1.cas.com:8380/index.jsp  界面,又会弹出单点登录的界面。说明客户端1的单点登录和单点登出已经被cas服务端(统一登录)全面管理了。

2.6.4 重要说明

如果客户端的账号,因为某种原因删除后,而没有同步删除统一登录服务端的账号,则该账号还是会可以进入到客户端系统,因此账号的同步非常重要,另外客户端应用界面要对用户进行二次检查。

修改后的工程也可以在github上获取:

https://github.com/cwqsolo/StudySsmCas.git

3、客户端2(采用shiro)接入

下面我们在另外一个客户端2(app2)上实现cas单点登录和单点登出。客户端2和客户端1的区别在于客户端2集成了shiro进行管理。客户端2的工程也可以在github上找到:

https://github.com/cwqsolo/StudySsmShiro.git

集成了cas后的工程再github上链接如下

https://github.com/cwqsolo/StudySsmShiroCas.git

3.1 修改pom.xml 文件

首先修改pom.xml 文件,由于shiro集成了cas,所以可以添加如下依赖


<!-- shiro-cas集成依赖包 -->

<dependency>

    <groupId>org.apache.shiro</groupId>

    <artifactId>shiro-cas</artifactId>

    <version>1.4.0</version>

</dependency>

添加完成后,重新导入依赖。可以采用右键方式进行重新导入

 

3.2  修改web.xml

由于基础工程已经是一个shiro工程,所以在web.xml中已经含有shiro相关配置,无需修改

3.3  修改spring-shiro.xml

         修改spring-shiro.xml 文件,使得其适用于cas应用。修改的地方主要是一些地址的跳转,完整的文件信息如下:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:util="http://www.springframework.org/schema/util"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
       http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd">

    <!-- shiro的核心配置:  配置shiroFileter id名必须与web.xml中的filtername保持一致 -->
    <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        <property name="securityManager" ref="securityManager" />
        <!-- 要求登录时的链接(可根据项目的URL进行替换),非必须的属性,默认会自动寻找Web工程根目录下的"/login.html"页面 -->
        <property name="loginUrl" value="http://server.cas.com:8080/cas/login?service=http://app2.cas.com:8580/node2/shiro-cas" />

        <property name="filters">
            <map>
                <!-- 添加casFilter到shiroFilter, 这里的key  cas 需要和下面的/shiro-cas = cas 一致 -->
                <entry key="cas" value-ref="casFilter" />
                <entry key="logout" value-ref="logoutFilter" />
            </map>
        </property>

        <!--/shiro-cas 是回调地址,不需要实现,指向了casFilter                    /logout = logout-->
        <property name="filterChainDefinitions">
            <value>
                /shiro-cas = cas
                /unauthorized.jsp = anon
                /index.jsp = authc
                /user/** = user

            </value>
        </property>
    </bean>

    <!-- CasFilter为自定义的单点登录Fileter -->
    <bean id="casFilter" class="org.apache.shiro.cas.CasFilter">
        <!--  配置验证错误时的失败页面 -->
        <property name="failureUrl" value="/unauthorized.jsp"/>
        <property name="successUrl" value="/user/loginSuccess" />
    </bean>

    <bean id="logoutFilter" class="org.apache.shiro.web.filter.authc.LogoutFilter">
        <!-- 配置验证错误时的失败页面 -->
        <property name="redirectUrl" value="http://server.cas.com:8080/cas/logout" />
    </bean>


    <!-- 单点登录下的配置 -->
    <bean id="casRealm" class="com.studyssm.shiro.MyRealm">
        <property name="defaultRoles" value="ROLE_USER"/>
        <!-- cas服务端地址前缀 -->
        <property name="casServerUrlPrefix" value="http://server.cas.com:8080/cas" />
        <!-- 应用服务地址,用来接收cas服务端票据 -->
        <!-- 客户端的回调地址(函数),必须和上面的shiro-cas过滤器casFilter拦截的地址一致 -->
        <property name="casService" value="http://app2.cas.com:8580/node2/shiro-cas" />
    </bean>

    <!-- 配置安全管理器securityManager, 缓存技术: 缓存管理 realm:负责获取处理数据 -->
    <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
        <property name="subjectFactory" ref="casSubjectFactory"></property>
        <property name="realm" ref="casRealm" />
        <property name="cacheManager" ref="cacheManager" />
    </bean>

    <bean id="casSubjectFactory" class="org.apache.shiro.cas.CasSubjectFactory"></bean>

    <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
        <property name="securityManager" ref="securityManager" />
    </bean>

    <!-- 配置缓存管理器 -->
    <bean id="cacheManager" class="org.apache.shiro.cache.MemoryConstrainedCacheManager" />

    <!-- 保证实现了Shiro内部lifecycle函数的bean执行 -->
    <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" />

    <bean
            class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
        <property name="staticMethod"
                  value="org.apache.shiro.SecurityUtils.setSecurityManager"></property>
        <property name="arguments" ref="securityManager"></property>
    </bean>

</beans>

<

3.5 修改MyRealm.java

修改shiro的自定义realm,添加cas认证方面的内容,具体realm类MyRealm.java内容如下:

package com.studyssm.shiro;

import com.studyssm.entity.User;
import com.studyssm.service.UserService;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.cas.CasAuthenticationException;
import org.apache.shiro.cas.CasRealm;
import org.apache.shiro.cas.CasToken;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.subject.SimplePrincipalCollection;
import org.apache.shiro.util.CollectionUtils;
import org.apache.shiro.util.StringUtils;
import org.jasig.cas.client.authentication.AttributePrincipal;
import org.jasig.cas.client.validation.Assertion;
import org.jasig.cas.client.validation.TicketValidationException;
import org.jasig.cas.client.validation.TicketValidator;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.*;


/**
 * Describe:
 *
 * @author cwqsolo  MyRealm ,继承自 CasRealm ,来完成对 CAS Server 返回数据的验证
 * @date 2019/07/22
 */
public class MyRealm  extends CasRealm {

    @Autowired
    private UserService userService;

    private  User us;


    /**
     * 授权,在配有缓存的情况下,只加载一次。
     * @param principal
     * @return
     */
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principal) {
        System.out.println("Myrealm  doGetAuthenticationInfo 1++++");
        //当前登录用户,账号
        us= (User)principal.getPrimaryPrincipal();
        String username = us.getUserName();

        System.out.println("当前登录用户:"+username);
        //获取角色信息
        Set<String> roles = userService.findRoles(username);

        if(roles.size()==0){

            System.out.println("当前用户没有角色!");
        }else
        {

        }

        SimpleAuthorizationInfo simpleAuthenticationInfo  = new SimpleAuthorizationInfo();

        simpleAuthenticationInfo.setRoles(userService.findRoles(username));
        simpleAuthenticationInfo.setStringPermissions(userService.findPermissions(username));

        return simpleAuthenticationInfo ;

    }

    /**
     *  认证登录,查询数据库,如果该用户名正确,得到正确的数据,并返回正确的数据
     *        AuthenticationInfo的实现类SimpleAuthenticationInfo保存正确的用户信息
     *
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        System.out.println("Myrealm  认证  ++++1");

        CasToken casToken = (CasToken) token;

        // token为空直接返回,页面会重定向到 Cas Server 登录页,并且携带本项目回调页
        if (token == null) {
            System.out.println("Myrealm  认证  token 为空 ++++");
            return null;
        }

        System.out.println("Myrealm  认证  ++++2");
        // 获取服务端范围的票根
        String ticket = (String) casToken.getCredentials();

        // 票根为空直接返回,页面会重定向到 Cas Server 登录页,并且携带本项目回调页
        if (!StringUtils.hasText(ticket)) {
            System.out.println("Myrealm  认证  ticket 为空 ++++");
            return null;
        }

        TicketValidator ticketValidator = ensureTicketValidator();

        try {
            System.out.println("Myrealm  认证  ++++4");
            // 票根验证
            Assertion casAssertion = ticketValidator.validate(ticket, getCasService());
            // 获取服务端返回的用户数据
            AttributePrincipal casPrincipal = casAssertion.getPrincipal();

            System.out.println("Myrealm  认证  ++++5");
            // 拿到用户唯一标识
            String username = casPrincipal.getName();

            // 通过唯一标识查询数据库用户表
            // 如果查询到对应用户则直接返回用户数据
            us = userService.findUserByUsername(username);
            System.out.println("Myrealm  认证  us info="+us.toString());

            //如果没有查询到,抛出异常
            if( us == null ) {
                System.out.println("Myrealm::账户"+username+"不存在!");
                throw new UnknownAccountException("账户"+username+"不存在!");

            }else{
                //如果查询到了,封装查询结果,
                Object principal = us.getUserName();
                Object credentials = us.getPassword();
                String realmName = this.getName();

                // 将获取到的本项目数据库用户包装为 shiro 自身的 principal 存于当前 session 中
                // 之后在整个项目中都可以通过 SecurityUtils.getSubject().getPrincipal() 直接获取到当前用户信息
                List<Object> principals = CollectionUtils.asList(us, casPrincipal.getAttributes());
                PrincipalCollection principalCollection = new SimplePrincipalCollection(principals, getName());

                System.out.println("Myrealm  认证  return sucessfully!!!");
                return new SimpleAuthenticationInfo(principalCollection, ticket);
            }

        } catch (TicketValidationException e) {
            System.out.println("Myrealm  认证  ++++++");
            throw new CasAuthenticationException("Unable to validate ticket [" + ticket + "]", e);
        }


    }

 

3.6 单点退出

原来客户端的登出是在controller(本例是userController.java)中,在该文件中,将退出重新指向login.jsp。 现在使用cas单点登出后,需要到服务端的退出,这样就实现了单点登出。userController.java类可以从github上获取,这里贴出退出函数:

/**
 * 退出
 *
 * @param session
 * @return
 */
@RequestMapping("/logout")
public String logout(HttpSession session) {
    System.out.println("run  logout....");
    //session.invalidate();
    Subject subject = SecurityUtils.getSubject();
    //判断当前用户是否已登录
    if (subject.isAuthenticated()) {
        //退出登录
        subject.logout();
        System.out.println("subject.logout!!!");
    }
    return "redirect:http://server.cas.com:8080/cas/logout?service=http://app2.cas.com:8580/node2/shiro-cas";
}

 

4、跨系统单点登录验证

4.1 启动客户端2:

客户端的url是http://app2.cas.com:8580/login.jsp, 账号和密码为 admin, 123456。账号和密码登陆后,展示的url是:http://app2.cas.com:8580/index.jsp。

我们预期的结果是:

1)当输入http://app2.cas.com:8580/index.jsp页面的时候,如果当前系统没有登录,则跳转到cas进行登录,登录后,打开index页面。

2)登陆成功后,在app1中进行业务操作跳转时,和原来应用一样。

3)单点登出:执行完成后,退出系统,会退出cas服务端,这样下次再访问客户端1的时候,会要求继续输入账号和密码

4.2  应用1和应用2都没有登录

在确保CAS服务端正确开启的情况下,我们分别在两个浏览器界面两个客户端应用的url

app1.cas.com:8380/node1/index.jsp

app2.cas.com:8580/node2/index.jsp

这个时候,浏览器会跳转到单点登录服务端,显示登陆界面,两个登陆界面的区别是分别有app1和app2提示说明是哪个客户端应用接入

应用2的登陆界面

4.3  应用1登陆,应用2无需登陆

这个时候,我们在应用1登陆,再打开应用2,就无需登陆了。

使用admin账号登陆应用1(app1)

这个时候,刷新一下应用2界面,发现也进入系统了

4.4 应用1登出,应用2也无法访问

接下来,我们将应用1登出,如下图

然后我们再访问应用2时,会出现重新登录界面。

4.5 应用1和应用2的账号差异

当某账号在应用1中存在,在应用2中不存在的时候,进行登录访问,则应用1可以正常访问,应用2会提示

5 重要说明

如果客户端的账号,因为某种原因删除后,而没有同步删除统一登录服务端的账号,则该账号还是会可以进入到客户端系统,因此账号的同步非常重要,另外客户端应用界面要对用户进行二次检查。

CAS单点登录(一):启动CAS认证中心服务 下载并部署CAS服务端,非常简单的几个配置 阅读详情

相关推荐

CAS单点登录从入门到部署

当我们访问其他的应用,与前面的步骤也是基本相同,首先用户访问受保护的资源,跳转回浏览器,浏览器含有先前登录的CASTGC cookie,CASTGC cookie包含了TGT并发送到CAS认证中心,CAS认证中心校验TGT是否有效,如果有效分发浏览器一个带ST参数的资源地址URL,应用程序拿到ST后,再发送给CAS认证中心,如果认证了ST有效后,结果会返回一个包含成功信息的XML给应用。用户凭借ST去访问service,service拿ST去CAS验证,验证通过后,允许用户访问资源。PGT是ST签发的。

cgk_ALEM的博客 1998

未认证授权的服务 不允许使用CAS来认证您访问的目标应用。

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34192816的博客 1万+

CAS学习笔记二:CAS单点登录流程

背景 由于公司项目甲方众多,各甲方为了统一登录用户体系实现单点登录(SSO)开始要求各乙方项目对接其搭建的CAS单点登录服务,有段时间对CAS的流程很迷,各厂商还有基于CAS进行二次开发的情况,所以对它的官方文档进行了一定的学习,记录下来帮助有需要的同学。 由于CAS的验签协议较多,此处将仅使用 验签 略过其子流程,感兴趣的可以查看官方文档进行系统学习。 术语 此处将不介绍验签相关的术语,约等于CAS1 CAS (Central Authentication Service) - 中央认证服务器

拾级而上 4774

CAS 未认证授权服务 不允许使用CAS来认证您访问的目标应用

资源环境: CAS服务端:CAS 5.3.2 服务端 CAS客户端:Spring Boot +CAS 客户端 访问过程: 1、CAS 客户端访问本地项目指定端口:http://localhost:9100/cas/index 2、CAS 客户端调整至CAS 服务端时,提示如下错误信息:CAS 未认证授权服务 不允许使用CAS来认证您访问的目标应用 解决办法:打开cas-server-w...

zhouzhiwengang的专栏 4万+

CAS单点登录详细流程

一、CAS简介和整体流程 CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目。CAS 具有以下特点: 【1】开源的企业级单点登录解决方案。 【2】CAS Server 为需要独立部署的 Web 应用。 【3】CAS Client 支持非常多的客户端(这里指单点登录系统中的...

dl71181的博客 1407

单点登录cas常见问题(二) - 子系统是否会频繁访问cas中心?

这个问题的完整描述是:用户成功登陆后,在访问子系统的受限资源时,还需要访问cas中心么,即子系统是否还会频繁访问cas中心,cas中心会不会压力太大? 答案是:不会。 如果用户通过子系统A登录了cas中心,因为子系统A已经为每个登录用户创建了session(参考 单点登录cas常见问题(一) - 子系统是否还要做session处理? ),浏览器也有子系统的cookie,这时候用户的访问就和

will的成长之路 4170

CAS实现单点登录SSO执行原理探究

一、不落俗套的开始 1、背景介绍 单点登录:Single Sign On,简称SSO,SSO使得在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。 CAS框架:CAS(Central Authentication Service)是实现SSO单点登录的框架。 2、盗一张学习CAS绝大多都看过的图以及执行部分分析 注:已分不清原创,此处就不给出地址了。 从结构上看,CAS包含两个部分:CAS Server 和CAS Client需要独立部署,主要负责对用户的认证工作;CA

yshir 348

OpenClaw 接入智谱 GLM-5-Turbo 龙虾套餐:完整避坑指南与 SOP

OpenClaw 接入智谱 GLM-5-Turbo 的核心在于“端点匹配”和“多渠道验证”。端点匹配:龙虾套餐必须用标准端点。多渠道验证:遇到 TUI 不显示时,用curl或飞书机器人验证,不要被 Bug 误导。希望这份 SOP 能帮你顺利跑通 OpenClaw + GLM-5-Turbo,享受强大的 AI 编程助手!

Aaron_liu20的博客 1703

CAS单点登录(九)——客户端接入

在前面的CAS系列文章中,我们讲解了CAS从搭建到具体的自定义配置,但针对的都是CAS服务端的知识,今天我们讲解一下CAS的客户端知识点。

Anumbrella 1万+

ComfyUI节点流实战:用Wan2.1制作电商短视频全流程(附人物/商品模板)

本文提供了一份详尽的ComfyUI实战教程,指导用户如何利用通义万相Wan2.1图生视频模型,高效制作适用于抖音等平台的电商短视频。内容涵盖从环境部署、核心工作流搭建,到针对服装、3C数码等品类的高级提示词模板与参数调优,旨在帮助电商从业者快速生成高质量、高保真商品展示视频,显著提升内容生产效率。

potato的博客 1281

NFC门禁卡复制全解析:从M1卡到UID卡的攻防实践

本文深入解析了NFC门禁卡的安全机制与攻防实践。从M1卡基于Crypto1算法的原理漏洞讲起,详细阐述了利用Proxmark3等工具进行侦听、破解密钥及使用UID卡进行复制的完整攻击链条。同时,为防御方提供了从升级CPU卡、启用全扇区认证到部署多因子验证的系统性防护策略,旨在帮助管理员构建更稳固的物理安全防线。

weixin_29182481的博客 1402

三、SpringBoot集成CAS 单点登录,CAS Client。CAS 单点登录动态开关。

目录CAS 简介二级目录三级目录 CAS 简介 1、CAS 单点登录分为两个部分,第一个是认证中心 Cas Server,第二个是 Cas Server。 我们使用 SpringBoot 集成 Cas 只需要集成Client。 2、CAS API官方文档 3、cas 简介博客 二级目录 三级目录 ......

uziuzi669的博客 1万+

钣金设计高薪进阶:从材料工艺到DFMA降本增效全解析

钣金设计是机械制造领域的核心技术之一,它涉及将金属板材通过切割、折弯、焊接等工艺成型为所需零件。其核心原理在于深刻理解材料特性、制造工艺约束与结构力学,以确保设计在功能、成本与可制造性之间取得最佳平衡。这项技术的价值在于,优秀的钣金设计能直接驱动产品降本增效,通过优化材料利用率、简化装配工序和避免设计缺陷,为企业节省大量模具与生产成本。其应用场景广泛,从机箱机柜、汽车部件到电子设备外壳无处不在。本文将聚焦于实现这一价值的关键路径,深入探讨面向制造与装配的设计(DFMA)原则在钣金领域的实战应用,并剖析如何通

weixin_34301132的博客 393

【vue + springboot】前后端分离项目接入cas单点登录系统

前后端分离项目接入cas单点登录系统 vue + springboot cas服务端搭建 cas客户端搭建 跨域问题

七夜同学的博客 3046

数字 IC 笔试面试必考点(1)FPGA 芯片架构

FPGA 芯片架构是非常重要的,如果你不了解 FPGA 芯片内部的详细架构,那么...

新芯设计的博客 2811

RT-DETR改进策略【Conv和Transformer】| ICCV-2023 iRMB 倒置残差移动块 轻量化的注意力模块

本文记录的是利用模块优化的目标检测网络模型。的作用在于克服了常见模块无法同时吸收CNN 效率建模局部特征和利用Transformer 动态建模能力学习长距离交互的问题。相比一些复杂结构或多个混合模块的方法,能更好地权衡模型成本和精度。本文将其用于的模型改进和二次创新,更好地突出重要特征,提升模型性能。Rethinking Mobile Block for Efficient Attention-based Models从微观角度看,由和组成。及其改进的实现代码如下: 四、创新模块 4.1 改进点1⭐ 模块

Limiiiing的博客 816

CAS单点登录

单点登录(Single Sign On),是目前比较流行的企业业务整合的解决方案之一。sso是指在多个应用系统中,用户只需要登录一次就能访问所有相互信息的应用系统。一个组织里会有多个系统,进入每个系统都需要用户进行单独登录,这种方式对用户体验、账号管理、账号安全等方面都不具备优势。如果能用让用户只需要登录一次就能进入多个系统,这不仅仅给用户带来了更好的体验更重的是方便了各个系统之间的整合以及降低了安全风险和管理的消耗。账号管理系统结构图如下:

slightly1的博客 1379

【agent实战教程】OpenClaw多个agent一文通

一个合格的独立agent,必须具备6个完全独立的专属组件独立组件路径规则核心要求不独立的严重后果唯一agentId配置文件中全局唯一,不能重复,建议用英文+数字,不要有特殊字符agent配置冲突,消息派单错误,会话串线独立工作区(workspace)建议每个agent一个独立文件夹,不要共用人设、记忆、规则混在一起,agent人设崩塌,对话串线独立状态目录(agentDir)固定系统自动生成,绝对禁止多个agent复用同一个agentDir。

海兰 650

单点登录CAS学习(一):初识单点登录

一、单点登录应用场景 不少业主单位随着自身的发展,建立不少业务支撑系统,往往会采用不同的开发商进行系统开发和建设,因此必然形成如下一种局面:工作人员需要登录多个业务系统才能将自己的工作全部完成,给工作人员带来了额外的负担。 因此单点登录变应运而生了,它解决了多个系统都要登陆的问题,只需要打开一个系统时,进行登录(单点登录),就可以自由切换其他的系统。 二、单点登录的框架 ...

csolo的博客 2295

Halcon实例转OpenCVSharp--粘连物体分割与计数(基于距离变换+分水岭算法) (附源码)

本文作者Color Space,文章未经作者允许禁止转载! 本文将介绍OpenCVSharp应用实例--粘连物体分割与计数(基于距离变换+分水岭算法)! 本文使用的OpenCVSharp版本---》v4.5.3。 实现目标:将下图中的硬币分割出来并计算数量。 预期效果图: ...

Color Space的博客 2420

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

应用系统基于CAS实现单点登录的解决方案

单点登录 (SingleSign-On,SSO) ,是一种帮助用户快捷访问网络中多个站点的安全通信技术。单点登录系统基于一种安全的通信协议,该协议通过多个系统之间的用户身份信息的交换来实现单点登录。使用单点登录系统时,用户只需要登录一次,就可以访问多个系统,不需要记忆多个口令密码。

3316

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

单点登录之CAS原理和实现

1.开源单点登录系统CAS入门1.1 什么是单点登录单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。我们目前的系统存在诸多子系统,而这些子系统是分别部署在不同的服务器中,那么使用传统方式的session是无法解决的,我们需要使用相关的单点登录技术来解决。1.2 什

金玉良缘 11万+

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Yapi接入CAS实现单点登录

前面介绍了Yapi部署的流程,https://blog.youkuaiyun.com/qq_36742720/article/details/97754354(window linux同样适用)。下面来介绍怎么实现CAS单点登录。 这里我们要用到一个插件,https://github.com/wsfe/yapi-plugin-cas (虽然我不是原作者,但还是建议大家点个star。因为他真的能够帮你解决问...

qq_36742720的博客 3024

单点登录-CAS介绍

什么是 CAS CAS(Central Authentication Service)是耶鲁大学的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录解决方案。采用 CAS 最大的因素是从安全性角度来考虑,用户在 CAS 服务端录入用户名和密码之后通过 Ticket 在不同系统间进行认证,不会在网上传输密码,从而保证安全性。 CAS 具有以下特点: 开源通用的企业级单点登录解决方案; 一...

小白成神路 1639

cas单点登录流程

CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的。

Lzfnemo2009的博客 1529
上一篇: 单点登录CAS学习(三) 通过JDBC进行登录验证
下一篇: Activiti6.0学习实践(1)-基础和部署
虎纠卫
博客等级 码龄24年 440粉丝 120原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值