时间:2021-05-20
什么是单点登陆
单点登录(英语:Single sign-on,缩写为 SSO),又译为单一签入,一种对于许多相互关连,但是又是各自独立的软件系统,提供访问控制的属性。当拥有这项属性时,当用户登录时,就可以获取所有系统的访问权限,不用对每个单一系统都逐一登录。这项功能通常是以轻型目录访问协议(LDAP)来实现,在服务器上会将用户信息存储到LDAP数据库中。相同的,单一退出(single sign-off)就是指,只需要单一的退出动作,就可以结束对于多个系统的访问权限。
单点登陆带来的好处
单点登陆技术
现在很多语言都拥有自己的单点登陆实现方案,本次案例中我们用SpringBoot Oauh2来实现跨系统的单点登陆
单点登陆 流程
你的项目可能有很多个模块,如订单管理、商户管理、会员管理、财务管理,这些都是需要登陆后才能访问,当我只要登陆一次,其它的系统都能访问。
ps这张图网上找的,也是最清晰描述单点登陆的流程,如上图就是最基本的单点登陆流程。
oauth2 的四种模式:
我们一般都用授权码模式 这个模式用的人也最多。
这几种模式如果想要了解的更清楚可以看阮一峰老师的oauth2
阮一峰老师的oauth2精讲
单点登陆准备工作
首先我们创建一个叫spring_sso_parent 普通的maven工程 作为整个项目的父工程,创建好后,删除src目录,并且修改pom.xml的依赖
spring_sso_parent 父工程的依赖如下:
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://.scitc</groupId> <artifactId>oauth_clinet1</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <name>oauth_clinet1</name> <description>this is client1</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <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>${oauth-auto.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build></project>同样创建一个config 包 并且创建一个 Oauth2ClientSeurityConfig这个类
@Configuration@EnableOAuth2Ssopublic class Oauth2ClientSeurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable() //关闭csrf保护 .antMatcher("/**") //使用以任意开头的url .authorizeRequests() // 配置路径拦截,表明路径访问所对应的权限,角色,认证信息 .antMatchers("/", "/login**") //控制不同的url接受不同权限的用户访问 .permitAll()// 允许所有人访问 .anyRequest() .authenticated(); //除了以上请求都需要身份认证 }}这个类继承了 WebSecurityConfigurerAdapter 这个SpringSecurity的适配器,实现了HttpSecurity 的 configure 方法。 这个类也是两个注解 @Configuration 成为一个配置类,
@EnableOAuth2Sso 启用Oauth2的单点登陆。
我们再创建一个controller 包 ,并且创建一个 InfoController
@Controllerpublic class InfoController { @GetMapping("/getUser") public ResponseEntity<Object> userPage(Principal principal) { //客户端认证成功后返回这个用户信息 return new ResponseEntity<Object>(principal, HttpStatus.OK); } @GetMapping("/") public String indexPage() { return "index"; }}index.html 页面
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>index</title></head><body><h1>请登录授权</h1><a href="/getUser" rel="external nofollow" >login</a></body></html>application.yml
auth-server: http://localhost:8880/authserver: port: 8881 servlet: context-path: /security: basic: enabled: false oauth2: client: clientId: handleCilentId clientSecret: secret accessTokenUri: ${auth-server}/oauth/token userAuthorizationUri: ${auth-server}/oauth/authorize resource: userInfoUri: ${auth-server}/userspring: thymeleaf: cache: falseauth-server:是目标认证服务器
clientId: 目标认证服务器设置的客户端id
clientSecret: 目标认证服务器设置的密码
accessTokenUri:从目标认证服务器获取令牌token
userAuthorizationUri:从目标认证服务器请求授权默认url是/oauth/authorize
userInfoUri: 从目标认证服务器上将认证信息Principal通过形参绑定的方法通过URL的方式获取用户信息
oauth_client2配置和 oauth_client1是一样的
我们启动 认证服务器oauth_server 和 两个客户端 oauth_client1 和 oauth_client2
chrome 浏览器访问 localhost:8881
当我们点击login的时候会跳转到认证服务器进行登陆授权
授权成功后 返回了 这个用户的所有的信息
我们再去访问localhost:8082
当我点击登陆的时候 ,并没有出现登陆授权,直接拿到了用户信息
注意这里我们不管是访问客户端1还是客户端2 ,还是n多个客户端,只要有一个授权成功 那么访问其它的客户端就不需要登陆 就能访问相关的rest服务了。
总结
oauth2 实现的单点登陆 并不是很复杂,归根结底,Spring帮我们做了太多的底层实现,让我们实现起来非常的简单 实现几个接口就可以搞定授权服务器的配置,客户端的配置也非常的简单。现在我们流行看到了如百度,我登陆了百度,那么就可以直接访问百度贴吧,百度糯米,等。单点登陆运用已经使用的非常的广泛。所以我认为掌握单点登陆是十分有必要的。
源码地址
github
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文介绍了springboot整合CASClient实现单点登陆验证的示例,分享给大家,也给自己留个笔记,具体如下:单点登录(SingleSign-On,简称S
PHPSSO详解SSO有三种模式:①跨子域单点登陆②完全跨单点域登陆③站群共享身份认证第一种模式很简单,只需要将Cookie的域设置成多个应用的根域即可第二种方
Springboot搭建web应用集成了thymeleaf模板实现登陆下面是pom.xml的配置
当我们使用selenium实现模拟登陆时,获取到登陆按钮元素后,直接调用它的click()方法就能实现登陆跳转,并且此时的webDriver也是指向当前页面,这
要实现WIN8自动登陆,其实方法有很多,并且步骤也不多,以下为大家详细介绍两种实现WIN8开机自动登陆的方法:win8自动登陆设置方法一:打开WIN8开始&ld