做电焊加工的网站wordpress首页幻灯片尺寸
news/
2025/10/3 1:26:38/
文章来源:
做电焊加工的网站,wordpress首页幻灯片尺寸,行业门户网站的优化怎么做yps行业门户系统,源码商城网站源码松哥周末抽空给 Spring Security 系列也录制了一套视频#xff0c;目录如下#xff1a;感兴趣的小伙伴戳这里--Spring BootVue微人事视频教程今天的话题来自一个小伙伴在微信上的提问#xff1a;看到这个问题#xff0c;松哥忽然想到我自己之前写过 Spring BootSwagger… 松哥周末抽空给 Spring Security 系列也录制了一套视频目录如下感兴趣的小伙伴戳这里--Spring BootVue微人事视频教程今天的话题来自一个小伙伴在微信上的提问看到这个问题松哥忽然想到我自己之前写过 Spring BootSwagger 的用法SpringBoot 整合 Swagger2也写过 OAuth2 Jwt 的用法想让 OAuth2 和 JWT 在一起愉快玩耍请看松哥的表演但是还没有将这两个结合在一起写过所以小伙伴们对此有了疑问想一想这还是一个非常常见的问题因为现在使用令牌登录的场景越来越多在这种情况下如果使用 Swagger 来测试接口要怎么在请求头中携带 Token 呢今天松哥就来和大家聊一聊。1.项目规划如果小伙伴们没有看过松哥之前发的 OAuth2 系列文章建议一定先看下(公众号江南一点雨后台回复 OAuth2 获取)再来看本文内容否则接下来的内容可能会犯迷糊。这里松哥搭建一个 OAuth2JWT 的环境来做演示。一共搭建两个服务服务名端口备注auth-server8080授权服务器user-server8081资源服务器我稍微解释一下auth-server 就是我的资源服务器用来颁发 JWT 令牌。user-server 则是资源服务器访问 user-server 上的资源都需要携带令牌才能访问。swagger 则用来给 user-server 上的接口生成文档。OK这是我们项目的一个大致规划。2.环境搭建接下来我们来搭建 OAuth2 测试环境。2.1 授权服务器搭建首先我们搭建一个名为 auth-server 的授权服务搭建的时候选择如下三个依赖WebSpring Cloud SecuritySpirng Cloud OAuth2项目创建完成后首先提供一个 Spring Security 的基本配置Configurationpublic class SecurityConfig extends WebSecurityConfigurerAdapter { Bean PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } Override Bean public AuthenticationManager authenticationManagerBean() throws Exception { return super.authenticationManagerBean(); } Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() .withUser(sang) .password(passwordEncoder().encode(123)) .roles(admin) .and() .withUser(javaboy) .password(passwordEncoder().encode(123)) .roles(user); } Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable().formLogin(); }}在这段代码中为了代码简洁我就不把 Spring Security 用户存到数据库中去了直接存在内存中。这里我创建了一个名为 sang 的用户密码是 123角色是 admin。同时我还配置了一个表单登录。这段配置的目的实际上就是配置用户。例如你想用微信登录第三方网站在这个过程中你得先登录微信登录微信就要你的用户名/密码信息那么我们在这里配置的其实就是用户的用户名/密码/角色信息。需要注意的是在当前案例中我将采用 OAuth2 中的 password 模式进行登录因此这里还需要明确的提供一个 AuthenticationManager 的 Bean。基本的用户信息配置完成后接下来我们来配置授权服务器。首先来配置 TokenStoreConfigurationpublic class AccessTokenConfig { Bean TokenStore tokenStore() { return new JwtTokenStore(jwtAccessTokenConverter()); } Bean JwtAccessTokenConverter jwtAccessTokenConverter() { JwtAccessTokenConverter converter new JwtAccessTokenConverter(); converter.setSigningKey(javaboy); return converter; }}TokenStore 我们使用 JwtTokenStore 这个实例。使用了 JWTaccess_token 实际上就不用存储了(无状态登录服务端不需要保存信息)因为用户的所有信息都在 jwt 里边所以这里配置的 JwtTokenStore 本质上并不是做存储。另外我们还提供了一个 JwtAccessTokenConverter这个 JwtAccessTokenConverter 可以实现将用户信息和 JWT 进行转换(将用户信息转为 jwt 字符串或者从 jwt 字符串提取出用户信息)。另外在 JWT 字符串生成的时候我们需要一个签名这个签名需要自己保存好。接下来对授权服务器进行详细配置EnableAuthorizationServerConfigurationpublic class AuthorizationServer extends AuthorizationServerConfigurerAdapter { Autowired TokenStore tokenStore; Autowired ClientDetailsService clientDetailsService; Autowired AuthenticationManager authenticationManager; Autowired PasswordEncoder passwordEncoder; Autowired JwtAccessTokenConverter jwtAccessTokenConverter; Bean AuthorizationServerTokenServices tokenServices() { DefaultTokenServices services new DefaultTokenServices(); services.setClientDetailsService(clientDetailsService); services.setSupportRefreshToken(true); services.setTokenStore(tokenStore); services.setAccessTokenValiditySeconds(60 * 60 * 24 * 2); services.setRefreshTokenValiditySeconds(60 * 60 * 24 * 7); TokenEnhancerChain tokenEnhancerChain new TokenEnhancerChain(); tokenEnhancerChain.setTokenEnhancers(Arrays.asList(jwtAccessTokenConverter)); services.setTokenEnhancer(tokenEnhancerChain); return services; } Override public void configure(AuthorizationServerSecurityConfigurer security) throws Exception { security.allowFormAuthenticationForClients(); } Override public void configure(ClientDetailsServiceConfigurer clients) throws Exception { clients.inMemory() .withClient(javaboy) .secret(passwordEncoder.encode(123)) .resourceIds(res1) .authorizedGrantTypes(password, refresh_token) .scopes(all) .redirectUris(http://localhost:8082/index.html); } Override public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { endpoints .authenticationManager(authenticationManager) .tokenServices(tokenServices()); }}这段代码有点长我来给大家挨个解释创建 AuthorizationServer 类继承自 AuthorizationServerConfigurerAdapter来对授权服务器做进一步的详细配置AuthorizationServer 类记得加上 EnableAuthorizationServer 注解表示开启授权服务器的自动化配置。在 AuthorizationServer 类中我们其实主要重写三个 configure 方法。AuthorizationServerSecurityConfigurer 用来配置令牌端点的安全约束也就是这个端点谁能访问谁不能访问。ClientDetailsServiceConfigurer 用来配置客户端的详细信息在之前文章中松哥和大家讲过授权服务器要做两方面的检验一方面是校验客户端另一方面则是校验用户校验用户我们前面已经配置了这里就是配置校验客户端。客户端的信息我们可以存在数据库中这其实也是比较容易的和用户信息存到数据库中类似但是这里为了简化代码我还是将客户端信息存在内存中这里我们分别配置了客户端的 idsecret、资源 id、授权类型、授权范围以及重定向 uri。授权类型我在之前文章中和大家一共讲了四种四种之中不包含 refresh_token 这种类型但是在实际操作中refresh_token 也被算作一种。AuthorizationServerEndpointsConfigurer 这里用来配置令牌的访问端点和令牌服务。tokenServices 这个 Bean 主要用来配置 Token 的一些基本信息例如 Token 是否支持刷新、Token 的存储位置、Token 的有效期以及刷新 Token 的有效期等等。Token 有效期这个好理解刷新 Token 的有效期我说一下当 Token 快要过期的时候我们需要获取一个新的 Token在获取新的 Token 时候需要有一个凭证信息这个凭证信息不是旧的 Token而是另外一个 refresh_token这个 refresh_token 也是有有效期的。好了如此之后我们的授权服务器就算是配置完成了接下来我们启动授权服务器。如果小伙伴们对于上面的配置感到迷糊可以在公众号后台回复 OAuth2先系统的学习一下松哥的 OAuth2 教程。2.2 资源服务器搭建接下来我们搭建一个资源服务器。大家网上看到的例子资源服务器大多都是和授权服务器放在一起的如果项目比较小的话这样做是没问题的但是如果是一个大项目这种做法就不合适了。资源服务器就是用来存放用户的资源例如你在微信上的图像、openid 等信息用户从授权服务器上拿到 access_token 之后接下来就可以通过 access_token 来资源服务器请求数据。我们创建一个新的 Spring Boot 项目叫做 user-server 作为我们的资源服务器创建时添加如下依赖项目创建成功之后先把前面的 AccessTokenConfig 拷贝到资源服务器上然后添加如下配置ConfigurationEnableResourceServerpublic class ResourceServerConfig extends ResourceServerConfigurerAdapter { Autowired TokenStore tokenStore; Override public void configure(ResourceServerSecurityConfigurer resources) throws Exception { resources.resourceId(res1).tokenStore(tokenStore); } Override public void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers(/admin/**).hasRole(admin) .anyRequest().authenticated(); }}这段配置代码很简单我简单的说一下首先在 configure 方法中配置资源 ID 和 TokenStore这里配置好之后会自动调用 JwtAccessTokenConverter 将 jwt 解析出来jwt 里边就包含了用户的基本信息所以就不用远程校验 access_token 了。最后配置一下资源的拦截规则这就是 Spring Security 中的基本写法我就不再赘述。接下来我们再来配置两个测试接口RestControllerpublic class HelloController { GetMapping(/hello) public String hello() { return hello; } GetMapping(/admin/hello) public String admin() { return admin; }}如此之后我们的资源服务器就算配置成功了。2.3 测试分别启动授权服务器和资源服务器先访问授权服务器获取 access_token再利用拿到的 access_token 去访问资源服务器OK测试没问题。3.整合 Swagger接下来我们在 user-server 中加入 swagger 功能首先我们加入 swagger 依赖 dependency groupIdio.springfoxgroupId artifactIdspringfox-swagger2artifactId version2.9.2version dependency dependency groupIdio.springfoxgroupId artifactIdspringfox-swagger-uiartifactId version2.9.2version dependency这里加入的依赖有两个一个用来生成接口数据另一个 swagger-ui 用来做数据展示。3.1 认证方式一请求头加参数这里给大家介绍两种先来看第一种。先配置一个 Docket 实例如下ConfigurationEnableSwagger2public class Swagger2Config { Bean Docket docket() { return new Docket(DocumentationType.SWAGGER_2) .select() .apis(RequestHandlerSelectors.basePackage(org.javaboy.oauth2.res.controller)) .paths(PathSelectors.any()) .build() .securityContexts(Arrays.asList(securityContexts())) .securitySchemes(Arrays.asList(securitySchemes())) .apiInfo(new ApiInfoBuilder() .description(接口文档的描述信息) .title(微人事项目接口文档) .contact(new Contact(javaboy,http://www.javaboy.org,wangsong0210gmail.com)) .version(v1.0) .license(Apache2.0) .build()); } private SecurityScheme securitySchemes() { return new ApiKey(Authorization, Authorization, header); } private SecurityContext securityContexts() { return SecurityContext.builder() .securityReferences(defaultAuth()) .forPaths(PathSelectors.any()) .build(); } private List defaultAuth() { AuthorizationScope authorizationScope new AuthorizationScope(xxx, 描述信息); AuthorizationScope[] authorizationScopes new AuthorizationScope[1]; authorizationScopes[0] authorizationScope; return Arrays.asList(new SecurityReference(Authorization, authorizationScopes)); }}这里的配置稍微有点长我来给大家解释下首先通过 EnableSwagger2 注解启用 Swagger2。配置一个 Docket Bean这个 Bean 中配置映射路径和要扫描的接口的位置。在 apiInfo 中主要配置一下 Swagger2 文档网站的信息例如网站的 title网站的描述联系人的信息使用的协议等等。通过 securitySchemes 来配置全局参数这里的配置是一个名为 Authorization 的请求头(OAuth2 中需要携带的请求头)。securityContexts 则用来配置有哪些请求需要携带 Token这里我们配置了所有请求。配置完成后我们还需要给 swagger-ui 放行否则 swagger-ui 相关的静态资源会被 Spring Security 拦截下来Configurationpublic class SecurityConfig extends WebSecurityConfigurerAdapter { Override public void configure(WebSecurity web) throws Exception { web.ignoring().antMatchers(/swagger-ui.html) .antMatchers(/webjars/**) .antMatchers(/v2/**) .antMatchers(/swagger-resources/**); }}配置完成后重启 user-server浏览器输入 http://localhost:8081/swagger-ui.html结果如下大家可以看到页面中多了一个 Authorize 按钮点击该按钮输入 Bearer ${token}如下输入完成后点击 Authorize 按钮完成认证接下来user-server 中的各种接口就可以直接调用测试了。上面这种方式比较通用不仅仅适用于 OAuth2也适用于其他一些自定义的 token 登录方式。但是这种方式需要开发者先通过其他途径获取到 access_token有的人会觉得这样有点麻烦那么有没有更好的办法呢请看方式二。3.2 认证方式二认证方式二就是直接在 Swagger 中填入认证信息这样就不用从外部去获取 access_token 了效果如下我们来看下这个怎么配置。由于 swagger 去请求 /oauth/token 接口会跨域所以我们首先要修改 auth-server 使之支持跨域主要是两方面的修改首先是配置 CorsFilter允许跨域如下Configurationpublic class GlobalCorsConfiguration { Bean public CorsFilter corsFilter() { CorsConfiguration corsConfiguration new CorsConfiguration(); corsConfiguration.setAllowCredentials(true); corsConfiguration.addAllowedOrigin(*); corsConfiguration.addAllowedHeader(*); corsConfiguration.addAllowedMethod(*); UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource new UrlBasedCorsConfigurationSource(); urlBasedCorsConfigurationSource.registerCorsConfiguration(/**, corsConfiguration); return new CorsFilter(urlBasedCorsConfigurationSource); }}然后在 SecurityConfig 中开启跨域支持ConfigurationOrder(Ordered.HIGHEST_PRECEDENCE)public class SecurityConfig extends WebSecurityConfigurerAdapter { ... ... Override protected void configure(HttpSecurity http) throws Exception { http .requestMatchers().antMatchers(HttpMethod.OPTIONS, /oauth/**) .and() .csrf().disable().formLogin() .and() .cors(); }}经过这两步的配置服务端的跨域支持就开启了。接下来我们在 user-server 中修改关于 Docket bean 的定义ConfigurationEnableSwagger2public class Swagger2Config { Bean Docket docket() { return new Docket(DocumentationType.SWAGGER_2) .select() .apis(RequestHandlerSelectors.basePackage(org.javaboy.oauth2.res.controller)) .paths(PathSelectors.any()) .build() .securityContexts(Arrays.asList(securityContext())) .securitySchemes(Arrays.asList(securityScheme())) .apiInfo(new ApiInfoBuilder() .description(接口文档的描述信息) .title(微人事项目接口文档) .contact(new Contact(javaboy,http://www.javaboy.org,wangsong0210gmail.com)) .version(v1.0) .license(Apache2.0) .build()); } private AuthorizationScope[] scopes() { return new AuthorizationScope[]{ new AuthorizationScope(all, all scope) }; } private SecurityScheme securityScheme() { GrantType grant new ResourceOwnerPasswordCredentialsGrant(http://localhost:8080/oauth/token); return new OAuthBuilder().name(OAuth2) .grantTypes(Arrays.asList(grant)) .scopes(Arrays.asList(scopes())) .build(); } private SecurityContext securityContext() { return SecurityContext.builder() .securityReferences(Arrays.asList(new SecurityReference(OAuth2, scopes()))) .forPaths(PathSelectors.any()) .build(); }}这段配置跟前面的类似主要是 SecurityScheme 不同。这里采用了 OAuthBuilder 来构建构建时即得配置 token 的获取地址。好了配置完成重启 auth-server 和 user-server 进行测试。测试效果就是松哥前面给出的图片不再赘述。这种方式最大的好处就是不用通过其他途径获取 access_token直接在 swagger-ui 页面输入 password 模式的认证参数即可。非常方便仅限于 OAuth2 模式。4.小结好了今天就和小伙伴们介绍了在 Swagger 请求中如何修改请求头的问题感兴趣的小伙伴可以下来试试哦本文案例下载地址https://github.com/lenve/spring-security-samples好啦小伙伴们如果觉得有收获记得点个在看鼓励下松哥哦今日干货刚刚发表查看:66666回复:666公众号后台回复 ssm免费获取松哥纯手敲的 SSM 框架学习干货。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/925472.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!