首页 > 作文

springboot oauth2实现单点登录实例

更新时间:2023-04-04 13:09:46 阅读: 评论:0

我们见过的很多网站,容许使用第三方账号登录,他不需要关注用户信息,只需要用户拿到授权码就可以访问。

oauth2是用来做三方登录的,他的授权方式有好几种,授权码模式、密码模式、隐式模式、客户端模式。

oauth2认证的过程如下:一般我们请求一个需要登录的网站a,会提示我们使用第三方网站c的用户登录,我们登录,这时候需要我们授权,就是authorize,授权之后,会得到一个token,我们拿到这个token就可以访问这个网站a了。a网站不关心c网站的用户信息。

springcurity结合oauth2可以做这个功能,这里给出一个springboot+curity+oauth2的实例,这个实例很直观,就是我们有两个服务a,c,a是需要用户登录的网站,而c是授权服务器。当我们访问a的资源:http://localhost:8000/hello,他会跳到c的服务器上登录,登录完成,授权,就直接调回来a网站,这里使用了单点登录功能。

构建项目:我这里构建了一个父级项目curityoauth2,然后加入了两个模块:auth-rver,client-1。

项目依赖:

curityoauth2->pom.xml

<parent><groupid>org.springframework.boot</groupid><artifactid>spring-boot-starter-parent</artifactid><version>2.1.4.relea</version></parent>  <de感谢生命pendencies>    <dependency>    <groupid>org.springframework.boot</groupid>    <artifactid>spring-boot-starter-web</artifactid>    </dependency>    <dependency>    <groupid>org.springframework.boot</groupid>    <artifactid>spring-boot-starter-curity</artifactid>    </dependency>    <dependency>    <groupid>org.springframework.curity.oauth</groupid>    <artifactid>spring-curity-oauth2</artifactid>    <version>2.3.4.relea</version>    </dependency>    <dependency>  <groupid>org.springframework.curity.oauth.boot</groupid>  <artifactid>spring-curity-oauth2-autoconfigure</artifactid>  <version>2.3.2.relea</version>  </dependency>  </dependencies>  <modules>  <module>auth-rver</module>  <module>client-1</module>  </modules>

***********auth-rver***************************************

authrverconfiguration.java

package com.xxx.config;import org.springframework.beans.factory.annotation.autowired;import org.springframework.context.annotation.configuration;import org.springframework.curity.crypto.password.passwordencoder;import org.springframework.curity.oauth2.config.annotation.configurers.clientdetailsrviceconfigurer;import org.springframework.curity.oauth2.config.annotation.web.configuration.authorizationrverconfigureradapter;import org.springframework.curity.oauth2.config.annotation.web.configuration.enableauthorizationrver;@configuration@enableauthorizationrverpublic class authrverconfiguration extends authorizationrverconfigureradapter{@autowiredprivate passwordencoder passwordencoder;@overridepublic void configure(clientdetailsrviceconfigurer clients) throws exception {clients.inmemory()   .withclient("client")   .cret(passwordencoder.encode("cret"))   .autoapprove(true)   .redirecturis("http://localhost:8000/login","http://localhost:8001/login")   .scopes("ur")   .accesstokenvalidityconds(7200)   .authorizedgranttypes("authorization_code");}}

授权服务配置这里,主要设置client_id,以及cret,这里设置了自动授权autoapprove(true),就是我们输入用户名和密码登录之后,不会出现一个需要我们手动点击authorize的按钮进行授权。另外配置了redirect_uri,这个是必须的。最后还设置了授权类型,这里选择的是授权码模式。

curityconfiguration.java

package com.xxx.config;import org.springframework.context.annotation.bean;import org.springframework.context.annotation.configuration;import org.springframework.core.annotation.order;import org.springframework.curity.config.annotation.authentication.builders.authenticationmanagerbuilder;import org.springframework.curity.config.annotation.web.builders.httpcurity;import org.springframework.curity.config.annotation.web.configuration.enablewebcurity;import动漫营销 org.springframework.curity.config.annotation.web.configuration.webcurityconfigureradapter;import org.springframework.curity.crypto.bcrypt.bcryptpasswordencoder;import org.springframework.curity.crypto.password.passwordencoder;@configuration@order(1)@enablewebcuritypublic class curityconfiguration extends webcurityconfigureradapter{@beanpublic passwordencoder passwordencoder() {return new bcryptpasswordencoder();}@overrideprotected void configure(authenticationmanagerbuilder builder) throws exception {builder.inmemoryauthentication()   .withur("admin")   .password(pdota斧王出装asswordencoder().encode("admin"))   .roles("admin");}@overrideprotected void configure(httpcurity http) throws exception {http.requestmatchers().antmatchers("/login").antmatchers("/oauth/authorize").and().authorizerequests().anyrequest().authenticated().and().formlogin().and().csrf().disable();}}

curity是做权限管理的,他需要配置用户和密码,这里采用内存保存的方式,将用户名和密码保存在内存中,而不是数据库或者redis中,关于保存在哪里,对于了解oauth2来说,放在内存是最简单的,省去了建表,做数据库查询的麻烦。

testcontroller.java

package com.xxx.web;import java.curity.principal;import org.springframework.web.bind.annotation.getmapping;imp最轻松的工作ort org.springframework.web.bind.annotation.requestmapping;import org.springframework.web.bind.annotation.restcontroller;@restcontroller@requestmapping("/api/test")public class testcontroller {@getmapping("/ur")public principal curren明月有情应识我tur(principal principal) {return principal;}}

这个controller配置,不是用来测试访问他的,而是用来做一个接口,给client-1使用,client-1配置文件中有个配置:curity.oauth2.resource.ur-info-uri就是配置的这个接口。

app.java

package com.xxx;import org.springframework.boot.springapplication;import org.springframework.boot.autoconfigure.springbootapplication;import org.springframework.curity.oauth2.config.annotation.web.configuration.enableresourcerver;@springbootapplication@enableresourcerverpublic class app {    public static void main( string[] args ){    springapplication.run(app.class, args);    }}

application.yaml//无配置,可以略

***********client-1*********************************************************

curityconfiguration.java

package com.xxx.config;import org.springframework.boot.autoconfigure.curity.oauth2.client.enableoauth2sso;import org.springframework.context.annotation.configuration;import org.springframework.curity.config.annotation.web.builders.httpcurity;import org.springframework.curity.config.annotation.web.configuration.webcurityconfigureradapter;@suppresswarnings("deprecation")@configuration@enableoauth2ssopublic class curityconfiguration extends webcurityconfigureradapter{@overrideprotected void configure(httpcurity http) throws exception {http.authorizerequests().anyrequest().authenticated().and().csrf().disable();}}

testcontroller.java

package com.xxx.web;import java.util.arrays;import org.springframework.curity.core.authentication;import org.springframework.curity.core.context.curitycontextholder;import org.springframework.web.bind.annotation.getmapping;import org.springframework.web.bind.annotation.restcontroller;@restcontrollerpublic class testcontroller {@getmapping("/hello")public string hello() {authentication authentication = curitycontextholder.getcontext().getauthentication();return authentication.getname()+arrays.tostring(authentication.getauthorities().toarray());}}

app.java

package com.xxx;import org.springframework.boot.springapplication;import org.springframework.boot.autoconfigure.springbootapplication;@springbootapplicationpublic class app {    public static void main( string[] args ){    springapplication.run(app.class, args);    }}

application.yaml

rver:  port: 8000  rvlet:    ssion:      cookie:        name: s1curity:  oauth2:    client:      client-id: client      client-cret: cret      ur-authorization-uri: http://localhost:8080/oauth/authorize      access-token-uri: http://localhost:8080/oauth/token    resource:      ur-info-uri: http://localhost:8080/api/test/ur

以上都是代码部分,下面主要是测试,测试过程很简单,就是我们启动两个服务,打开浏览器访问client-1的http://localhost:8000/hello接口,这时候因为需要登录,会跳转到auth-rver服务的http://localhost:8080/login,登录成功,会接着访问授权接口,授权成功,会跳转到http://localhost:8000/login,然后跳转到http://localhost:8000/hello,貌似很复杂,我们先看看效果:

值得注意的是,如图所示的2、3顺序,在这个结果页面是这样的,但是在登录页面并不是这样,而是先3后2:

可以这么解释:client-1的接口http://localhost:8000/hello需要权限才能访问,这时候,需要登录自己的系统http://localhost:8000/login,而自己的系统支持oauth2,他通过封装了client_id,respon_type,redirect_uri,state等参数的授权码模式请求接口,向auth-rver服务发起授权请求http://localhost:8080/oauth/authorize?client_id=client&redirect_uri=http://localhost:8000/login&respon_type=code&state=pphca2,请求会跳转auth-rver的登录页面http://localhost:8080/login。

这里因为使用了单点登录,先从client-1跳转到了auth-rver,最后拿到了code之后,跳回了client-1,访问成功。而页面上显示的内容并不是一开始就是这样子的,他会先跳转auth-rver登录页面:

以上代码有了,结果也验证了,但是个人还是不是很了解这个登录授权的原理和过程,也是在学习中,这个所谓的单点登陆,在代码上就用了一个@enableoauth2sso注解在client-1项目的curityconfiguration类上,该类也是继承自webcurityconfigureradapter类,然后覆盖了configure(httpcurity http)方法。

到此这篇关于springboot oauth2实现单点登录实例的文章就介绍到这了,更多相关springboot oauth2单点登录内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!

本文发布于:2023-04-04 13:09:16,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/7a6e53491fb98b54f6bdee6c20757f46.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:springboot oauth2实现单点登录实例.doc

本文 PDF 下载地址:springboot oauth2实现单点登录实例.pdf

标签:单点   网站   接口   模式
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图