单点登录(SSO)看这一篇就够了-简书(sso单点登录已搭建好的源码)

这个技术上的东西,看别人写的好像很简单。自己写的时候会有各种各样的问题。“看着看着,做着就犯了错误。”
图片来自Pexels
网上有很多关于实现SSO的文章,但是当你真正去了解的时候,你会发现根本不是那么回事。太让人抓狂了,尤其是对于我这样的菜鸟。几经周折,终于完成了,我决定录下来,以备后续回顾。我们先来看看效果:
准备单点登录最常见的例子就是我们打开淘宝APP,首页会有天猫、聚划算等服务的链接。当你点击它的时候,你只是跳过它,不要求你再次登录。
我在网上找到了下面这张图,我觉得挺清楚的:
可惜有点不清楚,所以画了个简版:
理解以下内容很重要:
SSO服务器和SSO客户端通过授权后颁发令牌直接访问受保护的资源。相对于浏览器,业务系统是服务器,相对于SSO服务器,业务系统是客户端。以及浏览器和业务系统之间通过会话的正常访问。不是每个浏览器请求都要经过SSO服务器验证,只要浏览器和它访问的服务器之间的会话有效,就可以正常访问。利用OAutp实现单点登录。接下来我只说一些和这个例子相关的配置,不谈原理和原因。众所周知,OAutp中有几个角色,比如授权服务器、资源服务器、客户端。当我们用它来实现SSO时,我们不需要资源服务器的角色。有授权服务器和客户端就够了。当然授权服务器是用来认证的,客户端是各个应用系统。我们只需要获取用户信息和用户成功登录后拥有的权限。之前我一直认为,那些需要权限控制的资源,放在资源服务器里就可以得到保护。其实我错了。权限控制必须由Spring Security或自定义拦截器来完成。Spring Security、OAutp、JWT、SSO在这个例子中,我们必须区分这些的作用:首先,SSO是一种思想,或者说是一种解决方案,它是抽象的。我们要做的就是按照它的想法去实施。其次,OAutp是一种协议,用来允许用户授权第三方应用访问他在另一台服务器上的资源。它不用于单点登录,但是我们可以用它来实现单点登录。在本例实现SSO的过程中,受保护的资源是用户的信息(包括用户的基本信息和用户的权限)。但是,如果我们想要访问这个资源,我们需要用户登录并授权,OAutp服务器负责颁发令牌。我们使用JWT来生成这个令牌,这意味着JWT用于携带用户的Access_Token。最后,Spring Security用于安全访问,这里我们用它来进行访问控制。
认证服务器配置Maven取决于:
xml版本=’1.0 ‘编码=’ UTF-8 ‘ 4 . 0 . 0 org . spring framework . boot spring-boot-starter-parent 2 . 1 . 3 . release com . cjs . SSO oautp-SSO-auth-server 0 . 0 . 1-SNAPSH oto autp-SSO-auth-server 1.8 org . spring framework . boot spring-boot-starter-data-JPA org . spring framework . boot spring-boot-starter-data-redis org . spring frame work . boot spring-boot-starter-securityApache.com mons commons-lang 3 3 . 8 . 1 com。阿里巴巴快速JSON 1.2.56 org。Spring框架。Boot Spring-Boot-Maven-Plugin这里面最重要的依赖是:Spring-security-oautp-auto configure。应用程序. yml:
spring :数据源: URL : JDBC : MySQL ://localhost :3306/权限用户名: root密码: 123456驱动程序类名称: com。MySQL。JDBC。驱动程序JPA : show-SQL : true session : store-type : redis redis :主机重要):
包com。cjs。SSO。配置;导入org。spring框架。豆子。工厂。注释。自动连线;导入org。spring框架。语境。注释。豆;导入org。spring框架。语境。注释。配置;导入org。spring框架。语境。注释。初级;导入org。spring框架。安全。核心。令牌。默认令牌;导入组织。spring框架。安全。oautp。配置。注释。配置器。clientdetailsserviceconfigurer;导入组织。spring框架。安全。oautp。配置。注释。网络。配置。authorizationserverconfigureradapter;导入组织。spring框架。安全。oautp。配置。注释。网络。配置。enableauthorizationserver导入组织。spring框架。安全。oautp。配置。注释。网络。配置器。authorizationserverendpointsconfigurer;导入组织。spring框架。安全。oautp。配置。注释。网络。配置器。authorizationserversecurityconfigurer;导入org。spring框架。安全。oautp。提供商。令牌。defaulttokenservices导入org。spring框架。安全。oautp。提供商。令牌。令牌存储;导入组织。spring框架。安全。oautp。提供商。令牌。商店。jwtaccesstokenconverter导入org。spring框架。安全。oautp。提供商。令牌。商店。jwttokenstore导入javax。SQL。数据来源;/* * * * @作者成建生* @ date 2019-02-11 */@ Configuration @ EnableAuthorizationServer公共类授权服务器配置扩展authorizationserverconfiguureradapter { @ auto wired private data source数据源;@覆盖公共void配置(AuthorizationServerSecurityConfigurer安全性)引发异常{安全。allowformauthenticationforclients();安全。令牌密钥访问(‘ is authenticated()’);} @覆盖公共void configure(ClientDetailsServiceConfigurer客户端)抛出异常{客户。JDBC(数据来源);} @覆盖公共void配置(AuthorizationServerEndpointsConfigurer端点)抛出异常{端点。accesstokenconverter(jwtAccessTokenConverter());端点。令牌存储(jwtTokenStore());//端点。令牌服务(defaultTokenServices());}/* @ Primary @ Bean public DefaultTokenServices DefaultTokenServices(){ DefaultTokenServices DefaultTokenServices=new DefaultTokenServices();defaulttokenservices。settokenstore(jwtTokenStore());defaulttokenservices。setsupportrefreshtoken(true);返回defaultTokenServices } */@ Bean public JwtTokenStore JwtTokenStore(){ return new JwtTokenStore(jwtAccessTokenConverter());} @ Bean public JwtAccessTokenConverter JwtAccessTokenConverter(){ JwtAccessTokenConverter JwtAccessTokenConverter=new JwtAccessTokenConverter();jwtaccesstokenconverter。setsigningkey(‘ cjs ‘);//设置JWT签名密钥返回jwtAccessTokenConverter} }说明:
别忘了@EnableAuthorizationServer。代币存储采用的是JWT。客户端以及登录用户这些配置存储在数据库,为了减少数据库的查询次数,可以从数据库读出来以后再放到内存中WebSecurityConfig(重要):
包com。cjs。SSO。配置;导入com。cjs。SSO。服务。myuserdetailsservice导入org。spring框架。豆子。工厂。注释。自动连线;导入org。spring框架。语境。注释。豆;导入org。spring框架。语境。注释。配置;导入org。spring框架。安全。配置。注释。正宗的。建筑商。authenticationmanagerbuilder导入org。spring框架。安全。配置。注释。网络。建筑商。http安全;导入org。spring框架。安全。配置。注释。网络。建筑商。网络安全;导入org。spring框架。安全。配置。注释。网络。配置。启用web安全性;导入org。spring框架。安全。配置。注释。网络。配置。websecurityconfigureradapter导入org。spring框架。安全。密码。bcrypt。bcryptpasswordencoder导入org。spring框架。安全。密码。密码。密码编码器;/* * * * @作者成建生* @ date 2019-02-11 */@ Configuration @启用web安全公共类WebSecurityConfig扩展WebSecurityConfigurerAdapter { @ auto wired private myuserdailsservice userdailsservice;@覆盖受保护的void配置(AuthenticationManagerBuilder auth)抛出异常{ auth。用户日常服务(userdailsservice).密码编码器(password encoder());} @覆盖公共void配置(web安全web)抛出异常{ web。点火().antMatchers(‘/assets/** ‘,’/css/** ‘,’/images/* * ‘);} @覆盖受保护的void配置(http安全http)抛出异常{ http.formLogin().loginPage(‘/login ‘).和()。authorizeRequests().蚂蚁匹配器(‘/login ‘).permitAll().任何请求().已验证()。和()。中国科学研究基金会.禁用()。CORS();} @ Bean公共密码编码器password encoder(){ return new BCryptPasswordEncoder();} } 自定义登录页面(一般来讲都是要自定义的):
包com。cjs。SSO。控制器;导入org。spring框架。刻板印象。控制器;导入org。spring框架。网络。绑定。注释。获取映射;/* * * * @作者成建生* @日期2019-02-12 */@控制器公共类登录控制器{ @获取映射(‘/log in ‘)公共字符串log in(){ return ‘ log in ‘;} @ get mapping(‘/’)public String index(){ return ‘ index ‘;} } 自定义登录页面的时候,只需要准备一个登录页面,然后写个控制器令其可以访问到即可,登录页面表单提交的时候方法一定要是帖子,最重要的时候行为要跟访问登录页面的全球资源定位器(统一资源定位器)一样。千万记住了,访问登录页面的时候是得到请求,表单提交的时候是邮政请求,其他的就不用管了。
艾拉管理- HTML5管理模板

其他教程

王者荣耀:防御塔的声音来自这两样东西,99%的玩家都听不到。

2022-8-14 4:00:56

其他教程

h5有哪些功能(h5页面有什么用)

2022-8-14 4:03:13

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索