当前位置: 首页 > 后端技术 > Java

OAuth2实现单点登录,简单易懂!

时间:2023-04-02 01:39:43 Java

作者:王可峰\来源:https://kefeng.wang/2018/04/0...单点登录是多域企业站点流行的登录方式。本文以真实场景辅助理解,力求透彻阐明OAuth2.0实现单点登录的原理过程。同时总结了权限控制的实现方案及其在微服务架构中的应用。1什么是单点登录1.1多点登录在传统的多点登录系统中,每个站点都实现自己的账号数据库和登录模块。各个站点的登录状态互不识别,需要各个站点手动一一登录。如下图所示,有两个术语,含义如下:authentication(认证):验证用户的身份;授权(authorization):验证用户的访问权限。1.2单点登录单点登录,英文为SingleSignOn,缩写为SSO。多个站点(192.168.1.20X)共享一台认证授权服务器(192.168.1.110,共享用户数据库和认证授权模块)。用户通过任一站点(如192.168.1.201)登录后,无需登录即可访问所有其他站点。而且,每个站点都可以直接通过这个登录状态进行交互。2OAuth2认证授权原理流程2.1生活实例[★★重点★★]为了直观理解OAuth2.0的原理流程,我们假设这样一个生活场景:(1)档案局A(Client/Client):带“档案局ID/密码”标识的,为掌握档案资源的机构。并行有多个档案局B/C/...,每个档案局存储不同的档案内容(resource/Resource),如政治、经济、军事、文化等;(2)市民张三(资源拥有者/ResourceOwner):通过“用户名/密码”识别,需要到各档案局查阅档案;(3)派出所(AuthorizationServer/AuthenticationServer):可以是单个庞大的派出所,也可以是数据共享的派出所集群。提供的信息和对外接口功能有:档案局信息:所有档案局的“档案局ID/密码”,证明档案局的身份;公民信息:所有公民的“用户名/密码”,可提供3.用户身份证明(认证/认证)公民对档案局的权限:有公民与档案局权限的映射表,可查每个公民是否对每个档案局都有操作权限(授权/授权)。通常在设计中加入一个官职(角色)层,每个公民属于哪个官职(角色),哪个官职(角色)对具体的档案局有操作权限。2.1.1张三首次到访档案局A张三以前从未到过档案局,这是他第一次到档案局。对比下图中的序号:(1)张三来到“档案局A”的“档案部”,需要实名登记查询,按指示前往“用户注册”办公室”(HTTP重定向);(2))张三来到“档案局A”的“用户登记处”,但他既不能证明自己的身份(authentication),也不能证明自己有权限查看A档案(authorization)。张三带着档案局A的标识(client-id),被重定向到“授权书签发部门”;(3)张三来到“派出所”“授权书签发处”,出示A档案局的标志,希望签发授权书(授权书)。本部门要求先证明身份(authentication),被重定向到“用户身份验证部门”;(4)张三来到“派出所”的“用户身份验证部”,领取用户身份证明表(webloginformForm)(5)张三填写用户名和密码,提交至(提交/提交)“用户身份验证部”,从私有数据库中检查用户名和密码的匹配情况,确认此人为张三,并出具身份证明信,完成身份验证。张三拿着身份证明书和A档案局的标识,被转到“授权书签发处”;(6)张三再次来到“授权书签发处”,出示了身份证明书和A档案局的标识,办公室从私人数据库中查到张三的官职是市长级别(角色),而这个公职有A档案局的查询权限,所以他发了授权书(授权码/允许张三查询A档案局的代码)),张三带着授权书被重定向到“用户“档案局”登录办公室;(7)张三来到“档案局”的“用户登陆处”,在那里私自取出了A档案局的标志(client-id)和密码,附上了A档案局出示的授权书(code)张三,到“派出所”的“腰卡发放处”为张三办理“腰卡”(令牌)。以后张三就可以带着佩戴这腰牌来表明身份和权柄了。再次重定向到“档案室”;(8)张三的场次(Session)已经关联了腰牌(token),可以直接通过“档案室”查档。2.1.2张三第一次访问B档案局张三已经成功访问??了A档案局,现在他想访问B档案局。对照下图中的序号,理解:(1)/(2)同上;(3)张三已有《身份证明书》,直接在“派出所”信函的“授权书签发部门”成功签发了“访问B局档案局”的授权书;(4)/(5)/(6)豁免;(七)“B档案局”“用户登记处”完成登记;(八)“档案局B”“档案部”查卷。2.1.3张三再次访问A档案局张三已经成功访问??A档案局,现在想访问A档案局。对照下图中的序号,理解:(1)直接找到文件,成功地;(2~8)全部回避。2.2HTTP重定向原理在HTTP协议中,浏览器向服务器发送REQUEST后,如果服务器发现业务不在自己管辖范围内,就会把你转到自己服务器或其他服务器的一个接口(uri)(主持人)。就像我们去政府部门,每走到一个窗口,工作人员都会说“你带材料A,去这个办公室的X窗口,或者另一个Y办公室的Z窗口”,然后进行下一个程序。2.3SSO工作流程至此,OAuth2.0的认证/授权流程就不难理解了,这里不再赘述。请拍下图,与“2.1生活实例”一节进行对比理解。2.4OAuth2.0进阶https://tools.ietf.org/html/r...https://tools.ietf.org/html/r...https://blog.csdn.net/secclou。..按照官方标准,OAuth2.0共享四种授权模式:AuthorizationCode:在服务端应用之间使用,这是本文使用的最复杂的模式;隐式:用在移动端app或web端应用(这些app都在用户的设备上,比如调用手机微信进行认证授权)公司,在此示例中使用)客户端凭据:用于应用程序API访问。3基于SpringBoot的认证/授权3.1授权服务器(AuthorizationServer)(一)pom.xmlorg.springframework.cloudspring-cloud-starter-oauth2(2)application.propertiesserver.port=8110##监听端口(3)AuthorizationServerApplication.java@EnableResourceServer//启用资源服务器publicclassAuthorizationServerApplication{//...}(4)配置授权服务的参数@Configuration@EnableAuthorizationServerpublicclassOauth2AuthorizationServerConfigurerextendsAuthorizationServerConfigurerAdapter{@Overridepublicvoidconfigure(finalClientDetailsS??erviceConfigurerclients)throwsException{clients.inMemory().withClient("webapp").secret("secret")//客户端id/secret.authorizedGrantTypes("authorizationcode")//授权母mode.scopes("user_info").autoApprove(true)//自动批准.accessTokenValiditySeconds(3600);//有效期1小时}}@ConfigurationpublicclassOauth2WebSecurityConfigurerextendsWebSecurityConfigurerAdapter{@Overrideprotectedvoidconfigure(HttpSecurityhttp)throwsException{http.requestMatchers().antMatchers("/login","/oauth/authorize/oauth/logout").and().authorizeRequests().anyRequest().authenticated().and().formLogin().permitAll();}@Overrideprotectedvoidconfigure(AuthenticationManagerBuilderauth)throwsException{auth.inMemoryAuthentication().withUser("admin").password("admin123").roles("ADMIN");}}3.2客户端(Client,业务网站)(1)pom.xmlorg.springframework.cloudspring-cloud-starter-oauth2(2)application.propertiesserverport=8080security.oauth2.client.client-id=webappsecurity.oauth2.client.client-secret=secretsecurity.oauth2.client.access-token-uri=http://localhost:8110/oauth/tokensecurity.oauth2.client.user-authorization-uri=http://localhost:8110/oauth/authorizesecurity.oauth2.resource.user-info-uri=http://localhost:8110/oauth/user(3)配置WEB安全@Configuration@EnableOAuth2SsopublicclassOauth2WebsecurityConfigurerextendsWebSecurityConfigurerAdapter{@Overridepublicvoidconfigure(HttpSecurityhttp)throwsException{http.antMatcher("/**").authorizeRequests().ant","/login").permitAll().anyRequest().authenticated();}}@RestControllerpublicclassOauth2ClientController{@GetMapping("/")publicModelAndViewindex(){returnnewModelAndView("index");}@GetMapping("/welcome")publicModelAndViewwelcome(){returnnewModelAndView("welcome");}}3.3用户权限控制(基于角色)在授权服务器中,定义每个用户拥有的角色:user=USER,admin=ADMIN/USER,root=ROOT/ADMIN/USER业务网站(客户端)中注解表示可以使用哪些角色@RestControllerpublicclassOauth2ClientController{@GetMapping("/welcome")publicModelAndViewwelcome(){returnnewModelAndView("welcome");}@GetMapping("/api/user")@PreAuthorize("hasAuthority('USER')")publicMapapiUser(){}@GetMapping("/api/admin")@PreAuthorize("hasAuthority('ADMIN')")publicMapapiAdmin(){}@GetMapping("/api/root")@PreAuthorize("hasAuthority('ROOT')")publicMapapiRoot(){}}4综合应用4.1权限控制方案下图是基本的认证/授权控制方案,主要是针对认证和授权设计的服务端相关数据表的基本定义可以参考“2.1生命本文中的示例”。4.2微服务架构中的应用不同于常规的服务架构。在微服务架构中,授权服务器/资源服务器作为微服务存在。用户登录可通过API网关一次性完成,无需跳转到网络授权服务器完成。近期热点文章推荐:1.1000+Java面试题及答案(2022最新版)2.厉害了!Java协程来了。..3.SpringBoot2.x教程,太全面了!4、SpringBoot2.6正式发布,一大波新特性。.5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!