Spring Boot 3.x + Spring Security OAuth2实战:构建高安全权限系统的5大核心要点

Spring Boot 3 极速搭建OAuth2认证框架 使用 Spring Authorization Server 的较高版本,简单的状况只需要在 application.yml 配置就可以实现认证服务器, 如果要更详细的配置,也可以定义 SecurityConfig.java 进行配置。Spring Authorization Server支持四种授权方式, 简单起见,这里使用 客户端模式(Client Credentials),这种模式使用在API调用的授权上,这里使用 Postman进行验证。定义一个REST的控制器,并且写一个简单的映射方法。 阅读详情

第一章:Spring Boot 3.x 企业级应用开发最佳实践

在构建现代化企业级应用时,Spring Boot 3.x 提供了强大的基础设施支持与开发便利性。通过合理的设计模式与配置策略,可显著提升系统的可维护性、性能与安全性。

使用 Jakarta EE 替代 Java EE

Spring Boot 3.x 正式迁移至 Jakarta EE 9+,所有相关注解需更新命名空间。例如,@javax.persistence.Entity 应替换为 @jakarta.persistence.Entity:
// 使用 Jakarta Persistence 注解
import jakarta.persistence.Entity;
import jakarta.persistence.Id;

@Entity
public class User {
    @Id
    private Long id;
    private String name;
    // getter 和 setter 省略
}

启用原生镜像支持(GraalVM)

Spring Boot 3 集成 Spring Native,支持将应用编译为原生镜像,大幅提升启动速度并降低内存占用。需添加依赖并使用 GraalVM 构建:
# 安装 GraalVM 后执行
./mvnw -Pnative native:compile

统一异常处理机制

推荐使用 @ControllerAdvice 实现全局异常处理,确保 API 返回格式一致:
@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(ResourceNotFoundException.class)
    public ResponseEntity<String> handleNotFound(Exception e) {
        return ResponseEntity.status(404).body("资源未找到: " + e.getMessage());
    }
}

配置管理最佳实践

优先使用 application.yml 组织多环境配置,并结合 Profile 进行隔离:
Profile用途配置文件
dev本地开发application-dev.yml
prod生产环境application-prod.yml
  • 避免在代码中硬编码配置项
  • 敏感信息应通过环境变量注入
  • 使用 @ConfigurationProperties 绑定复杂配置对象

第二章:OAuth2安全架构设计与核心组件解析

2.1 OAuth2协议在Spring Security中的演进与整合

随着微服务架构的普及,Spring Security对OAuth2的支持经历了从零散集成到原生支持的重大演进。早期开发者需依赖Spring Security OAuth项目手动配置授权服务器与资源服务器,代码冗余且易出错。
配置方式的演进
自Spring Security 5.7起,@EnableAuthorizationServer等注解被弃用,官方推荐使用标准组件构建授权流程,强调模块化与安全性。

@Bean
public RegisteredClientRepository registeredClientRepository() {
    RegisteredClient client = RegisteredClient.withId("client-1")
        .clientId("demo-client")
        .clientSecret("{noop}secret")
        .scope("read")
        .redirectUri("http://localhost:8080/login/oauth2/code/demo")
        .build();
    return new InMemoryRegisteredClientRepository(client);
}
上述代码定义了一个内存注册客户端,用于OAuth2登录流程。其中clientSecret使用{noop}前缀表示明文存储,适用于测试环境;redirectUri指定了回调地址,确保授权码流程安全完成。该模式取代了旧版XML或JavaConfig中复杂的Endpoint配置,提升了可维护性。
核心优势
  • 标准化客户端注册流程
  • 增强对OpenID Connect的支持
  • 更清晰的安全边界划分

2.2 授权服务器与资源服务器的职责划分与实现

在OAuth 2.0架构中,授权服务器与资源服务器承担不同的安全职责。授权服务器负责用户身份认证与令牌发放,而资源服务器则专注于保护受控资源并验证访问令牌的有效性。
职责分工
  • 授权服务器:处理登录、授权请求,生成JWT或Opaque Token
  • 资源服务器:接收携带Token的请求,调用授权服务器的校验接口或本地解析JWT
令牌验证示例(Go)
func validateToken(tokenString string) (*jwt.Token, error) {
    return jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
        if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
            return nil, fmt.Errorf("unexpected signing method")
        }
        return []byte("secret-key"), nil // 签名密钥
    })
}
该函数解析并验证JWT签名,确保请求来自合法授权服务器。资源服务器通过此机制判断是否放行API访问。
通信流程示意
用户 → 授权服务器: 获取Token
用户 → 资源服务器: 携带Token请求资源
资源服务器 → 授权服务器: 校验Token有效性
资源服务器 → 用户: 返回数据或拒绝访问

2.3 使用JWT增强令牌安全性与无状态认证实践

在分布式系统中,传统基于Session的认证机制难以横向扩展。JSON Web Token(JWT)通过将用户信息编码至令牌中,实现服务端无状态验证,显著提升系统可伸缩性。
JWT结构解析
JWT由三部分组成:头部(Header)、载荷(Payload)和签名(Signature),以点号分隔。例如:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
其中Header定义算法类型,Payload携带声明信息,Signature确保令牌完整性。
安全实践建议
  • 使用强密钥进行HMAC签名,避免弱算法如HS256配合短密钥
  • 设置合理的过期时间(exp),结合刷新令牌机制提升安全性
  • 敏感操作应额外校验IP或设备指纹
通过合理配置,JWT可在保障安全的同时实现高效无状态认证。

2.4 客户端凭证模式与授权码模式的企业级配置

在企业级系统集成中,选择合适的OAuth 2.0授权模式至关重要。客户端凭证模式适用于服务间可信通信,而授权码模式则面向用户参与的场景,保障了令牌的安全分发。
客户端凭证模式配置示例
{
  "client_id": "backend-service-01",
  "client_secret": "encrypted-secret-key",
  "grant_type": "client_credentials",
  "scope": "api.read api.write"
}
该配置用于微服务间调用,通过预注册的client_id和client_secret获取访问令牌,不涉及用户身份,适合后台任务执行。
授权码模式核心流程
  1. 用户重定向至认证服务器
  2. 用户登录并授权应用访问
  3. 服务端接收授权码并换取令牌
  4. 使用Access Token调用资源接口
此流程通过中间授权码防止令牌暴露,提升安全性,适用于Web与移动端应用。
两种模式对比
特性客户端凭证模式授权码模式
适用场景服务间通信用户级应用
是否需用户授权否是
安全性等级中高

2.5 自定义用户详情服务与动态权限加载机制

在复杂系统中,静态权限模型难以满足灵活的业务需求。通过实现 UserDetailsService 接口,可自定义用户信息加载逻辑,从数据库或远程服务中获取用户凭证与角色。
自定义用户详情服务实现
public class CustomUserDetailsService implements UserDetailsService {
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        User user = userRepository.findByUsername(username);
        if (user == null) throw new UsernameNotFoundException("用户不存在");
        return new org.springframework.security.core.userdetails.User(
            user.getUsername(),
            user.getPassword(),
            getAuthorities(user.getRoles())
        );
    }

    private Collection getAuthorities(Set roles) {
        return roles.stream()
            .map(role -> new SimpleGrantedAuthority("ROLE_" + role.getName()))
            .collect(Collectors.toList());
    }
}
上述代码重写了 loadUserByUsername 方法,从持久层获取用户并构造具备权限的角色集合,确保认证流程集成业务逻辑。
动态权限加载策略
使用 FilterInvocationSecurityMetadataSource 可实现请求级别的权限动态判定,结合缓存机制提升性能,避免频繁查询数据库。

第三章:基于RBAC的细粒度权限控制实现

3.1 领域驱动的权限模型设计与数据库结构规划

在复杂业务系统中,基于领域驱动设计(DDD)构建权限模型可有效解耦安全控制与核心逻辑。通过识别限界上下文,将权限划分为角色、资源与操作三个核心维度。
核心数据表结构
字段名类型说明
role_idBIGINT角色唯一标识
resource_typeVARCHAR资源类型,如订单、用户
actionENUM允许的操作:read/write/delete
权限校验代码片段

// CheckPermission 检查用户在指定资源上是否具备操作权限
func (s *AuthService) CheckPermission(userID int64, resource string, action string) bool {
    roles := s.GetUserRoles(userID)
    for _, role := range roles {
        if perm := s.GetPermission(role.ID, resource, action); perm.Allowed {
            return true
        }
    }
    return false
}
该函数首先获取用户关联的角色集合,再逐个查询对应角色在目标资源上的操作许可,任一匹配即放行。此设计支持动态权限变更,便于扩展多租户场景。

3.2 方法级安全注解与SpEL表达式实战应用

在Spring Security中,方法级安全通过注解实现细粒度访问控制。常用注解如@PreAuthorize、@PostAuthorize结合SpEL(Spring Expression Language)表达式,可在方法执行前后动态判断权限。
基于角色的访问控制
@PreAuthorize("hasRole('ADMIN')")
public void deleteUser(Long id) {
    // 删除用户逻辑
}
该配置确保仅拥有ADMIN角色的用户可调用此方法。SpEL中的hasRole()自动匹配Spring Security上下文中的授权信息。
参数化权限校验
更复杂的场景可引用方法参数进行安全判断:
@PreAuthorize("#userId == authentication.principal.id")
public User getUserProfile(Long userId) {
    return userRepository.findById(userId);
}
此处SpEL表达式#userId引用方法入参,与当前认证主体ID比对,实现数据访问隔离。
  • SpEL支持authentication、principal等内置变量
  • 方法参数可通过#参数名直接引用
  • 支持逻辑运算符组合复杂条件

3.3 多租户环境下的权限隔离策略与实现

在多租户系统中,确保不同租户间的数据与操作权限相互隔离是安全架构的核心。常见的隔离策略包括数据库级隔离、Schema 隔离和行级标签控制。
基于行级标签的访问控制
通过在数据表中引入 tenant_id 字段,结合查询拦截机制实现逻辑隔离。例如,在 GORM 中使用全局钩子自动注入租户过滤条件:

func TenantHook(db *gorm.DB) {
    if db.Statement.Schema != nil && db.Statement.Schema.LookUpField("TenantID") != nil {
        db.Statement.SetCond("tenant_id = ?", GetCurrentTenantID())
    }
}
db.Callback().Query().Before("gorm:query").Register("tenant_filter", TenantHook)
上述代码在每次查询前自动添加租户条件,确保应用层无法越权访问其他租户数据。
权限模型对比
策略隔离强度成本适用场景
独立数据库高高金融级租户
Shared Schema + Row-level中低SaaS 应用通用场景

第四章:高安全性系统的加固与扩展实践

4.1 防止常见漏洞:CSRF、CORS与点击劫持的应对方案

跨站请求伪造(CSRF)防护
CSRF攻击利用用户已认证的身份发起非预期请求。防御核心是验证请求来源的合法性,常用手段为同步器令牌模式。

app.use((req, res, next) => {
  res.setHeader('X-Frame-Options', 'DENY');
  res.setHeader('X-Content-Type-Options', 'nosniff');
  next();
});

app.post('/transfer', (req, res) => {
  if (req.body.csrfToken !== req.session.csrfToken) {
    return res.status(403).send('Invalid CSRF token');
  }
  // 处理转账逻辑
});
上述代码通过比对表单提交的CSRF令牌与会话中存储的令牌,确保请求来自合法源。同时设置安全响应头,增强整体防护。
CORS与点击劫持控制
合理配置CORS策略,避免开放过多域:

Access-Control-Allow-Origin: https://trusted-site.com
Access-Control-Allow-Credentials: true
配合X-Frame-Options: DENY或Content-Security-Policy: frame-ancestors 'self',有效阻止点击劫持。

4.2 登录行为监控与失败尝试限制的安全策略

登录失败计数机制
为防止暴力破解攻击,系统需记录用户连续登录失败次数。可通过内存缓存(如 Redis)实现高效读写:
// 示例:使用Redis记录失败次数
func incrementFailedAttempts(username string) error {
    key := "login:fail:" + username
    count, _ := redisClient.Incr(ctx, key).Result()
    if count == 1 {
        redisClient.Expire(ctx, key, time.Minute*15) // 首次失败设置过期时间
    }
    return nil
}
该逻辑通过原子递增操作确保并发安全,并在首次失败时设置15分钟的过期窗口,避免永久封禁。
触发锁定策略
当失败次数超过阈值时,应临时锁定账户或增加验证难度。常见策略如下:
  • 连续5次失败后锁定账户15分钟
  • 第3次起引入图形验证码
  • 基于IP地址的全局失败频率限制
此类分层防御机制可在保障用户体验的同时有效抵御自动化攻击。

4.3 刷新令牌机制与单点登录会话管理

在现代身份认证体系中,刷新令牌(Refresh Token)机制有效平衡了安全性与用户体验。访问令牌(Access Token)通常有效期较短,而刷新令牌则用于在不重新输入凭证的情况下获取新的访问令牌。
刷新令牌的基本流程
  • 用户首次认证后,服务器返回访问令牌和刷新令牌
  • 访问令牌过期后,客户端使用刷新令牌请求新令牌
  • 服务端验证刷新令牌合法性并签发新访问令牌
{
  "access_token": "eyJhbGciOiJIUzI1NiIs...",
  "refresh_token": "rt_7d8e2f9a0b1c3d5",
  "expires_in": 3600,
  "token_type": "Bearer"
}
上述响应包含双令牌结构,expires_in表示访问令牌有效时间(秒),刷新令牌通常存储于安全的持久化存储中。
单点登录中的会话控制
在多系统集成场景下,中央授权服务器需维护用户全局会话状态。通过建立会话登记表,可实现登出时广播通知各子系统失效本地令牌。
字段说明
session_id全局会话标识
user_id用户唯一ID
client_list已登录客户端列表
last_active最后活跃时间

4.4 与外部身份提供者(如Keycloak、Auth0)集成方案

在现代微服务架构中,统一身份认证是保障系统安全的关键环节。通过集成外部身份提供者(IdP),如 Keycloak 或 Auth0,可实现标准化的 OAuth2 和 OpenID Connect 认证流程。
标准协议支持
主流身份提供者均支持 OpenID Connect 协议,应用只需配置客户端 ID、密钥及令牌端点即可完成对接:
// 示例:Golang 中使用 OIDC 客户端
provider, err := oidc.NewProvider(ctx, "https://keycloak.example.com/auth/realms/demo")
if err != nil {
    log.Fatal(err)
}
verifier := provider.Verifier(&oidc.Config{ClientID: "my-client-id"})
上述代码初始化 OIDC 提供者并创建令牌验证器,ClientID 需与 IdP 控制台注册信息一致。
集成对比表
特性KeycloakAuth0
部署模式支持自托管SaaS 为主
定制能力高(开源)中(受限于平台)

第五章:总结与展望

微服务架构的持续演进
现代企业级应用正加速向云原生转型,微服务架构已成为构建高可用、可扩展系统的核心范式。以某大型电商平台为例,其订单系统通过服务拆分,将库存、支付、物流独立部署,显著提升了故障隔离能力。
  • 服务注册与发现采用 Consul 实现动态节点管理
  • 通过 Istio 实施细粒度流量控制与熔断策略
  • 日志聚合使用 ELK 栈,实现跨服务追踪
代码层面的可观测性增强
在 Go 语言实现的服务中,集成 OpenTelemetry 可自动采集调用链数据:

func setupTracing() {
    exporter, _ := stdouttrace.New()
    provider := sdktrace.NewTracerProvider(
        sdktrace.WithSampler(sdktrace.AlwaysSample()),
        sdktrace.WithBatcher(exporter),
    )
    otel.SetTracerProvider(provider)
}
未来技术融合方向
技术领域当前挑战解决方案趋势
边缘计算低延迟需求轻量级服务网格(如 Linkerd2-proxy)
AI 工程化模型版本管理复杂MLflow + 微服务 API 封装
[Service A] --HTTP--> [API Gateway] --gRPC--> [Service B] | [Jaeger Collector]
保姆级教程:在RK3588开发板上编译带MPP硬件加速的FFmpeg(含完整依赖库配置) 本文提供在RK3588开发板上编译支持MPP硬件加速的FFmpeg的详细教程,涵盖交叉编译环境搭建、MPP框架及依赖库配置,最终实现4K视频硬件编解码性能优化。通过实战步骤和性能对比,展示如何充分发挥RK3588的硬件加速能力。 阅读详情

相关推荐

手把手教你复现KDD 2024时空预测顶会论文:以UniST和ImputeFormer为例的代码实战与避坑指南

本文详细指导如何复现KDD 2024顶会论文中的UniST和ImputeFormer模型,涵盖环境配置、数据处理、模型训练及评估等关键步骤。通过实战案例和避坑指南,帮助研究者掌握时空预测与插补技术,提升在智慧城市、交通管理等领域的应用能力。

weixin_29204205的博客 279

Springboot 3 + Spring Security 6 + OAuth2 入门级最佳实践

当我的项目基于 SpringBoot 3 而我想使用Spring Security,最终不幸得到WebSecurityConfigurerAdapter被废弃的消息。本文档就是在这样的情况下产生的。

m0_64469199的博客 2万+

Unity3D Pico VR 手势交互实战:基于MRTK3实现抓握与射线控制

本文针对Pico VR原生手势交互功能不足的问题,提供了基于MRTK3实现高级手势交互的实战解决方案。通过将MRTK3成熟的交互框架与Pico的手势追踪能力相结合,详细讲解了从环境配置、SDK导入、核心适配到真机调试的全流程,帮助开发者高效实现抓握与射线控制等复杂交互,有效提升Pico VR应用的开发效率与体验。

weixin_29011667的博客 391

SpringBoot3.0 + SpringSecurity6.0 +OAuth2 使用Github作为授权登录

开放授权(OAuth)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用。 OAuth允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据。过程如下: (A)用户打开客户端以后,客户端要求用户给予授权。 (B)用户同意给予客户端授权。 (C)客户端使用上一步获得的授权,向认证服务器申请令牌。 (D)认证服务器对客户端进行认证以后,确认无误,同意发放令牌。 (E)客户端使用令牌,向资源服务器申请获

weixin_46076174的博客 4009

突发环境事件怎么模拟?用Python+GIS实现高斯烟团模型(附完整代码)

本文详细介绍了如何利用Python与GIS技术实现高斯烟团模型,用于模拟化工泄漏等突发环境事件的动态扩散过程。通过核心原理讲解、参数快速获取方案、Python代码实现及GIS可视化集成,为环境应急人员提供了一套完整的解决方案。特别适合危险品运输事故等瞬态污染场景的应急决策支持。

weixin_33692284的博客 485

ERA5数据批量下载

ERA5再分析数据的IDM接管下载

qq_38734327的博客 3034

Spring Boot 最新版3.x 集成 OAuth 2.0实现认证授权服务、第三方应用客户端以及资源服务

Spring Boot 3已经发布一段时间,网上关于Spring Boot 3的资料不是很多,本着对新技术的热情,学习和研究了大量Spring Boot 3新功能和新特性,感兴趣的同学可以参考Spring官方资料全面详细的新功能/新改进介绍新特性有很多,本文主要针对OAuth 2.0的集成,如果快速开发自己的认证授权服务、OAuth客户端以及资源服务新建三个服务,分别对应认证授权服务、OAuth客户端以及资源服务Spring发布了spring-security-oauth2-authorization-se

Java技术栈,分享不断学习、不断超越、不断积累的历程! 2万+

从零搭建Obsidian智能知识库:Ollama本地模型与Copilot插件实战指南

本文详细介绍了如何从零搭建Obsidian智能知识库,结合Ollama本地模型与Copilot插件实现高效知识管理。通过本地部署AI助手,用户可以在保证隐私安全的同时,快速检索和整理笔记,提升工作效率。文章涵盖硬件准备、Ollama部署、插件配置及实战技巧,适合需要高效知识管理的专业人士。

weixin_29230773的博客 631

Spring Boot 整合 OAuth2 详细教程(适用于 2025 年 Spring Boot 3.x)

Spring Boot 3.x整合OAuth2实现GitHub登录 本文介绍了如何在Spring Boot 3.x环境中整合OAuth2协议,实现GitHub第三方登录功能。主要内容包括: 开发环境准备(Java 17+、Spring Boot 3.3.x) 项目创建与OAuth2客户端依赖配置 GitHub开发者平台OAuth应用注册流程 Spring Security的安全配置类编写 控制器与Thymeleaf页面模板实现 通过本教程,开发者可以快速掌握使用Spring Security OAuth2

2503_92145588的博客 3673

无需Python环境!纯C#上位机+OpenCVSharp4+ONNX Runtime实现YOLOv8摄像头实时流检测,工业级稳定

摘要 工业自动化C#开发中,传统Python方案实现视觉检测功能存在环境依赖、内存泄漏和性能不稳定等问题。本文提出基于.NET 8+OpenCVSharp4+ONNX Runtime的纯C#方案,通过实际案例验证其优势: 零Python依赖,支持离线部署 内存稳定(380MB/72h),检测延迟<80ms 检测精度达漏检率<0.1%,误检率<0.5% 保留原有业务逻辑代码,3天完成适配 方案采用分层架构设计,支持多种硬件平台和操作系统,提供从模型导出到部署的全流程指导,为工业视觉检测提供高

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 196

关于 SAP UI5 应用 url 中的特殊符号 # 的作用介绍

符号在 SAP UI5 的 URL 中不仅仅是一个分隔符,更是动态路由、状态管理和深链接的关键所在。通过合理使用,开发者可以实现高效、流畅的用户体验,同时保持系统的可维护性和扩展性。通过 SAP UI5 提供的灵活路由机制,企业应用可以轻松实现复杂导航需求,同时为用户提供直观的交互体验。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 407

Spring之Spring Security

Spring Security是Spring生态中最成熟的安全框架,提供认证(Authentication)和授权(Authorization)两大核心能力。它基于Servlet过滤器链实现,与Spring MVC深度集成,支持从传统Session到JWT/OAuth2的多种安全方案。 1.3 两大核心能力 能力 说明 核心接口 认证(Authentication) 验证"你是谁" AuthenticationManager 授权(Authorization) 验证"你能做什么" Aut

萧瑟余晖的博客 230

面向元数据的 SAP UI 中枢:namespace sap.ui.mdc 全景解析

如果把应用前端比作一条数据到交互的装配线,sap.ui.mdc 就是那条线的标准化工装:以 PropertyInfo 描述原料,以 Delegate 定义装配方法,以 p13n 与 VariantManagement 交付面向个体的最终产物;而 Condition Model、Operator 与 ValueHelp 则让输入与筛选的语义落地。与 OData V4 服务与 Fiori Elements 宏构件组合使用时,它能在保持一致体验的同时,给自由式开发者留下足够的可编排空间。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 238

基于springboot3实现单点登录(二):认证服务端搭建

本文介绍了sso服务端的搭建过程。

泽济天下的专栏 2773

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain&#39;s apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath(&#39;DeepLearnToolbox&#39;));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand(&#39;state&#39;,0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W&#39;); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand(&#39;state&#39;,0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = &#39;sigm&#39;;%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, &#39;Too big error&#39;);```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand(&#39;state&#39;,0)sae = saesetup([784 100]);sae.ae{1}.activation_function = &#39;sigm&#39;;sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)&#39;)% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;;nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, &#39;Too big error&#39;);```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x&#39;,28,28,60000))/255;test_x = double(reshape(test_x&#39;,28,28,10000))/255;train_y = double(train_y&#39;);test_y = double(test_y&#39;);%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you&#39;ll get around 1.2% errorrand(&#39;state&#39;,0)cnn.layers = { struct(&#39;type&#39;, &#39;i&#39;) %input layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 6, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %sub sampling layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 12, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, &#39;Too big error&#39;);```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, &#39;Too big error&#39;);%% ex2 neural net with L2 weight decayrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex3 neural net with dropoutrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex4 neural net with sigmoid activation functionrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex5 plotting functionalityrand(&#39;state&#39;,0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = &#39;softmax&#39;; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand(&#39;state&#39;,0)nn = nnsetup([784 20 10]); nn.output = &#39;softmax&#39;; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

SpringBoot 最新版3.x 集成 OAuth 2.0 实现认证授权服务、第三方应用客户端以及资源服务

Spring Boot 3已经发布一段时间,网上关于Spring Boot 3的资料不是很多,本着对新技术的热情,学习和研究了大量Spring Boot 3新功能和新特性,感兴趣的同学可以参考Spring官方资料全面详细的新功能/新改进介绍Spring版本升级到6.xJDK版本至少17+新特性有很多,本文主要针对OAuth 2.0的集成,如果快速开发自己的认证授权服务、OAuth客户端以及资源服务新建三个服务,分别对应认证授权服务、OAuth客户端以及资源服务。

2301_77463738的博客 4339

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Springboot3.x测试JWT、OAuth2

OAuth 是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版。OAuth 在客户端与服务提供者之间,设置了一个授权层(authorization layer)。客户端不能直接访问服务提供者,只能访问授权层,以此将用户与客户端区分开来。客户端携带的令牌(token)用来指定权限范围和有效期,校验通过后,服务提供者根据令牌的权限范围和有效期,向客户端开放对应的资源。

rooney84的博客 3971

SpringBoot 最新版3.x 集成 OAuth 2.0 实现认证授权服务、第三方应用客户端以及资源服务...

前言Spring Boot 3已经发布一段时间,网上关于Spring Boot 3的资料不是很多,本着对新技术的热情,学习和研究了大量Spring Boot 3新功能和新特性,感兴趣的同学可以参考Spring官方资料全面详细的新功能/新改进介绍Spring版本升级到6.xJDK版本至少17+新特性有很多,本文主要针对OAuth 2.0的集成,如果快速开发自己的认证授权服务、OAuth客户端以及资源...

Java知音 4993

SpringBoot安全管理 ——模块3:OAuth 2的简单应用

OAuth 2的简单应用 首先我们了解下什么是 OAuth ,OAuth 是一个开放标准,此标准允许用户让第三方应用访问该用户在某一网站上存储的私密资源(例如头像,照片等),而在这个过程中无须将用户名和密码提供给第三方应用。实现这个功能是通过提供一个令牌 token ,而不是用户名和密码来访问他们存放在特定服务提供者的数据,每一个令牌授权一个特定的网站在特定的时间段内访问特定的资源 OAuth 2...

永远年轻 927

如何在 Spring Boot 中使用 OAuth2

OAuth2 是一种流行的授权协议,用于授权第三方应用程序访问受保护的资源。OAuth2 协议定义了四种角色:资源所有者、客户端、授权服务器和资源服务器。资源所有者是资源的拥有者,客户端是请求访问资源的应用程序,授权服务器是授权客户端访问资源的服务器,资源服务器是托管受保护资源的服务器。客户端向授权服务器发送请求,请求授权访问某个资源。授权服务器向资源所有者询问是否授权客户端访问该资源。如果资源所有者授权客户端访问该资源,则授权服务器向客户端颁发访问令牌。

Java徐师兄的博客 6441

spring-security-oauth2-authorization-server(一)SpringBoot3.1.3整合

因为SpringBoot3.x是目前最新的版本,整合spring-security-oauth2-authorization-server的资料很少,所以产生了这篇文章,主要为想尝试SpringBoot高版本,想整合最新的spring-security-oauth2-authorization-server的初学者,旨在为大家提供一个简单上手的参考,如果哪里写得不对或可以优化的还请大家踊跃评论指正。

weixin_42229668的博客 1万+

Spring Boot 3整合OAuth2实现第三方登录完整指南

Slf4j@Override// 根据不同平台处理用户信息// 添加平台标识// 标准化用户信息= null?@Slf4j@Override// 根据不同的登录来源处理不同逻辑// GitHub特定处理逻辑// 设置默认跳转路径// 实现GitHub用户的特定处理逻辑// 例如保存用户信息到数据库等本文详细介绍了在Spring Boot 3中整合OAuth2实现第三方登录的完整流程。

MenzilBiz的博客 2453

SpringBoot集成OAuth2

最后还准备了一套上面资料对应的面试题(有答案哦)和面试时的高频面试算法题(如果面试准备时间不够,那么集中把这些算法题做完即可,命中率高达85%+)最后还准备了一套上面资料对应的面试题(有答案哦)和面试时的高频面试算法题(如果面试准备时间不够,那么集中把这些算法题做完即可,命中率高达85%+)(img-yYeEoTYk-1712685116249)](img-uv03SJx9-1712685116249)]

2401_84048554的博客 1144

【亲测免费】 Spring Boot 3+ OAuth2 服务器:单点登录认证解决方案

本项目是一个基于Spring Boot 3+的成熟OAuth2服务器实现,专为构建安全的单点登录(SSO)系统设计。它利用了Java作为主要编程语言,结合Spring Boot的现代特性,提供了高性能和易于部署的认证解决方案。项目支持JWT(JSON Web Tokens)用于安全的身份验证和授权信息传递。 ## 核心功能 - **OAuth2认证与授权**: 实现OAuth2标准协议,提供多种...

gitblog_07066的博客 1058

SpringBoot搭建OAuth2

本文描述了通过SpringBoot从无到有的搭建OAuth2服务器的一系列实践过程。其中包括OAuth2的授权方式介绍,测试场景,过程中遇到的困难等,对新接触OAuth2的人有较大帮助。

m0_60681411的博客 3690

03.SpringBoot3+JDK17+Shiro+OAuth2授权方式+JWT

使用Srpingnoot3+JDK17+Shiro+OAuth授权方式+JWT完成认证授权

qq_45145629的博客 3217

Spring Boot 整合 Spring Security + OAuth2

学习在 Spring Boot 中整合 Spring Security 和 OAuth2 。 1 OAuth2 概述 1.1 OAuth2 简介 OAuth 是一个开放标准,该标准允许用户让第三方应用访问该用户在某一网站上存储的私密资源(如头像、照片、视频等),而在这个过程中无需将用户名和密码提供给第三方应用。实现这一功能是通过提供一个令牌(token),而不是用户名和密码来访问他们存放在特定服...

程序员35 6450
上一篇: FastAPI崛起,Django还香吗?:一场关于速度、生态与开发效率的较量
下一篇: 揭秘C++20协程底层原理:从编译器实现到性能优化全解析
ProceSeed
博客等级 码龄1年 161粉丝 2185原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值