OAuth2.0分布式系统环境搭建

介绍OAuth(开放授权)是一个开放标准,允许用户授权第三方应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方应用或分享他们数据的所有内容 。OAuth2.0的系统大致分由客户端,认证授权服务器以及资源服务器三部分组成 。客户端如果想要访问资源服务器中的资源,就必须要持有认证授权服务器颁发的Token 。认证流程如下图所示:

OAuth2.0分布式系统环境搭建

文章插图
 
这篇文章将通过一个具体的案例来展示如何搭建一个分布式的OAuth2.0系统 。整体的结构图如下所示 。有网关,认证授权服务以及资源服务三个部分组成 。既然OAuth2是一个标准,如果我们想用的话,必然是用它的实现,也就是Spring-Security-OAuth2,它可以很方便地和Spring Cloud集成 。OAuth2.0的更多细节会在案例中继续介绍 。
OAuth2.0分布式系统环境搭建

文章插图
 
那么就开始吧!
数据库要完成这套系统,需要准备好用到的一些数据表 。
OAuth2.0分布式系统环境搭建

文章插图
 
  • oauth_client_details:这个数据库存放了客户端的配置信息,客户端有什么样的权限才可以访问服务器 。表中的字段是固定的,下面会详细提到 。
  • oauth_code:用户数据库存取授权码模式存放授权码的,表中的字段也是固定的,下面会详细说明 。
  • 后面的5张表存放了用户的一些信息,如果角色、权限等信息 。登录验证的时候需要 。
建表的sql我放在了源码的README.md文件中,下载地址见文末 。
注册中心微服务项目得先有个注册中心吧,我们选用Eureka 。先搭建一个父工程OAuth2Demo,然后在父工程中创建一个Module叫oauth2_eureka 。然后添加配置文件及启动类即可 。所需要的依赖我就不在这里贴了,太占篇幅了 。有需要的小伙伴直接去我源码中拷就行了 。
spring:Application:name: eurekaserver:port: 8000 #启动端口…………【OAuth2.0分布式系统环境搭建】@SpringBootApplication@EnableEurekaServerpublic class EurekaApplication {public static void main(String[] args) {SpringApplication.run(EurekaApplication.class,args);}}这样注册中心就搭建好了 。
认证授权服务服务搭建在OAuth2Demo中创建一个Module叫oauth2_uaa作为认证服务 。添加启动类和配置文件 。
spring.application.name=uaaserver.port=8001eureka.client.serviceUrl.defaultZone = http://localhost:8000/eureka/…………@SpringBootApplication@EnableEurekaClient@MapperScan("com.robod.uaa.mapper")public class UaaApplication {public static void main(String[] args) {SpringApplication.run(UaaApplication.class, args);}}配置回顾上一篇Spring Security的文章中提到的几点内容
  • 用户来源的Service实现UserDetailsService接口,实现loadUserByUsername()方法,从数据库中获取数据
  • Spring Security的配置类继承自WebSecurityConfigurerAdapter,重写里面的两个configure()方法

OAuth2.0分布式系统环境搭建

文章插图
 
public interface UserService extends UserDetailsService {}//-----------------------------------------------------------@Service("userService")public class UserServiceImpl implements UserService { …………@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {SysUser sysUser = userMapper.findByUsername(username);return sysUser;}}@Configurationpublic class WebSecurityConfig extends WebSecurityConfigurerAdapter { …………@Beanpublic PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}@Bean@Overrideprotected AuthenticationManager authenticationManager() throws Exception {return super.authenticationManager();}//认证用户的来源@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.userDetailsService(userService).passwordEncoder(passwordEncoder());}//配置SpringSecurity相关信息@Overrideprotected void configure(HttpSecurity http) throws Exception {http.csrf().disable().authorizeRequests().antMatchers("/r/r1").hasAnyAuthority("p1").antMatchers("/login*").permitAll().anyRequest().authenticated().and().formLogin();}}解释一下上面的代码,WebSecurityConfig是Spring Security的配置类,第一个configure()方法配置的是用户的来源,这里配置了自定义的实现了UserDetailsService接口的UserService,里面的loadUserByUsername()方法从数据库中查询出对应的实现了UserDetails接口的SysUser对象,里面的SysPermission封装了用户所拥有的权限 。然后就交给后续的过滤器去处理了,我们就不用去管了 。


推荐阅读