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