范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

SpringCloud整合springsecurityoauth2Redis实现认证授权

  设置通用父工程依赖
  在微服务构建中,我们一般用一个父工程来通知管理依赖的各种版本号信息。父工程pom文件如下:
  <?xml version="1.0" encoding="UTF-8"?>
  
  4.0.0
  com.zjq
  oauth2-demo
  pom
  1.0-SNAPSHOT
  commons
  ms-gateway
  ms-oauth2-server
  ms-registry
  
  2.3.7.RELEASE
  Hoxton.SR9
  1.18.16
  3.11
  2.1.3
  8.0.22
  2.1.5-RELEASE
  5.4.7
  20.0
  1.8
  1.8
  UTF-8
  
  org.springframework.boot
  spring-boot-dependencies
  ${spring-boot-version}
  pom
  import
  
  org.springframework.cloud
  spring-cloud-dependencies
  ${spring-cloud-version}
  pom
  import
  
  org.projectlombok
  lombok
  ${lombok-version}
  
  org.apache.commons
  commons-lang3
  ${commons-lang-version}
  
  org.mybatis.spring.boot
  mybatis-spring-boot-starter
  ${mybatis-starter-version}
  
  com.battcn
  swagger-spring-boot-starter
  ${swagger-starter-version}
  
  mysql
  mysql-connector-java
  ${mysql-version}
  
  cn.hutool
  hutool-all
  ${hutool-version}
  
  com.google.guava
  guava
  ${guava-version}
  
  
  
  org.springframework.boot
  spring-boot-maven-plugin
  
  
  
  
  
  构建eureka注册中心
  在SpringCloud微服务体系中服务注册中心是一个必要的存在,通过注册中心提供服务的注册和发现。具体细节可以查看我之前的博客,这里不再赘述。我们开始构建一个eureka注册中心,对应的yml配置文件如下:
  server:
  port: 8080
  spring:
  application:
  # 应用名称
  name: ms-registry
  # 配置 Eureka Server 注册中心
  eureka:
  client:
  register-with-eureka: false
  fetch-registry: false
  service-url:
  defaultZone: http://localhost:8080/eureka/
  logging:
  pattern:
  console: "%d{HH:mm:ss} [%thread] %-5level %logger{50} - %msg%n"
  对应的项目启动类代码如下:
  package com.zjq.msregistry;
  import org.springframework.boot.SpringApplication;
  import org.springframework.boot.autoconfigure.SpringBootApplication;
  import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
  /**
  * 注册中心
  * @author zjq
  */
  //启动 eureka注册中心服务端相关组件
  @EnableEurekaServer
  @SpringBootApplication
  public class MsRegistryApplication {
  public static void main(String[] args) {
  SpringApplication.run(MsRegistryApplication.class, args);
  }
  }
  至此,一个单体的服务注册中心搭建完成。
  构建认证授权服务
  上文我们已经完成了注册中心的搭建,接下来我们开始搭建认证授权中心。
  配置文件设置
  我们同样在父工程下面新建一个子工程,作为认证授权中心的微服务。对应的yml文件和pom文件配置如下:
  application.yml
  server:
  port: 8082 # 端口
  spring:
  application:
  name: ms-oauth2-server # 应用名
  # 数据库
  datasource:
  driver-class-name: com.mysql.cj.jdbc.Driver
  username: root
  password: 123456
  url: jdbc:mysql://127.0.0.1:3306/oauth2?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useUnicode=true&useSSL=false
  # Redis
  redis:
  port: 6379
  host: localhost
  timeout: 3000
  database: 1
  password: 123456
  # swagger
  swagger:
  base-package: com.zjq.oauth2
  title: 认证服务API接口文档
  # Oauth2
  client:
  oauth2:
  client-id: appId # 客户端标识 ID
  secret: 123456 # 客户端安全码
  # 授权类型
  grant_types:
  - password
  - refresh_token
  # token 有效时间,单位秒
  token-validity-time: 3600
  refresh-token-validity-time: 3600
  # 客户端访问范围
  scopes:
  - api
  - all
  # 配置 Eureka Server 注册中心
  eureka:
  instance:
  prefer-ip-address: true
  instance-id: ${spring.cloud.client.ip-address}:${server.port}
  client:
  service-url:
  defaultZone: http://localhost:8080/eureka/
  # Mybatis
  mybatis:
  configuration:
  map-underscore-to-camel-case: true # 开启驼峰映射
  # 指标监控健康检查
  management:
  endpoints:
  web:
  exposure:
  include: "*" # 暴露的端点
  logging:
  pattern:
  pom.xml
  <?xml version="1.0" encoding="UTF-8"?>
  
  oauth2-demo
  com.zjq
  1.0-SNAPSHOT
  
  4.0.0
  ms-oauth2-server
  org.springframework.cloud
  spring-cloud-starter-netflix-eureka-client
  
  org.springframework.boot
  spring-boot-starter-web
  
  org.springframework.boot
  spring-boot-starter-data-redis
  
  org.mybatis.spring.boot
  mybatis-spring-boot-starter
  
  mysql
  mysql-connector-java
  
  org.springframework.cloud
  spring-cloud-starter-security
  
  org.springframework.cloud
  spring-cloud-starter-oauth2
  
  com.zjq
  commons
  1.0-SNAPSHOT
  
  org.springframework.boot
  spring-boot-configuration-processor
  true
  
  
  
  Security配置类
  我们开始搭建Spring Security相关的配置类,具体配置类代码如下:
  package com.zjq.oauth2.server.config;
  import cn.hutool.crypto.digest.DigestUtil;
  import org.springframework.context.annotation.Bean;
  import org.springframework.context.annotation.Configuration;
  import org.springframework.data.redis.connection.RedisConnectionFactory;
  import org.springframework.security.authentication.AuthenticationManager;
  import org.springframework.security.config.annotation.web.builders.HttpSecurity;
  import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
  import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
  import org.springframework.security.crypto.password.PasswordEncoder;
  import org.springframework.security.oauth2.provider.token.store.redis.RedisTokenStore;
  import javax.annotation.Resource;
  /**
  * Security 配置类
  * @author zjq
  */
  @Configuration
  @EnableWebSecurity
  public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
  // 注入 Redis 连接工厂
  @Resource
  private RedisConnectionFactory redisConnectionFactory;
  /**
  * 初始化 RedisTokenStore 用于将 token 存储至 Redis
  * @return
  */
  @Bean
  public RedisTokenStore redisTokenStore() {
  RedisTokenStore redisTokenStore = new RedisTokenStore(redisConnectionFactory);
  redisTokenStore.setPrefix("TOKEN:"); // 设置key的层级前缀,方便查询
  return redisTokenStore;
  }
  // 初始化密码编码器,用 MD5 加密密码
  @Bean
  public PasswordEncoder passwordEncoder() {
  return new PasswordEncoder() {
  /**
  * 加密
  * @param rawPassword 原始密码
  * @return
  */
  @Override
  public String encode(CharSequence rawPassword) {
  return DigestUtil.md5Hex(rawPassword.toString());
  }
  /**
  * 校验密码
  * @param rawPassword 原始密码
  * @param encodedPassword 加密密码
  * @return
  */
  @Override
  public boolean matches(CharSequence rawPassword, String encodedPassword) {
  return DigestUtil.md5Hex(rawPassword.toString()).equals(encodedPassword);
  }
  };
  }
  // 初始化认证管理对象
  @Bean
  @Override
  public AuthenticationManager authenticationManagerBean() throws Exception {
  return super.authenticationManagerBean();
  }
  // 放行和认证规则
  @Override
  protected void configure(HttpSecurity http) throws Exception {
  http.csrf().disable()
  .authorizeRequests()
  // 放行的请求
  .antMatchers("/oauth/**", "/actuator/**").permitAll()
  .and()
  .authorizeRequests()
  // 其他请求必须认证才能访问
  .anyRequest().authenticated();
  }
  }
  Security配置类主要完成以下配置:
  注入 Redis 连接工厂
  初始化 RedisTokenStore 用于将 token 存储至 Redis
  初始化密码编码器,用 MD5 加密密码
  初始化认证管理对象
  设置放行和认证规则
  授权服务配置类
  配置完了security配置类后,我们开始编写授权服务配置类,授权服务配置类需要继承AuthorizationServerConfigurerAdapter并重写对应的方法,tips:idea子类重写父类快捷键是Ctrl+O,重写后的授权服务配置类如下:
  package com.zjq.oauth2.server.config;
  import com.zjq.commons.model.domain.SignInIdentity;
  import com.zjq.oauth2.server.service.UserService;
  import org.springframework.context.annotation.Configuration;
  import org.springframework.security.authentication.AuthenticationManager;
  import org.springframework.security.crypto.password.PasswordEncoder;
  import org.springframework.security.oauth2.common.DefaultOAuth2AccessToken;
  import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer;
  import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
  import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
  import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer;
  import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerSecurityConfigurer;
  import org.springframework.security.oauth2.provider.token.store.redis.RedisTokenStore;
  import javax.annotation.Resource;
  import java.util.LinkedHashMap;
  /**
  * 授权服务配置类
  * @author zjq
  */
  @Configuration
  @EnableAuthorizationServer
  public class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter {
  // RedisTokenSore
  @Resource
  private RedisTokenStore redisTokenStore;
  // 认证管理对象
  @Resource
  private AuthenticationManager authenticationManager;
  // 密码编码器
  @Resource
  private PasswordEncoder passwordEncoder;
  // 客户端配置类
  @Resource
  private ClientOAuth2DataConfiguration clientOAuth2DataConfiguration;
  // 登录校验
  @Resource
  private UserService userService;
  /**
  * 配置令牌端点安全约束
  *
  * @param security
  * @throws Exception
  */
  @Override
  public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
  // 允许访问 token 的公钥,默认 /oauth/token_key 是受保护的
  security.tokenKeyAccess("permitAll()")
  // 允许检查 token 的状态,默认 /oauth/check_token 是受保护的
  .checkTokenAccess("permitAll()");
  }
  /**
  * 客户端配置 - 授权模型
  *
  * @param clients
  * @throws Exception
  */
  @Override
  public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
  clients.inMemory().withClient(clientOAuth2DataConfiguration.getClientId()) // 客户端标识 ID
  .secret(passwordEncoder.encode(clientOAuth2DataConfiguration.getSecret())) // 客户端安全码
  .authorizedGrantTypes(clientOAuth2DataConfiguration.getGrantTypes()) // 授权类型
  .accessTokenValiditySeconds(clientOAuth2DataConfiguration.getTokenValidityTime()) // token 有效期
  .refreshTokenValiditySeconds(clientOAuth2DataConfiguration.getRefreshTokenValidityTime()) // 刷新 token 的有效期
  .scopes(clientOAuth2DataConfiguration.getScopes()); // 客户端访问范围
  }
  /**
  * 配置授权以及令牌的访问端点和令牌服务
  *
  * @param endpoints
  * @throws Exception
  */
  @Override
  public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
  // 认证器
  endpoints.authenticationManager(authenticationManager)
  // 具体登录的方法
  .userDetailsService(userService)
  // token 存储的方式:Redis
  .tokenStore(redisTokenStore);
  }
  }
  上面用到的客户端配置类如下:
  package com.zjq.oauth2.server.config;
  import lombok.Data;
  import org.springframework.boot.context.properties.ConfigurationProperties;
  import org.springframework.stereotype.Component;
  /**
  * 客户端配置类
  * @author zjq
  */
  @Component
  @ConfigurationProperties(prefix = "client.oauth2")
  @Data
  public class ClientOAuth2DataConfiguration {
  // 客户端标识 ID
  private String clientId;
  // 客户端安全码
  private String secret;
  // 授权类型
  private String[] grantTypes;
  // token有效期
  private int tokenValidityTime;
  /**
  * refresh-token有效期
  */
  private int refreshTokenValidityTime;
  /**
  * 客户端访问范围
  */
  private String[] scopes;
  }
  具体登录的方法实现:
  登录实现
  package com.zjq.oauth2.server.service;
  import com.zjq.commons.model.domain.SignInIdentity;
  import com.zjq.commons.model.pojo.Users;
  import com.zjq.commons.utils.AssertUtil;
  import com.zjq.oauth2.server.mapper.UsersMapper;
  import org.springframework.beans.BeanUtils;
  import org.springframework.security.core.userdetails.UserDetails;
  import org.springframework.security.core.userdetails.UserDetailsService;
  import org.springframework.security.core.userdetails.UsernameNotFoundException;
  import org.springframework.stereotype.Service;
  import javax.annotation.Resource;
  /**
  * 登录校验
  * @author zjq
  */
  @Service
  public class UserService implements UserDetailsService {
  @Resource
  private UsersMapper usersMapper;
  @Override
  public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
  AssertUtil.isNotEmpty(username, "请输入用户名");
  Users users = usersMapper.selectByAccountInfo(username);
  if (users == null) {
  throw new UsernameNotFoundException("用户名或密码错误,请重新输入");
  }
  // 初始化登录认证对象
  SignInIdentity signInIdentity = new SignInIdentity();
  // 拷贝属性
  BeanUtils.copyProperties(users, signInIdentity);
  return signInIdentity;
  }
  }
  UsersMapper:
  package com.zjq.oauth2.server.mapper;
  import com.zjq.commons.model.pojo.Users;
  import org.apache.ibatis.annotations.Param;
  import org.apache.ibatis.annotations.Select;
  /**
  * 用户 Mapper
  * @author zjq
  */
  public interface UsersMapper {
  /**
  *
  * 根据用户名 or 手机号 or 邮箱查询用户信息
  *
  * @param account
  * @return
  */
  @Select("select id, username, nickname, phone, email, " +
  "password, avatar_url, roles, is_valid from t_users where " +
  "(username = #{account} or phone = #{account} or email = #{account})")
  Users selectByAccountInfo(@Param("account") String account);
  }
  用户实体:
  package com.zjq.commons.model.pojo;
  import com.zjq.commons.model.base.BaseModel;
  import lombok.Getter;
  import lombok.Setter;
  /**
  * 用户实体类
  *
  * @Author zjq
  * @Date 2022/10/12
  */
  @Getter
  @Setter
  public class Users extends BaseModel {
  // 主键
  private Integer id;
  // 用户名
  private String username;
  // 昵称
  private String nickname;
  // 密码
  private String password;
  // 手机号
  private String phone;
  // 邮箱
  private String email;
  // 头像
  private String avatarUrl;
  // 角色
  private String roles;
  }
  package com.zjq.commons.model.base;
  import lombok.Getter;
  import lombok.Setter;
  import java.io.Serializable;
  import java.util.Date;
  /**
  * 实体对象公共属性
  *
  * @Author zjq
  * @Date 2022/10/12
  */
  @Getter
  @Setter
  public class BaseModel implements Serializable {
  private Integer id;
  private Date createDate;
  private Date updateDate;
  private int isValid;
  }
  到此,我们完成了认证授权服务构建,接下来我们进行测试验证:
  测试验证
  我们启动注册中心和认证授权微服务。访问注册中心:http://localhost:8080/
  可以看到认证授权服务已经注册到注册中心。
  接下来我们通过postman访问请求token测试:
  接下来我们通过postman访问请求token测试:
  Authorization请求头中配置,username和password,对应oauth客户端中的配置:
  在body中配置请求参数,发起请求后返回如下:
  在Redis中我们也可以看到生成的相关token配置:
  至此,我们完成了认证授权中心的初步搭建。
  ————————————————
  版权声明:本文为CSDN博主「共饮一杯无」
  原文链接:https://blog.csdn.net/qq_35427589/article/details/127340635

广东神童陈舒音7岁上初中,12岁考上浙大,如今活成这样2012年,一个小女孩走进了湛江二中港城中学的课堂,引发了全校师生的围观。这个小女孩名叫陈舒音,只有7岁,按照正常的学龄计算,应该还在读小学。但陈舒音和常人不同,她6岁上小学,1年外媒俄罗斯关闭一处加工哈萨克斯坦石油的码头据德新社莫斯科消息,俄罗斯一家法院要求该国一处加工哈萨克斯坦出口石油的黑海码头停止运营30天,防止可能造成的环境损害。负责运营该码头的里海管道集团公司6日表示,它被迫执行法院的裁决浮岛囚牢被毁,帝释天开始行动,四大天王齐登场,杀心与悟空演戏国漫西行纪第四季动画已经更新到了第8集,古龙与唐三藏一行人的战斗暂时下线,全程都是天界的变化和战斗,场面一度劲爆,继三眼神将被抓后,持国天也迎来了危机,暗影天帝帝释天亲自下场玩偷袭海贼王皇副的专精能力,烬是防御,卡二是见闻色,三哥是大局观皇副是海贼王世界里的实力代表,虽然他们的个人实力不如四皇,但也都是屈指可数的存在,有的皇副甚至能够比肩四皇,可见皇副们的影响力还是不容忽视的。截至目前,海贼王中登场了七位皇副,分别同样演青年毛泽东,把侯京健和刘烨等人放一起看,差别出来了近几年,国产主旋律作品以鲜明的主题和生动的影视化表达,引起了大家的关注,尤其是去年,涌现出了一大批优质的国产主旋律剧。从觉醒年代大决战到功勋,每一部作品都质量过硬,成功掀起了观众的任何一艘美航母上,都要带足大量女兵?她们在航母上有什么作用美国是当今世界市场之上的第一大经济体,他们也有着非常强的军事实力,也有很多先进的军事设备,就比如说美国的航空母舰就非常的先进。不过值得我们注意的是,在每一艘美军的航空母舰之上都会带神秘的四中子露出真容?据美国科学新闻双周刊网站6月22日报道,关于传说中神秘的四中子,物理学家发现了迄今为止最明显的信号。60年来,研究人员一直在寻找四中子。然而,证明它们存在的证据一直不太可靠。现在,峰回路转iOS15。6Beta5发布小7迎来新生请先阅读我的15。6Beta234版本关联文章15。6Beta2更新报告15。6Beta3更新报告15。6Beta4更新报告一大早的惊喜早上9点多,发现iOS15。6有Beta5可一个小小的故事,让你真正的明白什么叫杠杆借力?如何去借力相信我们很多人都曾经听过阿基米德说的这句话给我一个支点,我就能撬起整个地球其实这句话说得一点都不假,这就是杠杆借力以最小的付出,通过支点和杠杆,获得的巨大回报,进而事半功倍。但是很洛阳高考601女孩被害,其哥哥也自杀身亡,这个家庭该怎么办?洛阳高考601女孩被害,其哥哥也自杀身亡,这个家庭该怎么办?试想一下,你们含辛茹苦地养了女儿18年,女儿也很听话努力,高考考了600分,而且是在农村这样教育环境落后的情况下。你们一凤凰永久为什么输给了捷安特?凤凰飞鸽永久,曾是国产自行车品牌的三颗明珠。遗憾的是,这些曾经的大牌没能跟上时代潮流,让捷安特美利达们后来居上。2021年,捷安特母公司巨大机械收入186亿元,而凤凰与永久的收入加
3月26日上午,又有6人落马,涉嫌严重违纪违法,严查大战进行中前言法网恢恢,疏而不漏!反腐倡廉是国家专门打贪官,除污吏的一项大斗争,漫长而又艰巨,老百姓也十分关心。我们总在说,权力斗争是一把双刃剑,既可以为当官者实现才华抱负的机会,也可能把他天津港煤码头公司一队原队长孔祥瑞从码头工人到蓝领专家(讲述一辈子一件事)2006年,孔祥瑞(左)和同事在检修港口装卸设备。天津港集团供图2017年,孔祥瑞(右)在职业技能竞赛中担任裁判长。受访者供图人物小传孔祥瑞,1955年1月生,天津市人,天津港中煤犹太人的经商法则犹太人出众的经商才能受到了大多数人的认可,一直以来他们被视为财富的象征。他们所信奉的犹太教法典塔木德也是一本财富的圣经,引领着犹太人走上了经商的道路。对于钱犹太人既没有敬之如神,又甲流该怎么预防?当下,正值我国冬春交替,容易暴发流感和诺如病毒感染这类季节性传染病。国家卫健委医疗应急司司长郭燕红日前透露,近期很多省份流感和诺如病毒感染等季节性传染病的聚集性发生,引起社会高度关国家级滑雪旅游度假地有哪些服务规范?文旅业向社会征求意见近日,全国旅游标准化技术委员会发布了旅游行业标准国家级滑雪旅游度假地管理和服务规范(公开征求意见稿)(以下简称规范),并向社会公开征求意见。规范主要内容侧重5个方面,包括国家级滑雪魏秋桦黄蓉,鱼玄机,练霓裳,都不如现实中的我风情万种在古天乐版本神雕侠侣中,除了一群杨过的小迷妹,其实剧中还有几位风姿绰约的中年妇人。比如雪梨扮演的李莫愁,魏秋桦扮演的黄蓉。众多版本之中,当属魏秋桦版本最具风情。其实除了黄蓉,她扮演江西,为何在控制彩礼的路上越来越狠?最近,一则官方通告把江西这个彩礼高地拉下神坛。3月2日,江西赣州大余县一则关于农村婚嫁彩礼举报公告引关注。公告中详细提出举报范围包括彩礼金额婚车数量婚宴桌数和每桌价格。农村婚嫁彩礼感受开放力度稳固外资信心外资是连接国内国际两个市场两种资源的重要纽带。前两个月,在世界经济面临衰退贸易保护主义不断抬头的背景下,中国稳外资仍交出了亮眼成绩单。商务部最新发布的数据显示,12月全国实际使用外微博之夜胡歌感谢妻子和刘亦菲,高情商的发言打了多少文盲的脸头条创作挑战赛胡歌和刘亦菲同时上台领奖,胡歌的获奖感言感谢妻子和刘亦菲,情商值拉的满满的。胡哥说首先他要感谢他的妻子,因为当妈妈真的很辛苦。然后他还要感谢他的女儿,因为可爱的女儿让3月26日,中国传来32个新消息,个人认为非常给力!3月26日,中国传来32个新消息,个人认为非常给力!32经济专家张捷提议让农民继续缴纳农业税,网友请你放过农民吧!对此,你们大家怎么看?网友1现在在家种地的都老人,年轻人没有在家种美国女预言家曾准确预测美国总统寿命,临终前她这样预言中国珍妮狄克逊(JeaneDixon)是一位知名的占星家和预言家,她在20世纪50年代和60年代曾经是美国最受欢迎的预言家之一。尽管她的预言和预测有着支持者和反对者,但她的名字至今仍然