SpringCloud搭建微服务之OAuth2实现SSO单点登录
创始人
2024-02-27 14:49:58

SSO单点登录实现方式有多种,在这里不介绍理论,本文只讨论采用spring-security-oauth2来实现,本文共有三个服务,一个权限认证中心,两个客户端

1. 认证服务搭建

1.1. 引入核心依赖

org.springframework.bootspring-boot-starter-web

org.springframework.security.oauthspring-security-oauth22.3.8.RELEASE

1.2. 配置application.yml文件

server:port: 8830servlet:context-path: /auth
spring:application:name: cloud-oss-authorization-server

1.3. 编写主启动类

@EnableResourceServer
@SpringBootApplication
public class OssAuthorizationServerApplication {public static void main(String[] args) {SpringApplication.run(OssAuthorizationServerApplication.class, args);}
}

可以将Authorization Server和Resource Server放在同一个服务里

1.4. 编写SecurityConfig配置类

@Order(1)
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.inMemoryAuthentication().withUser("admin").password(passwordEncoder().encode("123456")).roles("USER");}@Overrideprotected void configure(HttpSecurity http) throws Exception {http.requestMatchers().antMatchers("/login", "/oauth/authorize").and().authorizeRequests().anyRequest().authenticated().and().formLogin().permitAll().and().csrf().disable();}@Beanpublic BCryptPasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}
}

1.5. 编写AuthorizationServerConfig配置类

@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {@Autowiredprivate BCryptPasswordEncoder passwordEncoder;@Overridepublic void configure(AuthorizationServerSecurityConfigurer security) throws Exception {security.tokenKeyAccess("permitAll()").checkTokenAccess("isAuthenticated()");}@Overridepublic void configure(ClientDetailsServiceConfigurer clients) throws Exception {clients.inMemory().withClient("SampleClientId").secret(passwordEncoder.encode("secret")).authorizedGrantTypes("authorization_code").scopes("user_info").autoApprove(true).redirectUris("http://localhost:8831/ui1/login", "http://localhost:8832/ui2/login");}
}

1.6. 编写UserController类

@RestController
public class UserController {@RequestMapping(value = "/user/me")public Principal user(Principal principal) {System.out.println(principal);return principal;}
}

2. 客户端服务搭建

分别新建两个客户端微服务8831和8832

2.1. 引入核心依赖

org.springframework.bootspring-boot-starter-web

org.springframework.bootspring-boot-starter-security

org.springframework.security.oauth.bootspring-security-oauth2-autoconfigure

org.springframework.bootspring-boot-starter-thymeleaf

org.thymeleaf.extrasthymeleaf-extras-springsecurity5

2.2. 配置application.yml文件

server:port: 8831 #另一个服务端口8832servlet:context-path: /ui1 #另一个服务路径/ui2register-default-servlet: truesession:cookie:name: UISESSION1 #另一个服务cookie nameUISESSION2
spring:application:name: cloud-sso-client8831 #另一个服务名称cloud-sso-client8832thymeleaf:cache: false
security:basic:enabled: falseoauth2:client:client-id: SampleClientIdclient-secret: secretaccess-token-uri: http://localhost:8830/auth/oauth/tokenuser-authorization-uri: http://localhost:8830/auth/oauth/authorizeresource:user-info-uri: http://localhost:8830/auth/user/me

2.3. 编写服务启动类

@SpringBootApplication
public class OssClientApplication extends SpringBootServletInitializer {@Beanpublic RequestContextListener requestContextListener() {return new RequestContextListener();}public static void main(String[] args) {SpringApplication.run(OssClientApplication.class, args);}
}

2.4. 编写SecurityConfig配置类

@Configuration
@EnableOAuth2Sso
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.antMatcher("/**").authorizeRequests().antMatchers("/", "/login/**").permitAll().anyRequest().authenticated();}
}

2.5. 编写WebConfig配置类

@EnableWebMvc
@Configuration
public class WebConfig implements WebMvcConfigurer {@Beanpublic static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {return new PropertySourcesPlaceholderConfigurer();}@Overridepublic void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {configurer.enable();}@Overridepublic void addViewControllers(ViewControllerRegistry registry) {registry.addViewController("/").setViewName("forward:/index");registry.addViewController("/index");registry.addViewController("/securedPage");}@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");}
}

2.6. 编写登录页面index.html



Spring Security SSO Client 1


Spring Security SSO Client 1

Login

2.7. 编写登录后跳转页



Spring Security SSO

Secured Page

Welcome, Name

3. 验证

依次启动三个微服务cloud-oss-authorization-server、cloud-sso-client8831和cloud-sso-client8832
浏览器地址栏输入http://localhost:8831/ui1/
登录页
点击Login进入单点登录页
登录
输入用户名和密码admin/123456
跳转后页面

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...