应用办公生活信息教育商业
投稿投诉
商业财经
汽车智能
教育国际
房产环球
信息数码
热点科技
生活手机
晨报新闻
办公软件
科学动态
应用生物
体育时事

SpringCloud整合springsecurityoau

  设置通用父工程依赖
  在微服务构建中,我们一般用一个父工程来通知管理依赖的各种版本号信息。父工程pom文件如下:
  lt;?xmlversion1。0encodingUTF8?
  projectxmlnshttp:maven。apache。orgPOM4。0。0
  xmlns:xsihttp:www。w3。org2001XMLSchemainstance
  xsi:schemaLocationhttp:maven。apache。orgPOM4。0。0http:maven。apache。orgxsdmaven4。0。0。xsd
  4。0。0
  com。zjq
  oauth2demoartifactId
  pom
  1。0SNAPSHOT
  commons
  msgateway
  msoauth2server
  msregistry
  modules
  2。3。7。RELEASE
  Hoxton。SR9
  1。18。16
  3。11
  2。1。3
  8。0。22
  2。1。5RELEASE
  5。4。7
  20。0
  maven。compiler。source1。8maven。compiler。source
  maven。compiler。target1。8maven。compiler。target
  project。build。sourceEncodingUTF8project。build。sourceEncoding
  properties
  org。springframework。boot
  springbootdependenciesartifactId
  {springbootversion}
  pom
  import
  dependency
  org。springframework。cloud
  springclouddependenciesartifactId
  {springcloudversion}
  pom
  import
  dependency
  org。projectlombok
  lombokartifactId
  {lombokversion}
  dependency
  org。apache。commons
  commonslang3artifactId
  {commonslangversion}
  dependency
  org。mybatis。spring。boot
  mybatisspringbootstarterartifactId
  {mybatisstarterversion}
  dependency
  com。battcn
  swaggerspringbootstarterartifactId
  {swaggerstarterversion}
  dependency
  mysql
  mysqlconnectorjavaartifactId
  {mysqlversion}
  dependency
  cn。hutool
  hutoolallartifactId
  {hutoolversion}
  dependency
  com。google。guava
  guavaartifactId
  {guavaversion}
  dependency
  dependencies
  dependencyManagement
  org。springframework。boot
  springbootmavenpluginartifactId
  plugin
  plugins
  pluginManagement
  build
  project
  构建eureka注册中心
  在SpringCloud微服务体系中服务注册中心是一个必要的存在,通过注册中心提供服务的注册和发现。具体细节可以查看我之前的博客,这里不再赘述。我们开始构建一个eureka注册中心,对应的yml配置文件如下:
  server:
  port:8080
  spring:
  application:
  应用名称
  name:msregistry
  配置EurekaServer注册中心
  eureka:
  client:
  registerwitheureka:false
  fetchregistry:false
  serviceurl:
  defaultZone:http:localhost:8080eureka
  logging:
  pattern:
  console:d{HH:mm:ss}〔thread〕5levellogger{50}msgn
  对应的项目启动类代码如下:
  packagecom。zjq。msregistry;
  importorg。springframework。boot。SpringApplication;
  importorg。springframework。boot。autoconfigure。SpringBootApplication;
  importorg。springframework。cloud。netflix。eureka。server。EnableEurekaServer;
  注册中心
  authorzjq
  启动eureka注册中心服务端相关组件
  EnableEurekaServer
  SpringBootApplication
  publicclassMsRegistryApplication{
  publicstaticvoidmain(String〔〕args){
  SpringApplication。run(MsRegistryApplication。class,args);
  }
  }
  至此,一个单体的服务注册中心搭建完成。
  构建认证授权服务
  上文我们已经完成了注册中心的搭建,接下来我们开始搭建认证授权中心。
  配置文件设置
  我们同样在父工程下面新建一个子工程,作为认证授权中心的微服务。对应的yml文件和pom文件配置如下:
  application。yml
  server:
  port:8082端口
  spring:
  application:
  name:msoauth2server应用名
  数据库
  datasource:
  driverclassname:com。mysql。cj。jdbc。Driver
  username:root
  password:123456
  url:jdbc:mysql:127。0。0。1:3306oauth2?serverTimezoneAsiaShanghaicharacterEncodingutf8useUnicodetrueuseSSLfalse
  Redis
  redis:
  port:6379
  host:localhost
  timeout:3000
  database:1
  password:123456
  swagger
  swagger:
  basepackage:com。zjq。oauth2
  title:认证服务API接口文档
  Oauth2
  client:
  oauth2:
  clientid:appId客户端标识ID
  secret:123456客户端安全码
  授权类型
  granttypes:
  password
  refreshtoken
  token有效时间,单位秒
  tokenvaliditytime:3600
  refreshtokenvaliditytime:3600
  客户端访问范围
  scopes:
  api
  all
  配置EurekaServer注册中心
  eureka:
  instance:
  preferipaddress:true
  instanceid:{spring。cloud。client。ipaddress}:{server。port}
  client:
  serviceurl:
  defaultZone:http:localhost:8080eureka
  Mybatis
  mybatis:
  configuration:
  mapunderscoretocamelcase:true开启驼峰映射
  指标监控健康检查
  management:
  endpoints:
  web:
  exposure:
  include:暴露的端点
  logging:
  pattern:
  pom。xml
  lt;?xmlversion1。0encodingUTF8?
  projectxmlnshttp:maven。apache。orgPOM4。0。0
  xmlns:xsihttp:www。w3。org2001XMLSchemainstance
  xsi:schemaLocationhttp:maven。apache。orgPOM4。0。0http:maven。apache。orgxsdmaven4。0。0。xsd
  oauth2demoartifactId
  com。zjq
  1。0SNAPSHOT
  parent
  4。0。0
  msoauth2serverartifactId
  org。springframework。cloud
  springcloudstarternetflixeurekaclientartifactId
  dependency
  org。springframework。boot
  springbootstarterwebartifactId
  dependency
  org。springframework。boot
  springbootstarterdataredisartifactId
  dependency
  org。mybatis。spring。boot
  mybatisspringbootstarterartifactId
  dependency
  mysql
  mysqlconnectorjavaartifactId
  dependency
  org。springframework。cloud
  springcloudstartersecurityartifactId
  dependency
  org。springframework。cloud
  springcloudstarteroauth2artifactId
  dependency
  com。zjq
  commonsartifactId
  1。0SNAPSHOT
  dependency
  org。springframework。boot
  springbootconfigurationprocessorartifactId
  true
  dependency
  dependencies
  project
  Security配置类
  我们开始搭建SpringSecurity相关的配置类,具体配置类代码如下:
  packagecom。zjq。oauth2。server。config;
  importcn。hutool。crypto。digest。DigestUtil;
  importorg。springframework。context。annotation。Bean;
  importorg。springframework。context。annotation。Configuration;
  importorg。springframework。data。redis。connection。RedisConnectionFactory;
  importorg。springframework。security。authentication。AuthenticationManager;
  importorg。springframework。security。config。annotation。web。builders。HttpSecurity;
  importorg。springframework。security。config。annotation。web。configuration。EnableWebSecurity;
  importorg。springframework。security。config。annotation。web。configuration。WebSecurityConfigurerAdapter;
  importorg。springframework。security。crypto。password。PasswordEncoder;
  importorg。springframework。security。oauth2。provider。token。store。redis。RedisTokenStore;
  importjavax。annotation。Resource;
  Security配置类
  authorzjq
  Configuration
  EnableWebSecurity
  publicclassSecurityConfigurationextendsWebSecurityConfigurerAdapter{
  注入Redis连接工厂
  Resource
  privateRedisConnectionFactoryredisConnectionFactory;
  初始化RedisTokenStore用于将token存储至Redis
  return
  Bean
  publicRedisTokenStoreredisTokenStore(){
  RedisTokenStoreredisTokenStorenewRedisTokenStore(redisConnectionFactory);
  redisTokenStore。setPrefix(TOKEN:);设置key的层级前缀,方便查询
  returnredisTokenStore;
  }
  初始化密码编码器,用MD5加密密码
  Bean
  publicPasswordEncoderpasswordEncoder(){
  returnnewPasswordEncoder(){
  加密
  paramrawPassword原始密码
  return
  Override
  publicStringencode(CharSequencerawPassword){
  returnDigestUtil。md5Hex(rawPassword。toString());
  }
  校验密码
  paramrawPassword原始密码
  paramencodedPassword加密密码
  return
  Override
  publicbooleanmatches(CharSequencerawPassword,StringencodedPassword){
  returnDigestUtil。md5Hex(rawPassword。toString())。equals(encodedPassword);
  }
  };
  }
  初始化认证管理对象
  Bean
  Override
  publicAuthenticationManagerauthenticationManagerBean()throwsException{
  returnsuper。authenticationManagerBean();
  }
  放行和认证规则
  Override
  protectedvoidconfigure(HttpSecurityhttp)throwsException{
  http。csrf()。disable()
  。authorizeRequests()
  放行的请求
  。antMatchers(oauth,actuator)。permitAll()
  。and()
  。authorizeRequests()
  其他请求必须认证才能访问
  。anyRequest()。authenticated();
  }
  }
  Security配置类主要完成以下配置:
  注入Redis连接工厂
  初始化RedisTokenStore用于将token存储至Redis
  初始化密码编码器,用MD5加密密码
  初始化认证管理对象
  设置放行和认证规则
  授权服务配置类
  配置完了security配置类后,我们开始编写授权服务配置类,授权服务配置类需要继承AuthorizationServerConfigurerAdapter并重写对应的方法,tips:idea子类重写父类快捷键是CtrlO,重写后的授权服务配置类如下:
  packagecom。zjq。oauth2。server。config;
  importcom。zjq。commons。model。domain。SignInIdentity;
  importcom。zjq。oauth2。server。service。UserService;
  importorg。springframework。context。annotation。Configuration;
  importorg。springframework。security。authentication。AuthenticationManager;
  importorg。springframework。security。crypto。password。PasswordEncoder;
  importorg。springframework。security。oauth2。common。DefaultOAuth2AccessToken;
  importorg。springframework。security。oauth2。config。annotation。configurers。ClientDetailsServiceConfigurer;
  importorg。springframework。security。oauth2。config。annotation。web。configuration。AuthorizationServerConfigurerAdapter;
  importorg。springframework。security。oauth2。config。annotation。web。configuration。EnableAuthorizationServer;
  importorg。springframework。security。oauth2。config。annotation。web。configurers。AuthorizationServerEndpointsConfigurer;
  importorg。springframework。security。oauth2。config。annotation。web。configurers。AuthorizationServerSecurityConfigurer;
  importorg。springframework。security。oauth2。provider。token。store。redis。RedisTokenStore;
  importjavax。annotation。Resource;
  importjava。util。LinkedHashMap;
  授权服务配置类
  authorzjq
  Configuration
  EnableAuthorizationServer
  publicclassAuthorizationServerConfigurationextendsAuthorizationServerConfigurerAdapter{
  RedisTokenSore
  Resource
  privateRedisTokenStoreredisTokenStore;
  认证管理对象
  Resource
  privateAuthenticationManagerauthenticationManager;
  密码编码器
  Resource
  privatePasswordEncoderpasswordEncoder;
  客户端配置类
  Resource
  privateClientOAuth2DataConfigurationclientOAuth2DataConfiguration;
  登录校验
  Resource
  privateUserServiceuserService;
  配置令牌端点安全约束
  paramsecurity
  throwsException
  Override
  publicvoidconfigure(AuthorizationServerSecurityConfigurersecurity)throwsException{
  允许访问token的公钥,默认oauthtokenkey是受保护的
  security。tokenKeyAccess(permitAll())
  允许检查token的状态,默认oauthchecktoken是受保护的
  。checkTokenAccess(permitAll());
  }
  客户端配置授权模型
  paramclients
  throwsException
  Override
  publicvoidconfigure(ClientDetailsServiceConfigurerclients)throwsException{
  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());客户端访问范围
  }
  配置授权以及令牌的访问端点和令牌服务
  paramendpoints
  throwsException
  Override
  publicvoidconfigure(AuthorizationServerEndpointsConfigurerendpoints)throwsException{
  认证器
  endpoints。authenticationManager(authenticationManager)
  具体登录的方法
  。userDetailsService(userService)
  token存储的方式:Redis
  。tokenStore(redisTokenStore);
  }
  }
  上面用到的客户端配置类如下:
  packagecom。zjq。oauth2。server。config;
  importlombok。Data;
  importorg。springframework。boot。context。properties。ConfigurationProperties;
  importorg。springframework。stereotype。Component;
  客户端配置类
  authorzjq
  Component
  ConfigurationProperties(prefixclient。oauth2)
  Data
  publicclassClientOAuth2DataConfiguration{
  客户端标识ID
  privateStringclientId;
  客户端安全码
  privateStringsecret;
  授权类型
  privateString〔〕grantTypes;
  token有效期
  privateinttokenValidityTime;
  refreshtoken有效期
  privateintrefreshTokenValidityTime;
  客户端访问范围
  privateString〔〕scopes;
  }
  具体登录的方法实现:
  登录实现
  packagecom。zjq。oauth2。server。service;
  importcom。zjq。commons。model。domain。SignInIdentity;
  importcom。zjq。commons。model。pojo。Users;
  importcom。zjq。commons。utils。AssertUtil;
  importcom。zjq。oauth2。server。mapper。UsersMapper;
  importorg。springframework。beans。BeanUtils;
  importorg。springframework。security。core。userdetails。UserDetails;
  importorg。springframework。security。core。userdetails。UserDetailsService;
  importorg。springframework。security。core。userdetails。UsernameNotFoundException;
  importorg。springframework。stereotype。Service;
  importjavax。annotation。Resource;
  登录校验
  authorzjq
  Service
  publicclassUserServiceimplementsUserDetailsService{
  Resource
  privateUsersMapperusersMapper;
  Override
  publicUserDetailsloadUserByUsername(Stringusername)throwsUsernameNotFoundException{
  AssertUtil。isNotEmpty(username,请输入用户名);
  UsersusersusersMapper。selectByAccountInfo(username);
  if(usersnull){
  thrownewUsernameNotFoundException(用户名或密码错误,请重新输入);
  }
  初始化登录认证对象
  SignInIdentitysignInIdentitynewSignInIdentity();
  拷贝属性
  BeanUtils。copyProperties(users,signInIdentity);
  returnsignInIdentity;
  }
  }
  UsersMapper:
  packagecom。zjq。oauth2。server。mapper;
  importcom。zjq。commons。model。pojo。Users;
  importorg。apache。ibatis。annotations。Param;
  importorg。apache。ibatis。annotations。Select;
  用户Mapper
  authorzjq
  publicinterfaceUsersMapper{
  根据用户名or手机号or邮箱查询用户信息
  paramaccount
  return
  Select(selectid,username,nickname,phone,email,
  password,avatarurl,roles,isvalidfromtuserswhere
  (username{account}orphone{account}oremail{account}))
  UsersselectByAccountInfo(Param(account)Stringaccount);
  }
  用户实体:
  packagecom。zjq。commons。model。pojo;
  importcom。zjq。commons。model。base。BaseModel;
  importlombok。Getter;
  importlombok。Setter;
  用户实体类
  Authorzjq
  Date20221012
  Getter
  Setter
  publicclassUsersextendsBaseModel{
  主键
  privateIntegerid;
  用户名
  privateStringusername;
  昵称
  privateStringnickname;
  密码
  privateStringpassword;
  手机号
  privateStringphone;
  邮箱
  privateStringemail;
  头像
  privateStringavatarUrl;
  角色
  privateStringroles;
  }
  packagecom。zjq。commons。model。base;
  importlombok。Getter;
  importlombok。Setter;
  importjava。io。Serializable;
  importjava。util。Date;
  实体对象公共属性
  Authorzjq
  Date20221012
  Getter
  Setter
  publicclassBaseModelimplementsSerializable{
  privateIntegerid;
  privateDatecreateDate;
  privateDateupdateDate;
  privateintisValid;
  }
  到此,我们完成了认证授权服务构建,接下来我们进行测试验证:
  测试验证
  我们启动注册中心和认证授权微服务。访问注册中心:http:localhost:8080
  可以看到认证授权服务已经注册到注册中心。
  接下来我们通过postman访问请求token测试:
  接下来我们通过postman访问请求token测试:
  Authorization请求头中配置,username和password,对应oauth客户端中的配置:
  在body中配置请求参数,发起请求后返回如下:
  在Redis中我们也可以看到生成的相关token配置:
  至此,我们完成了认证授权中心的初步搭建。
  版权声明:本文为CSDN博主共饮一杯无
  原文链接:https:blog。csdn。netqq35427589articledetails127340635

应用程序无法正常启动0xc0000022怎么办?最近有位朋友遇到了一些电脑问题,在打开某个程序的时候,出现了应用程序无法正常启动0xc0000022的错误提示,不知道如何解决。那么这种0xc0000022错误到底是怎么回事呢……核子基因正准备IPO,实控人张核子掌握89家公司丨邦早报【核子基因累计已做7亿次核酸,正准备IPO】11月28日上午,在位于深圳市南山区的核子基因总部办公室的现场看到,核子基因工作人员基本都在正常工作,进门后两侧的墙上挂着大量的专利……卡塔尔世界杯是一场气候灾难当世界足球管理机构国际足球联合会(FIFA)宣布2022年卡塔尔世界杯将是一场完全碳中和的赛事时,环保主义者发出的集体欢声笑语本可以为风电场提供动力。非营利环保组织碳市场观察(……DNF搬砖新搬砖地图来了,一管疲劳300W,不是森林也不是海现在提起搬砖二字,心里总是莫名的悲伤,可爱恩山一去不复返,旧爱没了,新欢却没有到来,一剂重锤落在背上的感觉!但日子还是要过,只能另想办法了。今天就再次来盘一盘当前搬砖路子。……5000分里程碑,杜兰特早就看好他了雷霆队客场不敌火箭队!在第三节中段,雷霆核心亚历山大已经得到了22分。据统计,凭借着今天得到的这22分,亚历山大个人总得分突破了5000分大关(本场之前为4979分……你知道熬夜的危害有多大吗?你们都熬夜吗?你们也都知道熬夜不好,但是你们知道熬夜到底有多大危害吗?今天用这篇文章来告诉你们。用两个字来形容,熬夜就是作S,如果把它给细分出来是这样的,我们人啊,实际上……科学家创业者中科水研张武雄传统行业更需要科技升级2012年,中国科学院上海微系统与信息技术研究所(下称上海微系统所)的研究员张武雄开始参与国家南水北调工程一个信息化项目规划工作时惊讶地发现,中国水利监测设备中90以上的核心芯……极空间私有云Z4,重新定义何为智能化的无忧存储虽然最近各地陆续放开疫情管控,但是因为单位接二连三出现小阳人,加上孩子学校也时有确诊,所以我居家办公,孩子居家上网课。为了给孩子保留课程视频,所以之前就考虑了很久大容量的存储神……吃哪些水果补锌锌是人体必须的一种微量元素,除了药物补锌外,日常的饮食也可以补锌,比如一些水果也是富含锌的,多吃也可以补充的,那么,吃哪些水果补锌?我们一起来看看吧。吃哪些水果补锌……OTA巨头同程旅行豪掷10亿投资五家公司,旅游度假市场复苏了本文来源:时代财经作者:钟黛图片来源:图虫创意旅游业复苏预期提升,同程旅行披露多笔投资,获得更强的供应链及服务能力。12月29日晚间,同程旅行(0780。HK……东莞的落羽杉红了,你被刷屏了吗?在阳光和暖的东莞冬日里在四周常绿乔木映衬下大片棕红色的落羽杉成为耀眼的存在东莞的落羽杉已进入最佳观赏期现在,就让我们一起来置身这缤纷的色彩中!……人生相遇已然不易,相知相爱更为艰难情感点评大赏爱滚滚红尘,它五彩缤纷绚烂多姿,却又藏污纳垢凌乱不堪奔忙其中,或为之痴迷,或彷徨无依,渐渐沉沦其中无法自拔我忘了时间,忘了身在何处,忘了曾经的执念……
魔兽副本介绍剃刀高地在那错综复杂的荆棘迷宫中居住着大群忠诚的野猪人军队以及他们的高等牧师亡首部族。然而最近,一股阴影力量笼罩了这个原始的洞穴。亡灵天灾的人在巫妖寒冰之王亚门纳尔的带领下控制了……中超1逆转武汉队成功保级,罗皓孙凯建功中超联赛最后一轮打响,武汉队迎战重庆两江竞技。上半场武汉队由洛佩斯率先破门,下半场重庆队3分钟2球,罗皓、孙凯建功,重庆队反超比分。最终,重庆队21逆转武汉队,以保级组第5的成……赵丽颖真的是闷声干大事!新代言颜值大飙升,穿粉裙气质罕见开挂赵丽颖自从新剧开机后,基本就属于断联的情况,不过从最新曝光的新代言来看,赵丽颖也是闷声干大事的人。在曝光最新代言中,赵丽颖可谓是形象大变,不仅颜值出众,而且胖了一些的她反而少女……哪个皮肤是六元皮肤的天花板?唯有两款超过9分,达摩拳王上榜大家好我是指尖,六元皮肤的受欢迎程度远比你想象得更高,低廉的价格能买到勇者的皮肤,的确是一些零冲党们的开口神皮,王者荣耀运营了这么久了,粗略计算一下已经上了24款六元皮肤(野性……经常睡到半夜23点就醒,是怎么回事?是身体出问题了吗?拥有高质量的睡眠是正确保养身体的一种表现,其实人体一生将近13的时间都是在睡眠中度过的,如果拥有一个好的睡眠,身体各个脏器组织才能得到良好的修复,是维持机体健康的前提。但……国内油价或迎五连降,8月19日油价调整最新消息8月23号晚上的24时国内第16轮的油价调整将正式开启,经过8个工作日的油价统计,新一轮的油价调整走势如何呢?今年的油价五连降会来吗?国际油价消息今天是8月19日星期五,……这个季节到昌平,会有怎样的体验?这个季节到昌平会有怎样的体验?末伏已过,体感马上舒适了许多,这几天昌平正是风和日丽又不闷热的天气,非常适合外出运动或出游。近期,第十三届北京奥运城市体育文化节也选在昌平举……张天爱机场穿搭Look1外套:LOEWESS22格纹拼色翻领长衬衫多色背心:SMFKCompass黑夜之花连身舞蹈背心午夜黑颈环:SMFKCompass十字花细复古皮质颈环……垚和健闻真正的营养叫做营养均衡失去健康,如同杯子打碎,再去修复,是非常困难的。但是,在杯子掉下之前,移动一个安全的位置,就非常容易。好在我们的身体,比杯子多了一种能力,就是,进食,提供身体更新所需要的……为什么不是夫妻关系也可以入住酒店同一间房?前台有这几类人如今人们的收入提高了,外出的机会也多了,比如说出去旅游,或者是工作上有安排需要去外地等等,在这样的情况下,人们都需要在外面住酒店。(此处已添加小程序,请到今日头条客户端查看)……众望所归!守望归来全新战令让玩家大呼我可以在《守望先锋》归来宣布全网免费的时候,就已经有玩家在猜测,接下来是否就应该再出个类似通行证的系统,这样才能够保证游戏的持续收入。果不其然,归来很快就宣布了战令系统的推出计……给巴萨法务记一功!孔德终于注册上了网罗天下体育事,每每想来吐一槽。今天有啥值得说一说的呢?巴萨引用特例为孔德注册周日,巴塞罗那俱乐部公布了本轮西甲主场对阵巴拉多利德的大名单,今夏新加盟球队的法国后卫……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网