springSecurity整合oauth2

springSecurity的基础上整合oauth2

springboot整合springSecurity链接: https://blog.csdn.net/weixin_41849346/article/details/108443507

pom.xml

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-security</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<!-- 当前版本是在本机编译 -->
		<dependency>
			<groupId>org.springframework.security.oauth</groupId>
			<artifactId>spring-security-oauth2</artifactId>
			<version>2.3.4.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>8.0.18</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.security</groupId>
			<artifactId>spring-security-test</artifactId>
			<scope>test</scope>
		</dependency>

		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>1.3.1</version>
		</dependency>

application.properties

#要加的,否则springsecurity与oauth2整合不会走oauth2 的拦截器
security.oauth2.resource.filter-order=3 

mysql表

DROP TABLE IF EXISTS `oauth_refresh_token`;
CREATE TABLE `oauth_refresh_token` (
  `token_id` varchar(255) DEFAULT NULL,
  `token` blob,
  `authentication` blob
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


DROP TABLE IF EXISTS `oauth_code`;
CREATE TABLE `oauth_code` (
  `code` varchar(255) DEFAULT NULL,
  `authentication` blob
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


DROP TABLE IF EXISTS `oauth_client_details`;
CREATE TABLE `oauth_client_details` (
  `client_id` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `resource_ids` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `client_secret` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `scope` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `authorized_grant_types` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `web_server_redirect_uri` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `authorities` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `access_token_validity` int DEFAULT NULL,
  `refresh_token_validity` int DEFAULT NULL,
  `additional_information` varchar(4096) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `autoapprove` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  PRIMARY KEY (`client_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;


DROP TABLE IF EXISTS `oauth_access_token`;
CREATE TABLE `oauth_access_token` (
  `token_id` varchar(255) DEFAULT NULL,
  `token` blob,
  `authentication_id` varchar(255) DEFAULT NULL,
  `user_name` varchar(255) DEFAULT NULL,
  `client_id` varchar(255) DEFAULT NULL,
  `authentication` blob,
  `refresh_token` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


INSERT INTO `oauth_client_details` VALUES ('client', 'resourceId', 'secret', 'app', 'authorization_code,refresh_token', 'http://localhost:8080', null, '7200', null, null, 'true');
INSERT INTO `oauth_client_details` VALUES ('UserManagement', 'resourceId', '$2a$10$ZRmPFVgE6o2aoaK6hv49pOt5BZIKBDLywCaFkuAs6zYmRkpKHgyuO', 'all', 'authorization_code,refresh_token', 'www.baidu.com', null, '7200', null, null, 'true');

提供OAuth2授权配置类

加载数据库做持久化

//oauth2加载数据库

@Configuration
@EnableAuthorizationServer
public class AuthServerConfig2 extends AuthorizationServerConfigurerAdapter{

	//数据库连接池对象
	@Autowired
	private DataSource dataSource;

	//授权模式专用对象
	@Autowired
	private AuthenticationManager authenticationManager;

	//客户端信息来源
	@Bean
	public JdbcClientDetailsService jdbcClientDetailsService(){
		return new JdbcClientDetailsService(dataSource);
	}

	//token保存策略
	@Bean
	public TokenStore tokenStore(){
		return new JdbcTokenStore(dataSource);
	}

	//授权信息保存策略
	@Bean
	public ApprovalStore approvalStore(){
		return new JdbcApprovalStore(dataSource);
	}

	//授权码模式数据来源
	@Bean
	public AuthorizationCodeServices authorizationCodeServices(){
		return new JdbcAuthorizationCodeServices(dataSource);
	}

	//指定客户端信息的数据库来源
	@Override
	public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
		clients.withClientDetails(jdbcClientDetailsService());
	}
	//检查token的策略
	@Override
	public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {

		security.allowFormAuthenticationForClients();
		security.tokenKeyAccess("isAuthenticated()");
		security.checkTokenAccess("permitAll()");
	}

	//OAuth2的主配置信息
	@Override
	public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
		endpoints
//				.approvalStore(approvalStore())
				.authenticationManager(authenticationManager)
				.authorizationCodeServices(authorizationCodeServices())
				.tokenStore(tokenStore());
	}

}

加载内存

// oauth2 加载内存
@Configuration
@EnableAuthorizationServer
public class AuthServerConfig extends AuthorizationServerConfigurerAdapter{

	@Autowired
	private TokenStore tokenStore;

	@Autowired
    private AuthenticationManager authenticationManager;

	@Autowired
	private ApprovalStore approvalStore;

	@Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        //添加客户端信息
        //使用内存存储OAuth客户端信息
        clients.inMemory()
                // client_id
                .withClient("client")
                // client_secret
                .secret("secret")
                // 该client允许的授权类型,不同的类型,则获得token的方式不一样。
                .authorizedGrantTypes("authorization_code","implicit","refresh_token")
                .resourceIds("resourceId")
                //回调uri,在authorization_code与implicit授权方式时,用以接收服务器的返回信息
                .redirectUris("http://localhost:8090/")
                // 允许的授权范围
                .scopes("app","test");
    }

	@Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints.tokenStore(tokenStore).approvalStore(approvalStore)
                .authenticationManager(authenticationManager);
    }

	@Override
    public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
        security.realm("OAuth2-Sample")
        	.allowFormAuthenticationForClients()
        	.tokenKeyAccess("permitAll()")
        	.checkTokenAccess("isAuthenticated()");
    }

	@Bean
	public TokenStore tokenStore() {
		//token保存在内存中(也可以保存在数据库、Redis中)。
		//如果保存在中间件(数据库、Redis),那么资源服务器与认证服务器可以不在同一个工程中。
		//注意:如果不保存access_token,则没法通过access_token取得用户信息
		return new InMemoryTokenStore();
	}

	@Bean
	public ApprovalStore approvalStore() throws Exception {
		TokenApprovalStore store = new TokenApprovalStore();
		store.setTokenStore(tokenStore);
		return store;
	}
}

oauth2资源管理配置类


@Configuration
@EnableResourceServer
public class ResServerConfig extends ResourceServerConfigurerAdapter{
	
	@Autowired
	private TokenStore tokenStore;

	@Override
    public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
        resources
                .tokenStore(tokenStore).resourceId("resourceId");
    }

    @Override
    public void configure(HttpSecurity http) throws Exception {	    	
    	/*
    	 注意:
    	 1、必须先加上: .requestMatchers().antMatchers(...),表示对资源进行保护,也就是说,在访问前要进行OAuth认证。
    	 2、接着:访问受保护的资源时,要具有哪里权限。
    	 ------------------------------------
    	 否则,请求只是被Security的拦截器拦截,请求根本到不了OAuth2的拦截器。
    	 同时,还要注意先配置:security.oauth2.resource.filter-order=3,否则通过access_token取不到用户信息。
    	 ------------------------------------
    	 requestMatchers()部分说明:
    	 Invoking requestMatchers() will not override previous invocations of ::
    	 mvcMatcher(String)}, requestMatchers(), antMatcher(String), regexMatcher(String), and requestMatcher(RequestMatcher).
    	 */
        
        http
        	// Since we want the protected resources to be accessible in the UI as well we need
			// session creation to be allowed (it's disabled by default in 2.0.6)
        	//另外,如果不设置,那么在通过浏览器访问被保护的任何资源时,每次是不同的SessionID,并且将每次请求的历史都记录在OAuth2Authentication的details的中
			.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
			.and()
       		.requestMatchers()
           .antMatchers("/user","/res/**")
           .and()
           .authorizeRequests()
           .antMatchers("/user","/res/**")
           .authenticated();

    }
}

postman验证授权码模式

1.获取授权码

http://localhost:8081/oauth/authorize?response_type=code&client_id=client&redirect_uri=http://localhost:8080&scope=app

2.登录页面输入用户名密码

在这里插入图片描述

3. 获取code码

在这里插入图片描述

4. 通过poseman获取access_token

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.通过token访问接口

在这里插入图片描述

6. 未携带token时

在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值