Spring Security Oauth2

Spring Security Oauth2


最近在研究Oauth2,打算将它应用到实际项目当中,主要是做接口鉴权这一块。

通过源码以及借鉴其他工程,有了如下了解:

Oauth2在简单应用中我们大致只需要关心如下三个类,继承重写当中的方法:

  • AuthorizationServerConfigurerAdapter
  • ResourceServerConfigurerAdapter
  • WebSecurityConfigurerAdapter

AuthorizationServerConfigurerAdapter

这个在Oauth中是做授权相关的内容,以及负责存储token和token的时间范围处理。

在这个类当中,我们只需要重写里面的两个configure方法,一个是客户端连接数据源信息,一个是进行授权认证的操作。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.withClientDetails(clientDetails());
}

@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints.tokenStore(redisTokenStore())
.userDetailsService(userDetailsService)
.authenticationManager(authenticationManager);
endpoints.tokenServices(defaultTokenServices());
endpoints.exceptionTranslator(webResponseExceptionTranslator());//认证异常翻译
}

ResourceServerConfigurerAdapter

资源服务,可以看作在微服务体系中的每一个服务,一个服务相当于一个资源,个人理解下来每个资源都需要实现这一个类,实现的机制下来理解为在

类中写入tokenStore,指向redis服务器,由Oauth内部连接redis来判断token是否在有效期内。如果不做这一个

的实现,也可以在全局请求的时候进行拦截,获取到token,调用/oauth/check_token这个接口来进行鉴权的操

作,下面贴上在同一个应用内的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
@Override
public void configure(HttpSecurity http) throws Exception {
http.
csrf().disable()
.authorizeRequests().anyRequest().authenticated()
.and()
.httpBasic();
}

@Override
public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
super.configure(resources);
}

WebSecurityConfigurerAdapter

这个在Oauth中的意义就是进行请求拦截和过滤,以及用户是否可用的判断逻辑了,相当于认证的逻辑,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService)
.passwordEncoder(passwordEncoder());
}

@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated()
.antMatchers("/oauth/**").permitAll()
.and()
.csrf().disable();
}

@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/css/**", "/js/**", "/plugins/**", "/favicon.ico");
}