当前位置:首页 >休闲 >SpringBoot 整合 OAuth2 实现资源保护 所以这里还需要这个类

SpringBoot 整合 OAuth2 实现资源保护 所以这里还需要这个类

2024-05-14 09:28:58 [百科] 来源:避面尹邢网

SpringBoot 整合 OAuth2 实现资源保护

作者:Springboot实战案例锦集 开发 前端 我们在认证服务上是整合把Users对象序列化存储到了Redis,所以这里还需要这个类,现资其实如果用了网关,源保这些认证就不需要在资源端进行了,整合核心配置类主要完整,现资开启资源服务认证,源保定义我们需要保护的整合接口,token的现资存储对象及错误信息的统一处理。

上一篇整合介绍了OAuth2的源保认证服务,接下来利用认证服务提供的整合token来包含我们的资源。

环境:2.4.12 + OAuth2 + Redis

SpringBoot 整合 OAuth2 实现资源保护 所以这里还需要这个类

  • pom.xml
<dependency>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-web</artifactId></dependency><dependency>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency>  <groupId>org.apache.commons</groupId>  <artifactId>commons-pool2</artifactId></dependency><dependency>  <groupId>org.springframework.security.oauth.boot</groupId>  <artifactId>spring-security-oauth2-autoconfigure</artifactId>  <version>2.2.11.RELEASE</version></dependency>
  • application.yml
server:  port: 8088---spring:  application:    name: oauth-resource---spring:  redis:    host: localhost    port: 6379    password:     database: 1    lettuce:      pool:        maxActive: 8        maxIdle: 100        minIdle: 10        maxWait: -1
  • Domain对象(我们在认证服务上是现资把Users对象序列化存储到了Redis,所以这里还需要这个类,源保其实如果用了网关,整合这些认证就不需要在资源端进行了)
public class Users implements UserDetails,现资 Serializable {   private static final long serialVersionUID = 1L;  private String id ;  private String username ;  private String password ;}
  • 核心配置类
@Configuration@EnableResourceServerpublic class OAuthConfig extends ResourceServerConfigurerAdapter {     private static final Logger logger = LoggerFactory.getLogger(OAuthConfig.class) ;    public static final String RESOURCE_ID = "gx_resource_id";      @Resource  private RedisConnectionFactory redisConnectionFactory ;    @Override    public void configure(ResourceServerSecurityConfigurer resources) throws Exception {       resources.resourceId(RESOURCE_ID) ;    OAuth2AuthenticationEntryPoint oAuth2AuthenticationEntryPoint = new OAuth2AuthenticationEntryPoint();      oAuth2AuthenticationEntryPoint.setExceptionTranslator(webResponseExceptionTranslator());    resources.authenticationEntryPoint(oAuth2AuthenticationEntryPoint) ;    resources.tokenExtractor((request) -> {       String tokenValue = extractToken(request) ;      if (tokenValue != null) {         PreAuthenticatedAuthenticationToken authentication = new PreAuthenticatedAuthenticationToken(tokenValue, "");        return authentication;      }      return null;    }) ;  }   private String extractToken(HttpServletRequest request) {     // first check the header... Authorization: Bearer xxx    String token = extractHeaderToken(request);    // sencod check the header... access_token: xxx    if (token == null) {       token = request.getHeader("access_token") ;    }    // bearer type allows a request parameter as well    if (token == null) {       logger.debug("Token not found in headers. Trying request parameters.") ;      token = request.getParameter(OAuth2AccessToken.ACCESS_TOKEN) ;      if (token == null) {         logger.debug("Token not found in request parameters.  Not an OAuth2 request.") ;      } else {         request.setAttribute(OAuth2AuthenticationDetails.ACCESS_TOKEN_TYPE, OAuth2AccessToken.BEARER_TYPE);      }    }    return token;  }  private String extractHeaderToken(HttpServletRequest request) {     Enumeration<String> headers = request.getHeaders("Authorization");    while (headers.hasMoreElements()) {  // typically there is only one (most servers enforce that)      String value = headers.nextElement();      if ((value.toLowerCase().startsWith(OAuth2AccessToken.BEARER_TYPE.toLowerCase()))) {         String authHeaderValue = value.substring(OAuth2AccessToken.BEARER_TYPE.length()).trim();        // Add this here for the auth details later. Would be better to change the signature of this method.        request.setAttribute(OAuth2AuthenticationDetails.ACCESS_TOKEN_TYPE,        value.substring(0, OAuth2AccessToken.BEARER_TYPE.length()).trim());        int commaIndex = authHeaderValue.indexOf(',');        if (commaIndex > 0) {           authHeaderValue = authHeaderValue.substring(0, commaIndex);        }        return authHeaderValue;      }    }    return null;  }      @Override    public void configure(HttpSecurity http) throws Exception {       http.csrf().disable() ;    http.requestMatcher(request -> {       String path = request.getServletPath() ;      if (path != null && path.startsWith("/demo")) {         return true ;      }      return false ;    }).authorizeRequests().anyRequest().authenticated() ;  }      @Bean  public TokenStore tokenStore() {     TokenStore tokenStore = null ;    tokenStore = new RedisTokenStore(redisConnectionFactory) ;    return tokenStore ;  }      @Bean    public WebResponseExceptionTranslator<?> webResponseExceptionTranslator() {       return new DefaultWebResponseExceptionTranslator() {       @SuppressWarnings({  "unchecked", "rawtypes" })      @Override      public ResponseEntity translate(Exception e) throws Exception {         ResponseEntity<OAuth2Exception> responseEntity = super.translate(e) ;        ResponseEntity<Map<String, Object>> customEntity = exceptionProcess(responseEntity);        return customEntity ;      }      };    }        private static ResponseEntity<Map<String, Object>> exceptionProcess(    ResponseEntity<OAuth2Exception> responseEntity) {     Map<String, Object> body = new HashMap<>() ;    body.put("code", -1) ;    OAuth2Exception excep = responseEntity.getBody() ;    String errorMessage = excep.getMessage();    if (errorMessage != null) {       errorMessage = "认证失败,非法用户" ;      body.put("message",源保 errorMessage) ;    } else {       String error = excep.getOAuth2ErrorCode();      if (error != null) {         body.put("message", error) ;      } else {         body.put("message", "认证服务异常,未知错误") ;      }    }    body.put("data", null) ;    ResponseEntity<Map<String, Object>> customEntity = new ResponseEntity<>(body,     responseEntity.getHeaders(), responseEntity.getStatusCode()) ;    return customEntity;  }  }

核心配置类主要完整,开启资源服务认证,定义我们需要保护的接口,token的存储对象及错误信息的统一处理。

SpringBoot 整合 OAuth2 实现资源保护 所以这里还需要这个类

  • 测试接口
@RestController@RequestMapping("/demo")public class DemoController {     @GetMapping("/res")  public Object res() {     return "success" ;  }  }

测试:

SpringBoot 整合 OAuth2 实现资源保护 所以这里还需要这个类

先直接访问token或者传一个错误的tokenj

图片图片

接下先获取一个正确的token

图片图片

图片图片

责任编辑:武晓燕 来源: Spring全家桶实战案例源码 Users对象序列化

(责任编辑:时尚)

    推荐文章
    • 好消息!杭州亚运会淳安亚运分村进入试运营阶段

      好消息!杭州亚运会淳安亚运分村进入试运营阶段4月25日,由中国绿发建设的2022年第19届亚运会淳安界首亚运中心场馆群正式移交给淳安界首体育中心场馆群运行团队进行管理。这标志着淳安亚运分村正式进入试运营阶段。中国绿发将亚运会建设运营工作作为重要 ...[详细]
    • 龙淑芬什么梗

      龙淑芬什么梗龙淑芬什么梗?出自《欢乐喜剧人第五季》第四期,卢鑫玉浩的相声《侠客行不行》:说到小龙女的本名,竟然叫“龙淑芬”。重庆有家特别有名的烧烤串串,就叫重庆串串-淑芬掌...淑芬是什么梗问题一:何娟淑芬是什么 ...[详细]
    • 四个字的歌曲

      四个字的歌曲前言:答:四个字的歌曲太多了,现给你摘抄几个:周华健的《心如刀割》甄妮的《铁血丹心》张宇的《曲终人散》李晓杰的《朋友的酒》,以下就不在写演唱者了。《爱我中华》爱情转移独家记忆新不了情幸福恋人情非得已从 ...[详细]
    • 适合在家做的有氧运动

      适合在家做的有氧运动有哪些可以在家做而且不扰民的有氧运动?还有一点需要注意:卷腹可以提升你的腹部力量,但是脂肪厚的人别指望用这个动作减肚子减肥必须靠有氧。自己在家,除了跑步,还能做哪些有氧运动?那么基于这个主旨的前提下, ...[详细]
    • 四川省资阳市“项目突破年”大会举行 跑出项目投资“加速度”

      四川省资阳市“项目突破年”大会举行 跑出项目投资“加速度”4月25日,资阳市“项目突破年”大会举行,市委书记元方出席并讲话。他强调,要全面落实党中央和省委决策部署,进一步鲜明发展导向,全力以赴抓项目、促投资、助企业、稳增长,奋力推动资 ...[详细]
    • 常用计时工具有哪些

      常用计时工具有哪些中国古代计时工具有哪六种?中国古代的计时工具:1、圭表:圭表中的“表”是一根垂直立在地面的标竿或石柱;“圭”是从表的跟脚上以水平位置伸向北方的一条石板。每当太阳转到正南方向的时。计时工具有哪些?沙漏、 ...[详细]
    • 牛皮凉席能用多少年

      牛皮凉席能用多少年牛皮凉席能用多少年-业百科牛皮凉席正常使用,可用10年或20年以上。牛皮凉席是指采用头层水牛皮作为原料,采用对人身体无毒害作用的鞣质原料,结合先进的鞣质工艺制作的水牛皮凉。牛皮凉席可以用多久?牛皮凉席 ...[详细]
    • 药品可以寄到国外吗

      药品可以寄到国外吗吗?药品可以国际寄国外的。药品按照国际快递的严格规定,是不能邮寄的,有很多人去各当地邮局,国际快递药品到国外,但是却寄不了,然后又咨询其他国际快递官。寄药品到国外怎么寄?从中国可以寄药品到国外,但是药 ...[详细]
    • 少儿重疾险的最高保额是多少 少儿重疾险保额买多少合适?

      少儿重疾险的最高保额是多少 少儿重疾险保额买多少合适?在如今,少儿重疾险是比较受欢迎的,很多家长为了保障孩子的健康成长,都会购买少儿重疾险,那么少儿重疾险的最高保额是多少?少儿重疾险保额多少合适?下文就来带大家了解一下。少儿重疾险的保额一般在5~50万之 ...[详细]
    • 牛皮凉席能用多少年

      牛皮凉席能用多少年牛皮凉席能用多少年-业百科牛皮凉席正常使用,可用10年或20年以上。牛皮凉席是指采用头层水牛皮作为原料,采用对人身体无毒害作用的鞣质原料,结合先进的鞣质工艺制作的水牛皮凉。牛皮凉席可以用多久?牛皮凉席 ...[详细]
    热点阅读