SSO单点登录(三)SpringBoot+Shiro+CAS创建CAS客户端

springBoot+shiro+cas基于sso单点登录(二) 单点登录流程 客户端请求目标服务器 目标服务器重定向到cas服务器 cas服务器进行验证,通过则请求目标服务器,将ticket传给目标服务器 目标服务器根据ticket,请求cas服务器,获取用户登录信息 cas服务器返回验证消息给目标服务器 项目实现 1、导入依赖包 <!-- shrio 权限框架 --> <dependency&... 阅读详情

SpringBoot+Shiro+CAS创建CAS客户端,在实际的应用中,是把这个创建的客户端做成一个通用的jar包,当有服务需要接入到CAS服务端时,就让这个服务引入这个客户端就可以了。

这个客户端是通过shiro做登录验证、以及权限验证,登录验证是验证一些如:用户是否被禁用,是否黑名单,是否被关小黑屋等等,账号和密码验证是在CAS服务端做的,这里是不做的。

这篇文章只是简单的整合了SpringBoot+Shiro+CAS。

注意:这些代码都是已经跑通过的,其中涉及到单点登录和单点登出,其中单点登录可以使用localhost,但是单点登出,就必须要域名,如果不知道怎么做本地域名,那么就看看这篇文章:Win10 如何把本地ip映射成域名_我是混IT圈的-优快云博客

其中有两个问题没有解决:

1、客户端返回了登录错误,服务端要怎么展示?

2、服务端的登录,不只是账号和密码,还需要验证码登录,怎么改进服务端?

整体的项目结构

废话不多说,上代码

pom.xml

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-all</artifactId>
            <version>1.8.0</version>
        </dependency>
        <!--shiro与cas整合-->
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-cas</artifactId>
            <version>1.8.0</version>
        </dependency>
        <!--shiro与spring整合-->
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-spring</artifactId>
            <version>1.8.0</version>
        </dependency>
        <!--shiro与thymeleaf整合-->
        <dependency>
            <groupId>com.github.theborakompanioni</groupId>
            <artifactId>thymeleaf-extras-shiro</artifactId>
            <version>2.1.0</version>
        </dependency>

ShiroCasConfig

package com.example.casclient.config;

import at.pollux.thymeleaf.shiro.dialect.ShiroDialect;
import com.example.casclient.shiro.AdminRealm;
import org.apache.shiro.cas.CasFilter;
import org.apache.shiro.cas.CasSubjectFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.filter.authc.LogoutFilter;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.jasig.cas.client.authentication.AuthenticationFilter;
import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.servlet.*;
import java.io.IOException;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

@Configuration
public class ShiroCasConfig {
    /**
     * 	配置权限管理器(核心)
     * @return
     */
    @Bean
    public DefaultWebSecurityManager securityManager() {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        //选择cas的SubjectFactory
        securityManager.setSubjectFactory(new CasSubjectFactory());
        //选择自定义的realm
        securityManager.setRealm(adminRealm());
        return securityManager;
    }

    /**
     * 	shiro过滤器
     * @return
     */
    @Bean("shiroFilter")
    public ShiroFilterFactoryBean shiroFilter() {
        ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean();
        //Shiro的核心安全接口,这个属性是必须的
        shiroFilter.setSecurityManager(securityManager());

        //要求登录时的链接(可根据项目的URL进行替换),非必须的属性,默认会自动寻找Web工程根目录下的"/login.html"页面,结尾的shiro-cas必须的.
        shiroFilter.setLoginUrl("http://sso.cas.com:8080/cas/login?service=http://a.cas.com:8081/shiro-cas");

        //登录成功后要跳转的连接
        shiroFilter.setSuccessUrl("/index.html");

        // 用户访问未对其授权的资源时,所显示的连接
        //若想更明显的测试此属性可以修改它的值,如unauthor.jsp,然后用登录后访问/admin/listUser.jsp就看见浏览器会显示unauthor.jsp
        shiroFilter.setUnauthorizedUrl("/sso/unauthorized");

        /** Shiro连接约束配置,即过滤链的定义
         *	此处可配合我的这篇文章来理解各个过滤连的作用http://blog.youkuaiyun.com/jadyer/article/details/12172839 -->
         * 	下面value值的第一个'/'代表的路径是相对于HttpServletRequest.getContextPath()的值来的 -->
         * 	anon:它对应的过滤器里面是空的,什么都没做,这里.do和.jsp后面的*表示参数,比方说login.jsp?main这种 -->
         *	authc:该过滤器下的页面必须验证后才能访问,它是Shiro内置的一个拦截器org.apache.shiro.web.filter.authc.FormAuthenticationFilter -->
         */
        Map<String, Filter> filterMap = new HashMap<>();
        filterMap.put("casFilter",casFilter());
        filterMap.put("logout",logoutFilter());
        shiroFilter.setFilters(filterMap);

        Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();

        filterChainDefinitionMap.put("/shiro-cas", "casFilter");//cas登录
        filterChainDefinitionMap.put("/logout", "logout");//cas登出
        //配置本服务的其他需要拦截的url和不需要拦截的url,authc:需要登录  anon:不需要登录
        filterChainDefinitionMap.put("/*.js", "anon");//静态文件不需要验证
        filterChainDefinitionMap.put("/index.html", "anon");//首页
        filterChainDefinitionMap.put("/fail.html", "anon");//登录失败页面

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

        shiroFilter.setFilterChainDefinitionMap(filterChainDefinitionMap);
        return shiroFilter;
    }

    //cas的登录过滤器
    public CasFilter casFilter(){
        CasFilter casFilter = new CasFilter();
        /**
         * 登录失败,先调用登出的接口,在跳转到错误页面
         * 因为这里的登录失败是因为客户端的用户状态验证,比如被禁用,黑名单,离职等原因而不能登录的,而不是服务端的账号密码错误导致不能登录的.
         * 那么对于服务端来说,客户端是登录成功的,所以如果客户端不调用服务端的退出接口,那么就会出现客户端一直无法重新进入登录页面。
         */
        casFilter.setFailureUrl("http://sso.cas.com:8080/cas/logout?service=http://a.cas.com:8081/fail.html");
        return casFilter;
    }

    //cas的登出过滤器
    public LogoutFilter logoutFilter(){
        LogoutFilter logoutFilter = new LogoutFilter();
        //退出重定向后,跳转到本系统的首页
        logoutFilter.setRedirectUrl("http://sso.cas.com:8080/cas/logout?service=http://a.cas.com:8081/index.html");
        return logoutFilter;
    }

    /**
     * 自定义 Realm
     * @return
     */
    @Bean
    public AdminRealm adminRealm(){
        AdminRealm adminRealm = new AdminRealm();
        //cas服务器地址
        adminRealm.setCasServerUrlPrefix("http://sso.cas.com:8080/cas");
        //当前服务的地址,必须要加上 shiro-cas,和上面 shiroFilter登录地址,filterChainDefinitionMap.put("/shiro-cas", "casFilter"),这里三个地方要一样
        adminRealm.setCasService("http://a.cas.com:8081/shiro-cas");
        return adminRealm;
    }

    /**
     * 开启Shiro的注解(如@RequiresRoles,@RequiresPermissions),需借助SpringAOP扫描使用Shiro注解的类,并在必要时进行安全逻辑验证
     * 配置以下两个bean(DefaultAdvisorAutoProxyCreator和AuthorizationAttributeSourceAdvisor)即可实现此功能
     * @return
     */
    @Bean
    public DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator(){
        DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();
        advisorAutoProxyCreator.setProxyTargetClass(true);
        return advisorAutoProxyCreator;
    }
    /**
     * 开启shiro aop注解支持.
     * 使用代理方式;所以需要开启代码支持;
     * @param securityManager
     * @return
     */
    @Bean
    public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(org.apache.shiro.mgt.SecurityManager securityManager){
        AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
        authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
        return authorizationAttributeSourceAdvisor;
    }
    /**
     * 开启jsp/html页面的注解
     * @return
     */
    @Bean
    public ShiroDialect shiroDialect(){
        return new ShiroDialect();
    }

}

AdminRealm

package com.example.casclient.shiro;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
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 java.util.ArrayList;
import java.util.List;

public class AdminRealm extends CasRealm {

    /**
     * 设置角色和权限信息
     */
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        System.out.println("=============5");
        String username = (String) principals.getPrimaryPrincipal();
        //根据用户名从数据库查询用户信息
        System.out.println("2根据用户名从数据库查询用户信息:"+username);
        if (username != null) {
            SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
            //查询获取用户拥有的角色

            //添加权限
            List<String> permissions = new ArrayList<>();
            permissions.add("user:list");
            permissions.add("user:update");
            authorizationInfo.addStringPermissions(permissions);
            return authorizationInfo;
        } else {
            return null;
        }
    }


    /**
     * CAS认证 ,验证用户身份
     * 将用户基本信息设置到会话中
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) {
        System.out.println("=============4");
        //调用CasRealm实现的认证方法,其包含验证ticket、填充CasToken的principal等操作)
        AuthenticationInfo authc = super.doGetAuthenticationInfo(token);
        Object primaryPrincipal = authc.getPrincipals().getPrimaryPrincipal();
        if (primaryPrincipal == null){
            return null;
        }
        //用户名
        String username = (String) primaryPrincipal;
        System.out.println("1根据用户名从数据库查询用户信息:"+username);
        if (username != null) {
            //将用户信息放在session
            SecurityUtils.getSubject().getSession().setAttribute("user", username);
            /*if (1 == 1){
                throw new AuthenticationException("msg:该帐号禁止登录");
            }*/
            return authc;
        }
        return null;
    }

    @Override
    protected void clearCachedAuthorizationInfo(PrincipalCollection principals) {
        System.out.println("=============3");
        super.clearCachedAuthorizationInfo(principals);
    }

    @Override
    protected void clearCachedAuthenticationInfo(PrincipalCollection principals) {
        System.out.println("=============2");
        super.clearCachedAuthenticationInfo(principals);
    }

    @Override
    protected void clearCache(PrincipalCollection principals) {
        System.out.println("=============1");
        super.clearCache(principals);
    }
}

 HomeController

package com.example.casclient.controller;

import org.apache.shiro.authz.annotation.Logical;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Controller
public class HomeController {

    //首页,不需要权限
    @GetMapping("/index.html")
    public String home(){
        return "index";
    }

    //详情,需要登录
    @GetMapping("/details.html")
    public String details(){
        return "details";
    }

    //登录失败
    @GetMapping("/fail.html")
    public String fail(HttpServletRequest request){
        Object assertion = request.getSession().getAttribute("user");
        System.out.println("登录失败,失败原因:"+assertion);
        return "fail";
    }

    //获取用户信息
    @ResponseBody
    @RequiresPermissions(value = {"user:info","user:update"},logical = Logical.OR)//资源权限的注解
    @PostMapping("/userInfo")
    public List<Map<String,String>> userInfo(HttpServletRequest request, String userName){
        //从session中获取登录用户的信息,这个地方是在自定义的realm中把用户信息存在session中的.
        Object assertion = request.getSession().getAttribute("user");
        System.out.println("===========assertion:"+assertion);
        System.out.println("==========userName:"+userName);
        List<Map<String,String>> list = new ArrayList<>();
        Map<String,String> map = new HashMap<>();
        map.put("userName","小王");
        map.put("gender","男");
        map.put("age","25");
        list.add(map);
        Map<String,String> map1 = new HashMap<>();
        map1.put("userName","小红");
        map1.put("gender","女");
        map1.put("age","21");
        list.add(map1);
        return list;
    }

}

启动类:CasClientApplication

package com.example.casclient;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.util.ResourceUtils;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

@SpringBootApplication
public class CasClientApplication extends WebMvcConfigurationSupport {

    public static void main(String[] args) {
        SpringApplication.run(CasClientApplication.class, args);
    }

    // 配置静态资源文件路径
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**").addResourceLocations("classpath:/resources/")
                .addResourceLocations("classpath:/static/").addResourceLocations("classpath:/public/");
        super.addResourceHandlers(registry);
    }
}

index.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript" src="/jquery.min.js"></script>
</head>
<body>
<h1>淘宝</h1>
    <span>这里是首页,不需要登录</span><br/><br/>
    <a href="http://a.cas.com:8081/details.html">详情</a>
</body>
</html>

details.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript" src="/jquery.min.js"></script>
</head>
<body>
<h1>淘宝</h1>
    <span>这里是详情页面,需要登录</span><br/><br/><br/>

    <!--通过资源来控制权限-->
    <shiro:hasPermission name="user:list">
        <p>用户必须有[user:list]的权限才可以看见这里的内容</p><br/>
        <button id="_button">获取用户信息</button>
        <br/><br/>
        <div>
            <table>
                <tr>
                    <td>姓名</td>
                    <td>性别</td>
                    <td>年龄</td>
                </tr>
                <tbody id="_tbody"></tbody>
            </table>
        </div>
    </shiro:hasPermission>
    <br/><br/><br/><br/>
    <a href="/logout">退出</a><!--这个接口已经被cas的退出过滤器拦截了-->
</body>
<script>
    $("#_button").click(function (){
        $.ajax({
            type: "post",
            url:"/userInfo",
            data: {userName:"呵呵呵"},
            success: function (res) {
                alert(JSON.stringify(res));
                var _html = "<tr>";
                for (i=0;i<res.length;i++){
                    _html += "<td>"+res[i].userName+"</td>";
                    _html += "<td>"+res[i].gender+"</td>";
                    _html += "<td>"+res[i].age+"</td>";
                    _html += "</tr>";
                }
                $("#_tbody").html(_html);
            }
        });
    });
</script>
</html>

fail.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>淘宝</h1>
  <span>登录失败</span><br/><br/><br/>
    <a href="http://sso.cas.com:8080/cas/login?service=http://a.cas.com:8081/shiro-cas">重新登录</a><br/><br/>
</body>
</html>

配置文件就是一个端口号

server.port=8081

html文件中,有个jquery的js文件,需要引用下。

Springboot整合Shiro 测试(该用户没有export功能,输入地址出现这个)修改ShiroConfig(前面代码弄过了)创建LoginFilter。 阅读详情

相关推荐

Springboot+shiro+cas单点登录环境搭建

Springboot+shiro+cas单点登录环境搭建 最近这段时间忙好久没有写博客了,现在给大家上点干货,废不多说了, 1.首先在pom.xml中添加依赖 &amp;amp;lt;dependency&amp;amp;gt; &amp;amp;lt;groupId&amp;amp;gt;org.apache.shiro&amp;amp;lt;/groupId&amp;amp;gt; &amp;amp;lt;ar

技术交流,共同进步 1万+

springmvc + shiro整合 cas(记录一下)

springMVC + shiro 整合CAS

xcnaabb的博客 721

CAS单点登录-客户端集成(shiro、springboot、jwt、pac4j)(十)

CAS单点登录-客户端集成(shiro、springboot、jwt)(十) 由于我们通常在业务上会有以下的使用场景: 移动端通过业务系统鉴权 移动端免登录(登录一次以后) 解决方案: JWT(token认证方案) OAuth(第三方认证) PS:若想继续往下读,必须具备JWT的基本概念以及Pac4j的认证原理及应用场景 疑问 当然我们这章是讲JWT,那么会有以下的疑问: 若服务端已经接入了SSO,那么在移

悟空、的博客园 3万+

Springboot 集成 Shiro 和 CAS 实现单点登录(客户端)

前言这里我先要说明一下,我们的项目架构是Springboot+Shiro+Ehcache+ThymeLeaf+Mybaits,在这个基础上,我们再加入了CAS单点登录,虽然前面的框架看着很...

天行健,君子以自强不息;地势坤,君子以厚德载物。 4294

springBoot+shiro+cas基于sso单点登录(一)

单点登录:简称SSO,SSO使得在多个应用系统中,用户只需要登录一次就可以访问所有互相信任的应用系统 CAS框架:CAS是实现单点登录的框架。 结构:cas分为两个部分,CAS SERVER 和 CAS Client 需要独立部署,主要负责对用户的认证工作,Cas Client 负责对客户端保护资源的请求,需要登录的时候,重定向到CAS Server 执行流程: 1:Web Browser...

weixin_45863786的博客 824

多任务学习中的过拟合陷阱:动态停止训练机制详解与避坑指南

本文深入剖析了多任务学习中因任务过拟合不同步导致的性能下降问题,并详细介绍了动态停止-继续训练机制。该机制通过为每个任务设置独立的训练开关,基于验证集性能动态控制其梯度更新,有效缓解了任务间负迁移,是提升多任务模型整体泛化能力的关键策略。

happy2的博客 1092

springboot+shiro+cas5.2实现SSO单点登录(超详细)

一、下载cas的服务端cas-overlay-template,这里我用的是5.2版本,JDK用的1.8 二、进入到解压后的cas-overlay-template-master文件夹,使用maven命令打包,打包比较慢,建议maven仓库换成阿里云的提升速度 mvn clean package 三、打包完后会出现target文件夹,里面有cas.war文件 四 ...

Z丶royAl的博客 1万+

Arduino程序设计(八)LCD显示实验

本文主要介绍温度/温湿度传感器的LCD显示实验,分别是:1、LM35采集环境温度LCD显示;2、DS18B20采集环境温度LCD显示;3、DHT11采集环境温湿度LCD显示。(1)LM35介绍LM35特性特性说明基本功能LM35作为常用的温度传感器,可以检测周围的温度工作原理利用感温材料,通过内部电路将温度值转化为对应的电压信号工作电压4~30V,常用5V供电温度测量测量范围0~100℃ ,误差 ±0.5℃输出信号线性模拟信号输出,LM35输出电压和摄氏温度程线性关系。

Alice的博客 6711

springboot + shiro + cas 实现 登录 + 授权 + sso单点登录 (三)

一、host文件 host文件配置DNS映射 127.0.0.1 sso.maple.com 二、Tomcat配置SSL 1、生成证书 keytool -genkey -alias ssodemo -keyalg RSA -keysize 1024 -keypass 123456 -validity 365 -keystore D:\beijing\develop\apache-tom...

蓝天之枫 8685

基于奥比中光Orbbec Astra Pro与ROS实现实时3D环境建模:orb_slam2实战指南

本文提供了一份详细的实战指南,介绍如何使用奥比中光Orbbec Astra Pro深度摄像头与ROS系统,部署并运行ORB-SLAM2算法,实现实时3D环境建模与定位。内容涵盖从驱动安装、环境配置、算法编译到摄像头标定与性能调优的全流程,旨在帮助开发者快速搭建一套高性价比的视觉SLAM系统。

weixin_29054399的博客 334

用友U8自定义按钮开发:从基础配置到实战业务集成

本文详细介绍了用友U8自定义按钮开发的完整流程,从基础配置到实战业务集成。通过实际案例演示如何在U8系统中添加和替换功能按钮,包括数据库配置、SQL脚本编写和VB组件开发等关键技术点,帮助企业用户实现业务场景的深度定制。

weixin_29698641的博客 256

springboot + shiro + cas 实现 登录 + 授权 + sso单点登录 (四)

springboot + shiro + cas 实现 登录 + 授权 + sso单点登录 (一) springboot + shiro + cas 实现 登录 + 授权 + sso单点登录 (二) springboot + shiro + cas 实现 登录 + 授权 + sso单点登录 (三) 上篇文章我们使用cas-server和cas-client测试SSO单点登录的功能,...

蓝天之枫 7554

手把手教你用ESP32-S3打造智能聊天机器人-立创实战派

本文将详细介绍如何利用立创ESP32-S3开发板,烧录小智AI程序,快速实现一个功能强大的聊天机器人。

举世誉之而不加劝,举世非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。 9911

springboot + shiro + cas 实现 登录 + 授权 + sso单点登录 (六)

springboot + shiro + cas 实现 登录 + 授权 + sso单点登录 (一) springboot + shiro + cas 实现 登录 + 授权 + sso单点登录 (二) springboot + shiro + cas 实现 登录 + 授权 + sso单点登录 (三) springboot + shiro + cas 实现 登录 + 授权 + sso单点登录 ...

蓝天之枫 4477

《Claude Code 实战》第 1 章:开启智能编程新纪元——初识 Claude Code

简单来说,Claude Code 是 Anthropic 公司推出的一款基于 Claude 3.7 Sonnet 等大语言模型的强大编程工具。但与传统的 ChatGPT 或普通的聊天机器人不同,Claude Code 具备了"动手"的能力。它不仅会"说",更会"做"。想象一下,你不再需要描述复杂的命令行参数,也不需要为了修改一个配置文件而频繁切换编辑器。Claude Code 可以直接读取你项目中的文件、理解复杂的代码库结构、执行终端命令,并直接为你生成或修改代码。

AI天才研究院 244

【服务器电源架构与关键技术发展趋势】深度解析架构、方案、玩家与未来趋势

技术维度:台达 / 光宝在高功率密度(97%+ 效率)和垂直整合上领先,大陆厂商(麦格米特 / 欧陆通)在成本控制和快速响应上更优,国际厂商(英飞凌)聚焦核心器件突破。 客户维度:台达绑定英伟达核心供应链,麦格米特 / 欧陆通兼顾国内外客户,光宝 / 中恒电气侧重云端与互联网厂商。 趋势适配:所有厂商均加速布局 800V 高压架构、液冷技术和高功率 Power Shelf,以应对 AI 服务器单柜功率从 10kW→200kW 的升级需求。

昔时扬尘处 723

基于SpringbootShiro实现的CAS单点登录

单点登录(Single Sign On,SSO)是一种登录管理机制,主要用于多系统集成,即在多个系统中,用户只需要到一个中央服务器登录一次即可访问这些系统中的任何一个,无须多次登录。常见的例子就是,当我们在淘宝网上登录了之后,如果再访问天猫网的话是不需要再次登录的。

神尐破 4557

基于 YOLO26 的车辆实时检测与计数系统

本文提出了一种基于YOLO26的车辆实时检测与计数系统。系统采用CSPDarknet53作为主干网络,结合特征金字塔和多尺度预测实现高精度车辆检测。通过DeepSORT算法进行目标跟踪,并统计车辆数量、行驶方向和交通流量。实验表明,该系统在保持实时性能的同时,检测精度达到92.3%,可有效应用于智能交通管理。系统采用Python实现,支持GPU加速,适用于多种交通场景下的车辆监测需求。

一键难忘的博客 907

springboot+shiro+cas5.2通过RESTful协议进行sso单点登录

单点登录基本配置可以参考上一篇springboot+shiro+cas5.2实现SSO单点登录(超详细) 使用RESTful协议可以不改动原本的cas服务端,用之前项目的登录页,进行sso单点登录 一、在cas服务端pom.xml里添加rest的jar包(我是在压缩文件的pom.xml里添加的,然后重新mvn clean package打包) <dependency> ...

Z丶royAl的博客 6571

怀旧版电脑GBC模拟器

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

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

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

springboot + shiro + cas 实现 登录 + 授权 + sso单点登录 (二)

本篇文章我们将使用 springboot + redis + shiro 开发 角色 + 权限 功能。 1、新建一个maven+springboot项目,我的工程结构为: sso_login 是一个maven工程,里面有两个module,分别是 member 和 order 两个 springboot 的项目,member 主要是登录相关,order主要是以后为了测试 从member系统单...

蓝天之枫 1万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

CAS 4.2.7系列之客户端对接(三)

CAS(Center Authentication Service)是耶鲁大学研究的一款开源的单点登录项目,主要为web项目提供单点登录实现 CAS体系结构分为CAS Server和CAS Client。 CAS Server就是Cas开源的,需要去github下载,然后进行修改;Cas Client 可以是App或者web端的或者PC端,CAS支持多种开发语言,java、php、C#等等

Nicky's blog 4075

VC中sqlite的使用

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

Spring Boot shiro+cas单点登录

Spring Boot shiro+cas单点登录搭建Cas服务器客户端pom.xml继承CasRealmapplication.ymlUrlBeanShiroConfig遗留问题??? 项目架构 2.1.11.RELEASE 项目源码 https://github.com/jsong93/Spring-Boot-shiro-cas-sso.git 根据SpringMVC项目改写 SpringMV...

宋大王的博客 1258

springboot + shiro + cas 实现 登录 + 授权 + sso单点登录 (一)

背景: 1、每家公司基本都会有自己的管理平台,说到管理平台就离不开 角色,权限等问题,避免越权问题。所以我们引入shiro来解决这个问题,为什么用shiro呢?因为他功能全,开发简单。 2、每家公司基本都不只一个管理平台,可能有很多个,如果我们登录每个平台都需要输入账号密码的话,那也太麻烦了吧。所以我们引入cas来做sso单点登录,意思就是,我只要登录了一个管理平台,从这个平台里跳到另外一个平...

蓝天之枫 8287

springboot + vue + shiro + jwt + pac4j-cas实现前后端分离单点登录

1、pom.xml文件添加: <!--单点登录--> <dependency> <groupId>org.pac4j</groupId> <artifactId>pac4j-cas</artifactId> <version>3.0.2</version> </dep...

loveampzw的博客 7735

springboot 整合shiro + cas 实现单点登录权限管理(一)(sso)

简介 本项目将单点登录和权限认证结合在一起,实现了用户登录与授权的基础框架,后续可以很好的在此框架上进行二次开发 在原理和配置上也有很多不清楚的地方,希望大家留言讨论~ 后续将会进行spring cloud系列工程的搭建,并将shiro-cas尝试接入spring cloud中 spring cloud系列直达地址 spring cloud 项目源码见最底部 准备:cas服务器搭建 单点登...

qq_27221711的博客 1391

基于Spring boot的CAS单点登录项目改造

背景 最近换了份工作,入职第一个任务就是把一个Spring boot项目改造成SSO单点登录,之前没有接触过单点登录,上来就项目改造真的是压力山大啊,用了五天连摸索带学习总算改成了,目前来看应该没啥问题。 项目结构 ...

cdmalg的博客 1738
上一篇: SSO单点登录(二)SpringBoot创建CAS客户端
下一篇: CAS5.3服务端配置,链接mysql、自定义密码加密、登录页面、登录校验,自定义异常、ajax登录等
呵呵菜鸟
博客等级 码龄10年 92粉丝 115原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值