当前位置: 首页 > news >正文

html怎么做成网站多软件网站下载安装

html怎么做成网站,多软件网站下载安装,设计作品欣赏网站,网站建设与管理期末试卷前言 前面实现了授权中心授权,客户端拿到access_token后就能请求资源服务器接口 权限的校验都是在资源服务器上进行的,授权服务器颁发的access_token有限期是2小时,也就是说在2小时之内,不管授权服务器那边用户的权限如何变更都…

前言

前面实现了授权中心授权,客户端拿到access_token后就能请求资源服务器接口

权限的校验都是在资源服务器上进行的,授权服务器颁发的access_token有限期是2小时,也就是说在2小时之内,不管授权服务器那边用户的权限如何变更都不会影响到资源服务器上的资源请求。

这篇来解决这个问题,让客户端对资源服务器的每次请求都要去问问授权服务器access_token是否还有效,有效的话资源服务器才能通过

授权服务器

在 application.yml 里的 grant-types 后面添加一个 client_credentials

# 之前
oauth2:client:#...grant-types: authorization_code,refresh_token# 修改后
oauth2:client:#...grant-types: authorization_code,refresh_token,client_credentials

配置类 AuthorizationServerConfig 里将 OAuth2TokenCustomizer 由 JwtEncodingContext 改成 OAuth2TokenClaimsContext

//之前//    @Bean
//    public OAuth2TokenCustomizer<JwtEncodingContext> jwtCustomizer() {
//        return context -> {
//            if (context.getTokenType().getValue().equals("access_token")) {
//                Collection<? extends GrantedAuthority> authorities = context.getPrincipal().getAuthorities();
//                List<String> authorityNames = authorities.stream()
//                        .map(GrantedAuthority::getAuthority)
//                        .collect(Collectors.toList());
//                context.getClaims().claim("authorities", authorityNames);
//            }
//        };
//    }//修改后
@Beanpublic OAuth2TokenCustomizer<OAuth2TokenClaimsContext> tokenCustomizer() {return context -> {if (context.getTokenType().getValue().equals("access_token")) {// 从用户详情中提取权限Collection<? extends GrantedAuthority> authorities =context.getPrincipal().getAuthorities();// 将权限列表放入令牌声明context.getClaims().claim("authorities",authorities.stream().map(GrantedAuthority::getAuthority).collect(Collectors.toList()));}};}

资源服务器

添加一个依赖

<dependency><groupId>com.nimbusds</groupId><artifactId>oauth2-oidc-sdk</artifactId><version>11.23.1</version><scope>runtime</scope></dependency>

创建一个自省令牌解析器 CustomAuthoritiesOpaqueTokenIntrospector

import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.oauth2.core.DefaultOAuth2AuthenticatedPrincipal;
import org.springframework.security.oauth2.core.OAuth2AuthenticatedPrincipal;
import org.springframework.security.oauth2.server.resource.introspection.OpaqueTokenIntrospector;import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;public class CustomAuthoritiesOpaqueTokenIntrospector implements OpaqueTokenIntrospector {private final OpaqueTokenIntrospector delegate;public CustomAuthoritiesOpaqueTokenIntrospector(OpaqueTokenIntrospector delegate) {this.delegate = delegate;}@Overridepublic OAuth2AuthenticatedPrincipal introspect(String token) {OAuth2AuthenticatedPrincipal principal = this.delegate.introspect(token);Map<String, Object> claims = principal.getAttributes();List<String> authorities = (List<String>) claims.get("authorities");if (authorities == null) throw new SecurityException("没有权限");Collection<GrantedAuthority> grantedAuthorities = authorities.stream().map(auth -> new SimpleGrantedAuthority(auth)) // 直接使用权限名,不加 SCOPE_ 前缀.collect(Collectors.toList());return new DefaultOAuth2AuthenticatedPrincipal(claims, grantedAuthorities);}
}

修改 ResourceServerConfig 配置类

    @Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests(authorize -> authorize.anyRequest().authenticated()).oauth2ResourceServer(oauth2 -> oauth2// 注释掉jwt
//                        .jwt(jwt -> jwt
//                                .jwkSetUri("http://localhost:9000/oauth2/jwks")
//                                .jwtAuthenticationConverter(jwtAuthenticationConverter()) // 使用自定义转换器
//                        )// 添加上 opaque.opaqueToken(opaque -> opaque
//                                        .introspectionUri("http://localhost:9000/oauth2/introspect")
//                                        .introspectionClientCredentials("client", "secret").introspector(customOpaqueTokenIntrospector())));return http.build();}// jwt权限转换器,这里用不到了注释掉
//    @Bean
//    public JwtAuthenticationConverter jwtAuthenticationConverter() {
//        JwtGrantedAuthoritiesConverter grantedAuthoritiesConverter = new JwtGrantedAuthoritiesConverter();
//        grantedAuthoritiesConverter.setAuthoritiesClaimName("authorities"); // 指定JWT中权限字段名
//        grantedAuthoritiesConverter.setAuthorityPrefix(""); // 去掉默认的"SCOPE_"前缀
//
//        JwtAuthenticationConverter jwtAuthenticationConverter = new JwtAuthenticationConverter();
//        jwtAuthenticationConverter.setJwtGrantedAuthoritiesConverter(grantedAuthoritiesConverter);
//        return jwtAuthenticationConverter;
//    }

配置授权服务器的请求 /oauth2/introspect 是内置的,不要修改

    @Beanpublic OpaqueTokenIntrospector customOpaqueTokenIntrospector() {// 1. 创建默认的 Introspector(连接授权服务器)OpaqueTokenIntrospector delegate = new NimbusOpaqueTokenIntrospector("http://localhost:9000/oauth2/introspect","client", // client_id"secret"  // client_secret 与授权服务器保持一致);// 2. 包装成自定义实现return new CustomAuthoritiesOpaqueTokenIntrospector(delegate);}

测试

拿code换access_token的流程跟前面是一样的,下面用access_token请求一下资源服务器的接口看看

/api/hello 接口因为有权限请求成功
在这里插入图片描述
请求 /api/hello 接口时,资源服务器日志
在这里插入图片描述
授权服务器日志
在这里插入图片描述

总结

  • jwt方式简单直接,对授权服务器压力比较小,一次授权能用很长时间,期间授权服务器处于闲置状态。适合内部系统且用户权限不经常变动的系统
  • 自省令牌稍微麻烦点,对授权服务器压力大,每次请求都需要授权服务器校验,适合用户权限经常变动的系统。
http://www.dtcms.com/a/461760.html

相关文章:

  • 做网站服务销售wordpress user level
  • 【C++贪心】P10537 [APIO2024] 九月|普及+
  • 大模型问答原理解析
  • 【二叉树的递归算法与层序遍历算法】
  • 【STM32】I2C通信—软件模拟
  • 公司网站怎么修改内容wordpress 4.7.2 中文
  • 怎么建手机网站seo新方法
  • 第六章 QT和OPENCV交叉编译开发环境以及QT远程调试
  • hello_mybatis
  • 【大模型理论篇】MCP协议中sse、stdio、streamable_http含义
  • Git 小白超详细指南
  • 深度学习基础:从原理到实践——第二章神经网络(上)
  • 企业网站制作报价单哈尔滨视频剪辑培训机构
  • SOME/IP车载服务的形式化安全分析和防护
  • TCP三次握手与四次挥手状态解析
  • 网站想换空间invoker wordpress
  • Eureka注册中心
  • 网站建设销售总结房屋装修在线设计网站
  • 机器学习基本概念
  • Buffer:Node.js 里处理二进制数据的 “小工具”
  • 网站开发博客大前端d8扁平化wordpress模板
  • Go 语言环境安装指南
  • UiPath2025笔记第六节:java调试API触发器
  • Python实现自动化巡检ESXi6.7并输出excel报告
  • wordpress手机显示不了图片关键词优化计划
  • Python学习之基础篇
  • 手机app开发 网站建设描述网站开发的广告词
  • 24届-Python面经(华为OD)
  • JavaSpring项目之连接,并使用redis
  • 前端核心框架vue之(vue状态核心案例篇4/5)