SpringBoot集成SpringSecurity5和OAuth2 — 2、OAuth2客户端

一、项目环境配置

1.1 、JDK8

1.2、Spring Boot: 2.3.0.RELEASE

1.3、spring-cloud.version:Hoxton.SR4

二、pom.xml

1、加入thymeleaf模板依赖(可选)

		
		
			org.springframework.boot
			spring-boot-starter-thymeleaf
		

2、加入starter-web依赖

		
		
			org.springframework.boot
			spring-boot-starter-web
		

3、加入oauth2依赖

		
		
			org.springframework.cloud
			spring-cloud-starter-oauth2
		

4、完整的pom.xml文件



	4.0.0
	
		org.springframework.boot
		spring-boot-starter-parent
		2.3.0.RELEASE
		 
	
	security.oauth2
	client
	0.0.1-SNAPSHOT
	client
	OAuth2的客户端

	
		1.8
		Hoxton.SR4
	

	

		
		
			org.springframework.boot
			spring-boot-starter-thymeleaf
		

		
		
			org.springframework.boot
			spring-boot-starter-web
		

		
		
			org.springframework.cloud
			spring-cloud-starter-oauth2
		

		
			org.springframework.boot
			spring-boot-starter-test
			test
			
				
					org.junit.vintage
					junit-vintage-engine
				
			
		

	

	
		
			
				org.springframework.cloud
				spring-cloud-dependencies
				${spring-cloud.version}
				pom
				import
			
		
	

	
		
			
				org.springframework.boot
				spring-boot-maven-plugin
			
		
	


三、application.properties

1、配置客户端端口

server.port=8090

因为我在OAuth2认证服务器上写的回调地址的端口是8090,所以此处设置成8090端口

2、配置登陆路径

security.oauth2.sso.login-path=/callback

因为我在OAuth2认证服务器上写的回调地址是callback,所以此处设置成callback,必须和认证服务器上设置的回调地址一致,否则会报错

3、配置客户端在认证服务器上的appId和appSecret

#客户端id
security.oauth2.client.client-id=client
#客户端secret
security.oauth2.client.client-secret=secret

4、配置授权码的地址

#获取授权码的地址
security.oauth2.client.user-authorization-uri=http://localhost:8080/oauth/authorize

5、配置获取token的地址

security.oauth2.client.access-token-uri=http://localhost:8080/oauth/token

6、配置校验token的地址

security.oauth2.resource.token-info-uri=http://localhost:8080/oauth/check_token

7、配置客户端的session的cookie名称(必须配置)

server.servlet.session.cookie.name=OAuth-Client

原因:如果同一台服务器(或电脑)上,同时部署了多个Spring Boot项目(假设A、B项目),但是项目之间没有任何关系,相互独立。然后在同一个浏览器上,同时请求A、B项目上的服务,在A项目进行定时认证session时,前端在发起Request请求时常将B的sessionId 当做A的sessionId上传给A,而导致A项目验证session时失败。

出现这种情况的原因是:A、B项目存储SessionId 的cookie name 相同,浏览器傻傻分不清JSESSIONID到底是A还是B的,所以就拿错了。

解决办法:在A项目的application.properties 中设置session的cookie名称,与B项目的session的cookie名称不相同即可

8、完整的application.properties配置


server.port=8090

spring.application.name=sso-client

#登陆路径
#security.oauth2.sso.login-path=/login
security.oauth2.sso.login-path=/callback
#客户端id
security.oauth2.client.client-id=client
#客户端secret
security.oauth2.client.client-secret=secret
#获取授权码的地址
security.oauth2.client.user-authorization-uri=http://localhost:8080/oauth/authorize
#获取token的地址
security.oauth2.client.access-token-uri=http://localhost:8080/oauth/token
#校验token的地址
security.oauth2.resource.token-info-uri=http://localhost:8080/oauth/check_token


#禁止同名的sessionId,是个坑,不加会报错
server.servlet.session.cookie.name=OAuth-Client

spring.thymeleaf.prefix = classpath:/templates/
#spring.thymeleaf.suffix = .html
spring.thymeleaf.encoding = UTF-8
spring.thymeleaf.servlet.content-type=text/html
spring.thymeleaf.cache = false

四、在springboot的启动器上开启SSOclient的配置

加入注解:@EnableOAuth2Sso

五、新建一个Controller

package security.oauth2.client.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ClientController {

    @GetMapping("/callback")
    public String callback(){
        return "SSO Client callback!";
    }

    @GetMapping("/oauth-client")
    public String oauthClient(){
        return "This is SSO Client!";
    }


}

六、测试

1、在浏览器中输入:localhost:8090/oauth-client后,跳转到了认证服务器的登录界面,同时Set-Cookie设置的cookie名称也从JSESSIONID变为了OAuth-Client。

SpringBoot集成SpringSecurity5和OAuth2 — 2、OAuth2客户端_第1张图片

2、输入用户名密码后,进入是否同意授权的界面

SpringBoot集成SpringSecurity5和OAuth2 — 2、OAuth2客户端_第2张图片

3、选择同意授权后,跳回原来浏览器请求的客户端的地址,同时在服务器给出的回调地址中可以查看到认证服务器返回的授权码code

SpringBoot集成SpringSecurity5和OAuth2 — 2、OAuth2客户端_第3张图片

 

你可能感兴趣的:(SpringBoot集成SpringSecurity5和OAuth2 — 2、OAuth2客户端)