Spring Boot+OAuth2,一个注解搞定单点登录!

}

这里我们只需要简单配置一下客户端的信息即可,这里的配置很简单,前面的文章也讲过了,大家要是不懂,可以参考本系列前面的文章:这个案例写出来,还怕跟面试官扯不明白 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 中配置一下项目端口:

server.port=1111

另外,松哥自己提前准备了一个登录页面,如下:

将登录页面相关的 html、css、js 等拷贝到 resources/static 目录下:

这个页面很简单,就是一个登录表单而已,我把核心部分列出来:

登录

注意一下 action 提交地址不要写错即可。

文末可以下载源码。

如此之后,我们的统一认证登录平台就算是 OK 了。

3.客户端创建


接下来我们来创建一个客户端项目,创建一个名为 client1 的 Spring Boot 项目,添加如下依赖:

项目创建成功之后,我们来配置一下 Spring Security:

@Configuration

@EnableOAuth2Sso

public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Override

protected void configure(HttpSecurity http) throws Exception {

http.authorizeRequests().anyRequest().authenticated().and().csrf().disable();

}

}

这段配置很简单,就是说我们 client1 中所有的接口都需要认证之后才能访问,另外添加一个 @EnableOAuth2Sso 注解来开启单点登录功能。

接下来我们在 client1 中再来提供一个测试接口:

@RestController

public class HelloController {

@GetMapping(“/hello”)

public String hello() {

Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

return authentication.getName() + Arrays.toString(authentication.getAuthorities().toArray());

}

}

这个测试接口返回当前登录用户的姓名和角色信息。

接下来我们需要在 client1 的 application.properties 中配置 oauth2 的相关信息:

security.oauth2.client.client-secret=123

security.oauth2.client.client-id=javaboy

security.oauth2.client.user-authorization-uri=http://localhost:1111/oauth/authorize

security.oauth2.client.access-token-uri=http://localhost:1111/oauth/token

security.oauth2.resource.user-info-uri=http://localhost:1111/user

server.port=1112

server.servlet.session.cookie.name=s1

这里的配置也比较熟悉,我们来看一下:

  1. client-secret 是客户端密码。

  2. client-id 是客户端 id。

  3. user-authorization-uri 是用户授权的端点。

  4. access-token-uri 是获取令牌的端点。

  5. user-info-uri 是获取用户信息的接口(从资源服务器上获取)。

  6. 最后再配置一下端口,然后给 cookie 取一个名字。

如此之后,我们的 client1 就算是配置完成了。

按照相同的方式,我们再来配置一个 client2,client2 和 client1 一模一样,就是 cookie 的名字不同(随意取,不相同即可)。

4.测试


接下来,我们分别启动 auth-server、client1 和 client2,首先我们尝试去方式 client1 中的 hello 接口,这个时候会自动跳转到统一认证中心:

然后输入用户名密码进行登录。

登录成功之后,会自动跳转回 client1 的 hello 接口,如下:

此时我们再去访问 client2 ,发现也不用登录了,直接就可以访问:

OK,如此之后,我们的单点登录就成功了。

5.流程解析


最后,我再来和小伙伴们把上面代码的一个执行流程捋一捋:

  1. 首先我们去访问 client1 的 /hello 接口,但是这个接口是需要登录才能访问的,因此我们的请求被拦截下来,拦截下来之后,系统会给我们重定向到 client1 的 /login 接口,这是让我们去登录。

  1. 当我们去访问 client1 的登录接口时,由于我们配置了 @EnableOAuth2Sso 注解,这个操作会再次被拦截下来,单点登录拦截器会根据我们在 application.properties 中的配置,自动发起请求去获取授权码:

  1. 在第二步发送的请求是请求 auth-server 服务上的东西,这次请求当然也避免不了要先登录,所以再次重定向到 auth-server 的登录页面,也就是大家看到的统一认证中心。
    自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

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

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

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

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

学习视频:

大厂面试真题:

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!**

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

学习视频:

[外链图片转存中…(img-iScnmgKH-1713388978357)]

大厂面试真题:

[外链图片转存中…(img-HV6u98cU-1713388978358)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 19
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值