Spring Boot+OAuth2,一个注解搞定单点登录,Java组件化架构实践

  1. Spring Security+Spring Data Jpa 强强联手,安全管理只有更简单!

OAuth2 系列:

  1. 做微服务绕不过的 OAuth2,松哥也来和大家扯一扯

  2. 这个案例写出来,还怕跟面试官扯不明白 OAuth2 登录流程?

  3. 死磕 OAuth2,教练我要学全套的!

  4. OAuth2 令牌还能存入 Redis ?越玩越溜!

  5. 想让 OAuth2 和 JWT 在一起愉快玩耍?请看松哥的表演

  6. 和大家分享一点微服务架构中的安全管理思路

好了,开始今天的正文。

单点登录是我们在分布式系统中很常见的一个需求。

分布式系统由多个不同的子系统组成,而我们在使用系统的时候,只需要登录一次即可,这样其他系统都认为用户已经登录了,不用再去登录。前面和小伙伴们分享了 OAuth2+JWT 的登录方式,这种无状态登录实际上天然的满足单点登录的需求,可以参考:想让 OAuth2 和 JWT 在一起愉快玩耍?请看松哥的表演

当然大家也都知道,无状态登录也是有弊端的。

所以今天松哥想和大家说一说 Spring Boot+OAuth2 做单点登录,利用 @EnableOAuth2Sso 注解快速实现单点登录功能。

松哥依然建议大家在阅读本文时,先看看本系列前面的文章,这有助于更好的理解本文。

1.项目创建


前面的案例中,松哥一直都把授权服务器和资源服务器分开创建,今天这个案例,为了省事,我就把授权服务器和资源服务器搭建在一起(不过相信大家看了前面的文章,应该也能自己把这两个服务器拆分开)。

所以,今天我们一共需要三个服务:

| 项目 | 端口 | 描述 |

| :-- | :-- | :-- |

| auth-server | 1111 | 授权服务器+资源服务器 |

| client1 | 1112 | 子系统1 |

| client2 | 1113 | 子系统2 |

auth-server 用来扮演授权服务器+资源服务器的角色,client1 和 client2 则分别扮演子系统的角色,将来等 client1 登录成功之后,我们也就能访问 client2 了,这样就能看出来单点登录的效果。

我们创建一个名为 oauth2-sso 的 Maven 项目作为父工程即可。

2.统一认证中心


接下来我们来搭建统一认证中心。

首先我们创建一个名为 auth-server 的 module,创建时添加如下依赖:

项目创建成功之后,这个模块由于要扮演授权服务器+资源服务器的角色,所以我们先在这个项目的启动类上添加 @EnableResourceServer 注解,表示这是一个资源服务器:

@SpringBootApplication

@EnableResourceServer

public class AuthServerApplication {

public static void main(String[] args) {

SpringApplication.run(AuthServerApplication.class, args);

}

}

接下来我们进行授权服务器的配置,由于资源服务器和授权服务器合并在一起,因此授权服务器的配置要省事很多:

@Configuration

@EnableAuthorizationServer

public class AuthServerConfig extends AuthorizationServerConfigurerAdapter {

@Autowired

PasswordEncoder passwordEncoder;

@Override

public void configure(ClientDetailsServiceConfigurer clients) throws Exception {

clients.inMemory()

.withClient(“javaboy”)

.secret(passwordEncoder.encode(“123”))

.autoApprove(true)

.redirectUris(“http://localhost:1112/login”, “http://localhost:1113/login”)

.scopes(“user”)

.accessTokenValiditySeconds(7200)

.authorizedGrantTypes(“authorization_code”);

}

}

这里我们只需要简单配置一下客户端的信息即可,这里的配置很简单,前面的文章也讲过了,大家要是不懂,可以参考本系列前面的文章:这个案例写出来,还怕跟面试官扯不明白 OAuth2 登录流程?

当然这里为了简便,客户端的信息配置是基于内存的,如果大家想将客户端信息存入数据库中,也是可以的,参考:OAuth2 令牌还能存入 Redis ?越玩越溜!

接下来我们再来配置 Spring Security:

@Configuration

@Order(1)

public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Bean

PasswordEncoder passwordEncoder() {

return new BCryptPasswordEncoder();

}

@Override

public void configure(WebSecurity web) throws Exception {

web.ignoring().antMatchers(“/login.html”, “/css/", "/js/”, “/images/**”);

}

@Override

protected void configure(HttpSecurity http) throws Exception {

http.requestMatchers()

.antMatchers(“/login”)

.antMatchers(“/oauth/authorize”)

.and()

.authorizeRequests().anyRequest().authenticated()

.and()

.formLogin()

.loginPage(“/login.html”)

.loginProcessingUrl(“/login”)

.permitAll()

.and()

.csrf().disable();

}

@Override

protected void configure(AuthenticationManagerBuilder auth) throws Exception {

auth.inMemoryAuthentication()

.withUser(“sang”)

.password(passwordEncoder().encode(“123”))

.roles(“admin”);

}

}

关于 Spring Security 的配置,如果小伙伴们不懂,可以看看松哥最近正在连载的 Spring Security 系列。

我这里来大致捋一下:

  1. 首先提供一个 BCryptPasswordEncoder 的实例,用来做密码加解密用。

  2. 由于我自定义了登录页面,所以在 WebSecurity 中对这些静态资源方形。

  3. HttpSecurity 中,我们对认证相关的端点放行,同时配置一下登录页面和登录接口。

  4. AuthenticationManagerBuilder 中提供一个基于内存的用户(小伙伴们可以根据 Spring Security 系列第 7 篇文章自行调整为从数据库加载)。

  5. 另外还有一个比较关键的地方,因为资源服务器和授权服务器在一起,所以我们需要一个 @Order 注解来提升 Spring Security 配置的优先级。

SecurityConfig 和 AuthServerConfig 都是授权服务器需要提供的东西(如果小伙伴们想将授权服务器和资源服务器拆分,请留意这句话),接下来,我们还需要提供一个暴露用户信息的接口(如果将授权服务器和资源服务器分开,这个接口将由资源服务器提供):

@RestController

public class UserController {

@GetMapping(“/user”)

public Principal getCurrentUser(Principal principal) {

return principal;

}

}

最后,我们在 application.properties 中配置一下项目端口:

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
img

发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**
[外链图片转存中…(img-WJdTeeVB-1710891031172)]
[外链图片转存中…(img-nUWpgoTe-1710891031172)]
[外链图片转存中…(img-gv7QfsMg-1710891031173)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
[外链图片转存中…(img-MoNAMxE2-1710891031173)]

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值