springSecurity+oauth2认证记录(仅记录)

本文详述了单点登录(SSO)流程,重点解析了JWT在端口8888(认证服务器)与8081(客户端)间的应用。通过授权码模式获取token,实现跨域资源访问。探讨了前后端分离环境下,如何解决前端获取token的问题。

1 整体大致流程。

  ★★★★★端口8888为资源(认证服务器),端口8081为客户端。需要授权8081可以获取8888端口信息,通过授权码模式获取token进行获取。简而言之也是通过JWT(由头部,载荷,签名生成的取代session的跨域工具)实现单点登录。8081进入8888进行具体授权流程,8888返回code值到8081,在8081进行处理,通过code换取8888的JWT(即token信息)。8081拿到8888的token信息后可以携带token和scope(授权域)去获取认证服务器(8888)内资源。★★★★★

 

2 源码解读

 认证过程

首先由客户端向服务端(授权服务器)获取code(直接由前端发送href请求即可),链接模版如下

host:8888/oauth/authorize?client_id=此客户端的唯一标识(存取在授权服务器数据库中)&scope=授权域(授权域和授权服务器内授权域匹配上才会返回code并在接下流程中返回的token内将相应scopo加密)&response_type=(返回授权类型,code等)&redirect_uri=http://localhost:8081/sss/sss/redirect(授权服务器生成code后重定向的url)。

其中部分源码解读如下图

★★★★★登录成功后,进入自定义的登录成功处理器★★★★★源码如下

此时重定向到获取code链接即:

host:8888/oauth/authorize?client_id=此客户端的唯一标识(存取在授权服务器数据库中)&scope=授权域(授权域和授权服务器内授权域匹配上才会返回code并在接下流程中返回的token内将相应scopo加密)&response_type=(返回授权类型,code等)&redirect_uri=http://localhost:8081/sss/sss/redirect(授权服务器生成code后重定向的url)。

源码如下:

默认从内存中加载!!!!!到这一路往下走就行。知道返回code到之前我们给的URL。此时我们可以自定义授权页面。接口是配合thymeleaf,自定义页面。我们写的接口和框架接口有重复会自动覆盖。!!!!

其次,客户端携带code去换取token。

 

问题!!!!

前后端分离情况下,由于前端并未发起请求,整体授权流程后台操作。生成的token前端获取不到!!!

解决!!!

将授权的回调url不写入security的放行路径。此时生成code认证服务器返回到客户端被拦截到前端。前端拿到code进行ajax请求,返回授权token。将此token存储到localstorage,请求后端时加入header即可。

 

 

### 使用 Spring SecurityOAuth2.1 构建认证中心 #### 配置依赖项 为了创建一个基于 Spring SecurityOAuth2.1 的认证中心,项目应引入必要的 Maven 或 Gradle 依赖。这通常涉及添加 `spring-boot-starter-security`、`spring-boot-starter-oauth2-client` 及其他相关库。 ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.springframework.security.oauth.boot</groupId> <artifactId>spring-security-oauth2-autoconfigure</artifactId> <version>${spring.security.oauth.version}</version> </dependency> ``` #### 设置应用属性 配置文件中需定义客户端详情服务以及令牌端点的位置等参数: ```properties server.port=8080 security.oauth2.client.registration.myapp.client-id=myclientid security.oauth2.client.registration.myapp.client-secret=mypassword security.oauth2.client.provider.myapp.token-uri=http://localhost:9000/oauth/token ``` #### 创建授权服务器 通过自定义类来启动授权服务器并注册各种类型的授予方式(如密码模式、刷新令牌等)。下面是一个简单的例子展示如何完成此操作[^1]。 ```java @Configuration(proxyBeanMethods = false) public class AuthorizationServerConfig { @Value("${jwt.key-store}") private String keyStore; @Value("${jwt.key-password}") private String keyPassword; @Bean public RegisteredClientRepository registeredClientRepository() { RegisteredClient registeredClient = RegisteredClient.withId(UUID.randomUUID().toString()) .clientId("myclient") .clientSecret("{noop}mypassword") .authorizationGrantType(AuthorizationGrantType.PASSWORD) .tokenSettings(TokenSettings.builder() .accessTokenTimeToLive(Duration.ofHours(1)) .build()) .build(); return new InMemoryRegisteredClientRepository(registeredClient); } } ``` #### 增强 JWT 令牌 为了让生成的访问令牌携带更多信息,在这里实现了 `TokenEnhancer` 接口的方法,以便向每个发出的令牌附加额外的数据字段,比如用户的唯一标识符或其他业务逻辑所需的信息[^3]。 ```java @Component public class JwtTokenEnhancer implements TokenEnhancer { @Override public OAuth2AccessToken enhance(OAuth2AccessToken accessToken, OAuth2Authentication authentication) { UserModel securityUser = (UserModel)authentication.getPrincipal(); Map<String,Object> info=new HashMap<>(); // 把用户 ID 设置到 JWT 中 info.put("id",securityUser.getId()); ((DefaultOAuth2AccessToken)accessToken).setAdditionalInformation(info); return accessToken; } } ``` #### 安全配置 最后一步是对整个应用程序的安全策略进行调整,确保只有经过验证后的请求才能到达受保护的服务接口。可以通过继承 `WebSecurityConfigurerAdapter` 类或者使用新的安全 DSL 来简化这一过程。 ```java @EnableWebSecurity(debug=true) public class SecurityConfiguration extends WebSecurityConfigurerAdapter { protected void configure(HttpSecurity http)throws Exception{ http.authorizeRequests(authorize->authorize.anyRequest().authenticated()) .formLogin(withDefaults()); } } ``` 上述代码片段展示了如何利用 Spring Security 结合 OAuth2 协议建立一个基本的身份验证服务中心。实际部署时还需要考虑更多因素,例如错误处理机制的设计、日志记录等功能模块的完善等问题。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值