springboot跨系统登录(springboot单点登录整合)
标题:《CSDN博文精选:SpringBoot跨系统单点登录的实现与拦截超时》
作者:代码忘烦恼
CSDN博客独家呈现,深入单点登录在SpringBoot中的实现与超时拦截,跟随我们的步伐,领略跨系统登录的前沿技术。
一、单点登录概念
单点登录(SSO),一种为多个相互关联且各自独立的软件系统提供访问控制的便捷属性。当用户成功登录后,即可获得对所有关联系统的访问权限,无需逐一登录每个系统。这一功能通常借助轻型目录访问协议(LDAP)实现,用户信息被存储在LDAP数据库中。单一退出(single sign-off)功能则允许用户通过一个退出动作,结束对多个系统的访问权限。
二、单点登录带来的益处
1. 降低访问第三方网站的风险(不存储用户密码或在外部进行管理)。
2. 减轻用户因记忆多种密码组合而带来的负担。
3. 减少重复输入密码的时间和麻烦。
4. 减少与密码相关的服务台咨询,降低IT成本。
三、单点登录技术实现
本次案例以SpringBoot结合Oauh2实现跨系统的单点登录。在众多语言中,都有各自的单点登录实现方案,而SpringBoot Oauh2方案因其稳定性和安全性受到广泛欢迎。
四、单点登录流程详解
想象一下,你的项目包含多个模块,如订单管理、商户管理、会员管理、财务管理等,这些模块都需要登录权限。通过单点登录,用户只需一次登录,即可访问所有模块。下面是清晰的单点登录流程描述:
图(来源自网络):展示单点登录的流程图。
图中清晰地描绘了单点登录的整个过程,这是最基础的登录流程。在OAuth2中,常用的授权模式包括密码模式、授权码模式、简化模式和客户端模式。其中,授权码模式因其稳定性和广泛应用而受到青睐。
想要更深入了解这些模式,推荐阅读阮一峰老师的OAuth2系列文章(
五、拦截超时是成功了还是未成功?
关于单点登录中的超时拦截问题,是确保用户会话安全的重要环节。成功的超时拦截能够确保用户在一定时间内未活动的情况下,自动退出系统或提示重新登录,从而保障系统的安全性和数据的完整性。而未成功的超时拦截则可能导致安全隐患。在实际应用中,开发者需要根据系统需求和技术框架选择合适的超时拦截策略,并对其进行严格测试和验证,以确保其有效性和可靠性。
结语:希望能让读者对SpringBoot跨系统单点登录有更深入的了解,并能在实际项目中灵活应用。也提醒开发者重视超时拦截的重要性,确保系统的安全性和稳定性。单点登录的前期准备与实现流程
我们创建了一个名为spring_sso_parent的普通maven工程作为整个项目的父工程。为了单点登录的需求,我们对此父工程进行了特定的配置和调整。
spring_sso_parent的依赖配置如下:
在XML格式下,我们设定了项目的依赖及版本,例如Spring Boot的starter-parent,以及Spring Security OAuth2的相关依赖。这些都是单点登录功能实现的基础组件。
紧接着,我们开始在spring_sso_parent父工程中添加子模块,名为oauth_server的SpringBoot工程。这个子模块专门用于实现单点登录的OAuth服务器功能。其依赖关系如下:
在oauth_server模块中,我们引入了Spring Boot的web启动器、thymeleaf模板引擎、Spring Security OAuth的相关依赖以及Spring Boot开发工具等。值得注意的是,这里使用的SpringBoot版本是由父模块决定的。
然后,在oauth_server模块中,我们创建了一个config的包,并在其中创建了一个名为WebSecurityConfig的类。这个类是单点登录的核心配置类。
WebSecurityConfig类使用了两个关键的注解:@Configuration和@Order(1)。@Configuration注解使得这个类成为一个配置类,用于定义Spring的安全配置。而@Order(1)注解则是用来设置加载顺序的,确保这个配置类的加载优先级。
我们还定义了一个PasswordEncoder的Bean,用于密码的加密处理。这在整个单点登录的流程中也是非常重要的一个环节。
我们来看如何配置请求的处理方式。在`http.requestMatchers`下,我们明确指定了哪些请求需要被接受。例如,只有访问`/login`和`/oauth/authorize`的请求会被接受。对于这两者的配置可以理解为安全的大门只向这两个入口敞开。而其他的所有请求,都必须通过身份认证才能访问,这就体现了`.authorizeRequests.anyRequest.authenticated`的配置意义。
接下来,我们谈谈登录配置。采用表单登录是常见的做法,默认的登录页面设在`/login`。任何人都可以访问这个页面,这是因为`.formLogin.loginPage("/login").permitAll`的配置允许任何人访问登录页面。为了加强安全性,我们关闭了CSRF保护,这是`.csrf.disable`配置的意义。
在内存验证方面,我们模拟了数据库查询的用户信息。通过`AuthenticationManagerBuilder`的配置,我们添加了一个用户名为admin、密码为123456、角色为ADMIN的用户。这是为了模拟真实环境中从数据库查询用户信息的情况。
然后,我们看到了`PasswordEncoder`的应用。这是Spring官方提供的MD5密码加密器,用于加密密码,增加安全性。
紧接着,我们转向OauthServerConfig的配置。这个类上使用了两个重要的注解:@Configuration(成为Spring的配置类)和@EnableAuthorizationServer(开启授权服务器认证)。这个类继承了AuthorizationServerConfigurerAdapter,提供了授权服务器的策略配置。
在这个类中,我们实现了两个关键的认证策略:AuthorizationServerSecurityConfigurer和ClientDetailsServiceConfigurer。在AuthorizationServerSecurityConfigurer中,我们设置了token的访问策略和检查token的访问策略。而在ClientDetailsServiceConfigurer中,我们配置了客户端的细节信息,如客户端ID、客户端密钥、授权模式、授权范围、自动授权、重定向URI以及访问令牌的有效时间等。
在OAuth2授权机制中,tokenKeyAccess和checkTokenAccess是两个重要的配置选项。它们允许资源服务器获取公钥并解码令牌,进而定义权限范围。这两项配置都运用了SpEL表达式,并默认处于未开启状态。对于tokenKeyAccess,我们采用了permitAll策略,这意味着访问/oauth/token_key的URL无需任何授权,使得OAuth本身的访问更加开放和便捷。
而在checkTokenAccess的配置中,我们设定了isAuthenticated的策略。这意味着,当资源服务器尝试通过/oauth/check_token的URL解码令牌时,必须确保access_token已经过授权验证。这样的设置增强了系统的安全性,确保了只有经过身份验证的客户端才能访问敏感资源。
在配置授权服务器的过程中,我们需要关注的一个重要环节是客户端的认证。为了完成这一任务,我们引入了ClientDetailsServiceConfigurer,它提供了三种认证方式以满足不同场景的需求。
通过clients.withClientDetails,我们可以使用数据库认证。这种方式允许我们将客户端的认证信息存储在数据库中,便于管理和维护。
我们可以选择jdbc认证方式,通过传入一个自定义的dataSource来实现。这种方式提供了更大的灵活性,让我们可以根据实际需求自定义数据存储方案。
还有一种内存认证方式,即clientsMemory。这种方式将认证信息写死在代码中,适用于简单的开发和测试环境。
完成上述配置后,我们的授权服务器就搭建完成了。接下来,我们需要创建一个controller包来定义相关的接口和逻辑。这个包将负责处理客户端的请求,并根据授权服务器的配置进行相应的认证和授权操作。通过这样的设计,我们可以构建一个功能完善、安全可靠的OAuth2授权服务器。创建LoginController:登录的控制器
作为一个控制器,我们首先需要创建一个LoginController类来处理登录相关的请求。使用@Controller注解来标识这个类是一个Spring MVC控制器。
```java
@Controller
public class LoginController {
@GetMapping("/login")
public String loginPage() {
// 返回登录页面
return "login";
}
}
```
这里返回的"login"是一个登录页面的HTML代码。该HTML代码可能如下所示:
```html
标准登陆
```
创建UserInfoController:获取认证成功的用户信息
再创建一个UserInfoController类,用于获取经过身份验证的用户的详细信息。使用@RestController注解来标识这个类是一个REST控制器,并处理与用户信息相关的请求。
```java
@RestController
public class UserInfoController {
private static final Logger logger = LoggerFactory.getLogger(UserInfoController.class);
@RequestMapping("/user")
public ResponseEntity
loggerfo("principal: {}", principal);
return new ResponseEntity<>(principal, HttpStatus.OK);
}
}
```
配置部分:
接下来是配置部分,包括应用程序的配置和OAuth客户端的依赖。这里只是简要概述,具体的配置细节可能需要根据实际需求进行调整。
在application.yml文件中配置服务器端口和上下文路径。例如:
```yaml
server:
port: 8880
servlet:
context-path: /auth
```
创建两个OAuth客户端:oauth_client1和oauth_client2。这里只提供了oauth_client1的Maven依赖配置示例。具体的依赖项可能需要根据所使用的库和框架进行调整。例如:
在Maven的pom.xml文件中添加以下依赖:
```xml
让我们创建一个配置类并添加两个注解:@Configuration用于定义配置类,而@EnableOAuth2Sso则启用了Oauth2的单点登录功能。接着,我们创建一个名为InfoController的控制器。在这个控制器中,我们定义了两个映射方法:一个是当用户访问"/getUser"时,会返回经过认证的用户信息;另一个是访问根路径"/"时,会返回一个简单的首页。首页上的登录链接将引导用户跳转到认证服务器进行登录授权。
接下来是index.html页面的内容,它是一个非常简单的登录页面,包含一个指向"/getUser"的链接用于登录。当用户点击这个链接时,会被引导到认证服务器进行身份验证。一旦验证成功,用户的信息就会被返回并显示在页面上。这就是单点登录的基本流程。
在application.yml文件中,我们配置了OAuth的相关参数。包括认证服务器的地址、端口号、上下文路径以及OAuth客户端的相关信息,如客户端ID和密码等。这些配置信息对于与认证服务器进行交互至关重要。
当我们启动认证服务器和客户端时,通过Chrome浏览器访问任一客户端的URL,就可以开始单点登录的流程。一旦在某一客户端完成登录授权,就可以无缝访问其他客户端的REST服务,无需再次进行身份验证。这就是OAuth2单点登录的魅力所在。
这个技术的实现,归根结底是Spring框架帮我们做了大量的底层工作。我们只需实现几个接口,就能轻松完成授权服务器的配置以及客户端的配置。这一点在当前的互联网环境下尤为重要,因为单点登录已经广泛应用于各个领域,如百度、贴吧、糯米等。掌握这项技术,无疑会为我们的职业发展增添一大亮点。
随着5G时代的来临,物联网的发展也日益火爆。身怀绝技的开发者们,别再让你们的IoT项目默默无闻了!在这个技术日新月异的时代,让我们一起学习、一起进步,共同迎接更加美好的未来。
如果你想深入了解更多关于Spring Cloud和OAuth2单点登录的知识,推荐大家查阅GitHub上的相关源码,如“spring_cloud_study”项目。也欢迎大家在CSDN博客上查阅***或分享自己的经验心得。让我们共同学习、共同成长!在成功打造一届备受瞩目的AI优秀案例评选活动后,我们迎来了全新的升级CSDN于2019年再次启动案例评选活动,并聚焦于物联网领域。这一次,我们将聚焦全球IoT领域的最前沿技