spring security oauth2搭建resource-server demo及token改造成JWT令牌

我们在上文讲了如何在spring security的环境中搭建基于oauth2协议的认证中心demo:https://www.cnblogs.com/process-h/p/15688971.html, 对应的还应该要有一个resource server。本章主要就是讲resource server的demo搭建,并且再将普通的token改造成JWT令牌的形式以及为什么要改成JWT令牌格式。

自定义resource-server实现类

​ 在搭建oauth2认证中心时,我们需要再自定义一个继承AuthorizationServerConfigurerAdapter的实现类,同时在该实现类上添加@EnableAuthorizationServer注解。同样的,我们也需要创建一个继承ResourceServerConfigurerAdapter的实现类,并在该实现类上添加@EnableResourceServer注解来声明这是一个资源服务。

@Configuration @EnableResourceServer public class ResouceServerConfig extends ResourceServerConfigurerAdapter { }

​ 我们来看看ResourceServerConfigurerAdapter父类,发现它重写了2个方法。以下是这2个方法中的参数对象可以配置的属性:

ResourceServerSecurityConfigurer中主要包括:

tokenServices:ResourceServerTokenServices 类的实例,用来实现令牌服务。

tokenStore:TokenStore类的实例,指定令牌如何访问。

resourceId:这个资源服务的ID,这个属性是可选的,但是推荐设置并在授权服务中进行验证。

其他的拓展属性例如 tokenExtractor 令牌提取器用来提取请求中的令牌。

HttpSecurity配置这个与Spring Security类似:

请求匹配器,用来设置需要进行保护的资源路径,默认的情况下是保护资源服务的全部路径。

通过http.authorizeRequests()来设置受保护资源的访问规则。

其他的自定义权限保护规则通过 HttpSecurity 来进行配置。

public class ResourceServerConfigurerAdapter implements ResourceServerConfigurer { @Override public void configure(ResourceServerSecurityConfigurer resources) throws Exception { } @Override public void configure(HttpSecurity http) throws Exception { http.authorizeRequests().anyRequest().authenticated(); } }

编写ResourceServerConfig

package com.peter.security.order.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer; import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter; import org.springframework.security.oauth2.config.annotation.web.configurers.ResourceServerSecurityConfigurer; import org.springframework.security.oauth2.provider.token.RemoteTokenServices; import org.springframework.security.oauth2.provider.token.ResourceServerTokenServices; /** * @author huang * @description * @date 2021/12/17 **/ @Configuration @EnableResourceServer @EnableGlobalMethodSecurity(prePostEnabled = true) public class ResouceServerConfig extends ResourceServerConfigurerAdapter { public static final String RESOURCE_ID = "res1"; //资源服务令牌解析服务 @Bean public ResourceServerTokenServices tokenService() { //使用远程服务请求授权服务器校验token,必须指定校验token 的url、client_id,client_secret RemoteTokenServices service=new RemoteTokenServices(); service.setCheckTokenEndpointUrl("http://localhost:53020/uaa/oauth/check_token"); // 声明只有该client 的接入方才能访问该资源服务 service.setClientId("c1"); service.setClientSecret("secret"); return service; } @Override public void configure(ResourceServerSecurityConfigurer resources) { // 声明该资源服务id,以及认证的tokenSerivce对象 resources.resourceId(RESOURCE_ID) .tokenServices(tokenService()); } @Override public void configure(HttpSecurity http) throws Exception { http .authorizeRequests() // 访问该资源服务的client的scope要有all权限 .antMatchers("/**").access("#oauth2.hasScope('all')") .and().csrf().disable() .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); } } 定义资源服务接口

​ 有了配置,还需要暴露出一些资源接口给外部调用,我们这里简单定义一个接口。

package com.peter.security.order.controller; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; /** * @author huangyizeng * @description * @date 2021/12/17 **/ @RestController public class OrderController { // 访问该资源的用户要有P1权限 @GetMapping(value = "/r1") @PreAuthorize("hasAnyAuthority('p1')") public String r1(){ return "访问资源1"; } } 示例 1、申请token

​ 我们知道Oauth2协议有4中授权方式,分别是:

授权码(authorization_code):第三方应用先申请一个授权码,然后再用该码获取令牌。

密码(password):使用用户名密码进行获取token,一般是高度信任的应用(内部系统应用)。

客户端(client_credentials):没有前端,只有后端应用。

简化(implicit):有些web是纯前端应用,没有后端,将token存放在前端。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwfgyy.html