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十字花细复古皮质颈环……
垚和健闻真正的营养叫做营养均衡失去健康,如同杯子打碎,再去修复,是非常困难的。但是,在杯子掉下之前,移动一个安全的位置,就非常容易。好在我们的身体,比杯子多了一种能力,就是,进食,提供身体更新所需要的……
为什么不是夫妻关系也可以入住酒店同一间房?前台有这几类人如今人们的收入提高了,外出的机会也多了,比如说出去旅游,或者是工作上有安排需要去外地等等,在这样的情况下,人们都需要在外面住酒店。(此处已添加小程序,请到今日头条客户端查看)……
众望所归!守望归来全新战令让玩家大呼我可以在《守望先锋》归来宣布全网免费的时候,就已经有玩家在猜测,接下来是否就应该再出个类似通行证的系统,这样才能够保证游戏的持续收入。果不其然,归来很快就宣布了战令系统的推出计……
给巴萨法务记一功!孔德终于注册上了网罗天下体育事,每每想来吐一槽。今天有啥值得说一说的呢?巴萨引用特例为孔德注册周日,巴塞罗那俱乐部公布了本轮西甲主场对阵巴拉多利德的大名单,今夏新加盟球队的法国后卫……