单点登录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

鸿蒙OS开机动画背后的秘密:从代码到视觉的完整解析(附源码分析)

本文深入解析了鸿蒙OS开机动画的系统级实现原理。从bootanimation服务的启动配置、与Render Service的协同,到基于VSync信号的帧率同步与绘制流水线,结合OpenHarmony源码进行了逐行解读。文章揭示了其事件驱动的优雅退出机制,并探讨了视频支持、多屏适配等高级特性与定制化可能,为开发者理解鸿蒙图形子系统提供了硬核技术视角。

sony5的博客 974

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

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

Anumbrella 1万+

海康视觉通讯配置

本文介绍了海康通讯管理中TCP和Modbus协议的配置方法。TCP通讯时,视觉系统作为服务器接收PLC客户端发送的触发信号,需注意十进制与十六进制字符串的转换。Modbus配置需填写PLC的IP地址和寄存器首地址,并预先定义整型变量。TCP通讯需开启16进制发送模式以避免数据格式问题。文章重点说明了不同通讯方式下的数据格式转换和参数设置要点。

A567852的博客 2243

Claude Skills:不是更聪明,而是更“像专家”的 Agent 养成方法

Claude Skills 不是在告诉 Agent“你能做什么”, 而是在约束它“你应该如何思考、如何判断、如何给结论”。

测试者家园 1295

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

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

uziuzi669的博客 1万+

基于ProXmoX VE的虚拟化家庭服务器(篇一)—ProXmoX VE 安装及基础配置

ProxmoxVE是一款套开源的虚拟化管理软件,用户可通过网页的方式来管理服务器上使用kvm以及lxc技术运行的虚拟机。同时提供了一些先进功能的支持,如集群、HA等。PVE虽然是开源,却是由一个商业公司在运营、更新以及维护。...

隔壁老瓦的专栏 6321

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

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

七夜同学的博客 3046

药物相关 PK(药代动力) 、PD(药效)指标知识

PK代表药物的药代动力学,指的是药物在体内的吸收、分布、代谢和排泄等过程,包括药物的药代动力学参数如Cmax(最大血药浓度)、Tmax(最大血药浓度出现的时间)、t1/2(半衰期)、AUC(药物曲线下面积)等。PD代表药物的药效学,指的是药物与生物体相互作用所产生的药理效应,包括药物的药效学参数如EC50(半数最大有效浓度)、ED50(半数最大效应剂量)、Emax(最大效应)等。PD(Pharmacodynamics)则研究药物的药效学特性,如药物的作用机制、效力、最大疗效、最小毒性等。

weixin_42357472的博客 2万+

自私兽群优化器(SHO)详解:从生物本能到智能优化

自私兽群优化器(SHO)是一种受动物群体自私行为启发的智能优化算法。该算法模拟动物在捕食威胁下的两种行为:聚集行为(全局搜索)和自私行为(局部搜索),将优化问题的解空间映射为生存环境,候选解视为猎物个体。SHO通过安全性评估将猎物分为安全、危险和高危三类,分别采用不同的位置更新策略,并引入捕食者角色增加选择压力。相比传统优化算法,SHO具有无需梯度信息、自适应平衡探索与开发、参数简单等优势,特别适合高维复杂和多模态优化问题。算法通过马尔可夫链理论保证收敛性,已在工程设计和数据挖掘等领域展现出良好性能。

qq_42212808的博客 197

CAS单点登录

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

slightly1的博客 1379

【ESP32CAM+Android+OpenCV】自定义目标数据集、训练自己的OpenCV模型部署到手机APP并对ESP32CAM无线图传显示并实时检测识别目标_资料编号30

本项目实现自定义目标数据集(想检测什么就检测什么,按照本文教程自己来更换目标)、训练自己的OpenCV模型实时检测识别(pycharm工程)。手机APP(Android studio工程)部署OpenCV模型实现对ESP32CAM(arduino工程)无线WIFI图传过来的图像实时检测识别。 本文以火焰检测识别为例进行演示,通过该过程,结合本文可自定义尝试更换为其它目标的检测,例如更换为车辆、车牌、手势、人脸面部活动、人脸表情、火焰烟雾、行人、口罩、行为、水果、植物、农作物、建筑、损伤等等部署进行检测。

嵌入式阿齐Archie 3482

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

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

csolo的博客 2295

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

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

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

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

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

3316

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

单点登录之CAS原理和实现

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

金玉良缘 11万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

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、付费专栏及课程。

余额充值