java 授权解决方案_基于Spring Security的Oauth2授权实现方法

前言

经过一段时间的学习Oauth2,在网上也借鉴学习了一些大牛的经验,推荐在学习的过程中多看几遍阮一峰的《理解OAuth 2.0》,经过对Oauth2的多种方式的实现,个人推荐Spring Security和Oauth2的实现是相对优雅的,理由如下:

1、相对于直接实现Oauth2,减少了很多代码量,也就减少的查找问题的成本。

2、通过调整配置文件,灵活配置Oauth相关配置。

3、通过结合路由组件(如zuul),更好的实现微服务权限控制扩展。

Oauth2概述

oauth2根据使用场景不同,分成了4种模式

授权码模式(authorization code)

简化模式(implicit)

密码模式(resource owner password credentials)

客户端模式(client credentials)

在项目中我们通常使用授权码模式,也是四种模式中最复杂的,通常网站中经常出现的微博,qq第三方登录,都会采用这个形式。

Oauth2授权主要由两部分组成:

Authorization server:认证服务

Resource server:资源服务

在实际项目中以上两个服务可以在一个服务器上,也可以分开部署。

准备阶段

核心maven依赖如下

org.springframework.boot

spring-boot-starter-web

com.fasterxml.jackson.datatype

jackson-datatype-joda

org.thymeleaf.extras

thymeleaf-extras-springsecurity4

org.springframework.boot

spring-boot-starter-thymeleaf

org.springframework.boot

spring-boot-starter-security

org.springframework.security.oauth

spring-security-oauth2

org.springframework.boot

spring-boot-starter-jdbc

mysql

mysql-connector-java

org.springframework.boot

spring-boot-starter-data-jpa

token的存储主流有三种方式,分别为内存、redis和数据库,在实际项目中通常使用redis和数据库存储。个人推荐使用mysql数据库存储。

初始化数据结构、索引和数据SQL语句如下:

--

-- Oauth sql -- MYSQL

--

Drop table if exists oauth_client_details;

create table oauth_client_details (

client_id VARCHAR(255) PRIMARY KEY,

resource_ids VARCHAR(255),

client_secret VARCHAR(255),

scope VARCHAR(255),

authorized_grant_types VARCHAR(255),

web_server_redirect_uri VARCHAR(255),

authorities VARCHAR(255),

access_token_validity INTEGER,

refresh_token_validity INTEGER,

additional_information TEXT,

autoapprove VARCHAR (255) default 'false'

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Drop table if exists oauth_access_token;

create table oauth_access_token (

token_id VARCHAR(255),

token BLOB,

authentication_id VARCHAR(255),

user_name VARCHAR(255),

client_id VARCHAR(255),

authentication BLOB,

refresh_token VARCHAR(255)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Drop table if exists oauth_refresh_token;

create table oauth_refresh_token (

token_id VARCHAR(255),

token BLOB,

authentication BLOB

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Drop table if exists oauth_code;

create table oauth_code (

code VARCHAR(255),

authentication BLOB

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- Add indexes

create index token_id_index on oauth_access_token (token_id);

create index authentication_id_index on oauth_access_token (authentication_id);

create index user_name_index on oauth_access_token (user_name);

create index client_id_index on oauth_access_token (client_id);

create index refresh_token_index on oauth_access_token (refresh_token);

create index token_id_index on oauth_refresh_token (token_id);

create index code_index on oauth_code (code);

-- INSERT DEFAULT DATA

INSERT INTO `oauth_client_details` VALUES ('dev', '', 'dev', 'app', 'authorization_code', 'http://localhost:7777/', '', '3600', '3600', '{"country":"CN","country_code":"086"}', 'TAIJI');

核心配置

核心配置主要分为授权应用和客户端应用两部分,如下:

授权应用:即Oauth2授权服务,主要包括Spring Security、认证服务和资源服务两部分配置

客户端应用:即通过授权应用进行认证的应用,多个客户端应用间支持单点登录

授权应用主要配置如下:

application.properties链接已初始化Oauth2的数据库即可

Application启动类,授权服务开启配置和Spring Security配置,如下:

@SpringBootApplication

@AutoConfigureAfter(JacksonAutoConfiguration.class)

@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)

@EnableAuthorizationServer

public class Application extends WebSecurityConfigurerAdapter {

public static void main(String[] args) {

SpringApplication.run(Application.class, args);

}

// 启动的时候要注意,由于我们在controller中注入了RestTemplate,所以启动的时候需要实例化该类的一个实例

@Autowired

private RestTemplateBuilder builder;

// 使用RestTemplateBuilder来实例化RestTemplate对象,spring默认已经注入了RestTemplateBuilder实例

@Bean

public RestTemplate restTemplate() {

return builder.build();

}

@Configuration

public class WebMvcConfig extends WebMvcConfigurerAdapter {

@Override

public void addViewControllers(ViewControllerRegistry registry) {

registry.addViewController("/login").setViewName("login");

}

}

@Override

protected void configure(HttpSecurity http) throws Exception {

http.headers().frameOptions().disable();

http.authorizeRequests()

.antMatchers("/403").permitAll() // for test

.antMatchers("/login", "/oauth/authorize", "/oauth/confirm_access", "/appManager").permitAll() // f

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值