系统设计

使用Spring Security OAuth 实现OAuth

2018-01-12  本文已影响318人  刘亚涛

OAuth 2.0 简介

OAuth 2.0是一种工业级的授权协议。OAuth 2.0是从创建于2006年的OAuth 1.0继承而来的。OAuth 2.0致力于帮助开发者简化授权并为web应用、桌面应用、移动应用、嵌入式应用提供具体的授权流程。

OAuth 2.0 is the industry-standard protocol for authorization. OAuth 2.0 supersedes the work done on the original OAuth protocol created in 2006. OAuth 2.0 focuses on client developer simplicity while providing specific authorization flows for web applications, desktop applications, mobile phones, and living room devices.

OAuth 2.0的四个角色

为了方便理解,以常用的使用微信登录为例

四种授权方式(Grant Type)

其他概念

实现

有的时候资源服务器和认证服务器是两个不同的应用,有的时候资源服务器和认证服务器在通一个应用中,不同之处在于资源服务器是否需要检查token的有效性,前者需要检查,后者不需要。这里实现后者。

Application的安全配置

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.formLogin()
                .and().csrf().disable()
                .authorizeRequests().anyRequest().authenticated();
    }

    @Override
    public void configure(WebSecurity web) throws Exception {
        super.configure(web);
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().withUser("lyt").password("lyt").authorities("ROLE_USER")
                .and().withUser("admin").password("admin").authorities("ROLE_ADMIN");
    }

    @Bean
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }
}

认证服务器配置

@EnableAuthorizationServer
@Configuration
public class AuthorizationServerConfiguration  extends AuthorizationServerConfigurerAdapter {

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory().withClient("client")
                .scopes("read","write")
                .secret("secret")
                .authorizedGrantTypes("authorization_code","password","implicit","client_credentials");}

    @Override
    public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
        super.configure(security);
    }

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

    @Autowired
    @Qualifier("authenticationManagerBean")
    private AuthenticationManager authenticationManager;
}

资源服务器配置

@EnableGlobalMethodSecurity(prePostEnabled = true)
@EnableResourceServer
@Configuration
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {
    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.antMatcher("/oauth2/api/**").authorizeRequests()
            .antMatchers(HttpMethod.GET, "/read/**").access("#oauth2.hasScope('read')")
            .antMatchers(HttpMethod.POST, "/write/**").access("#oauth2.hasScope('write')")
            .antMatchers(HttpMethod.PUT, "/write/**").access("#oauth2.hasScope('write')")
            .antMatchers(HttpMethod.DELETE, "/write/**").access("#oauth2.hasScope('write')");
    }

}

资源服务器filter-order设置

需要在application.yml中将filter-order设置成3,具体原因参考 链接

防止cookie冲突

为了避免认证服务器的cookie和客户端的cookie冲突,出现错误,最好修改cookie name 或者设置contextPath

测试

postman中提供OAuth 2.0的认证方式,可以获取到token之后再把认证加入http请求中,即可请求资源服务器的REST API

客户端信息 授权 获取的token 访问资源服务器API

最后

测试代码github地址。有兴趣可以关注微信公众账号获取最新推送文章。

欢迎关注微信公众账号
上一篇 下一篇

猜你喜欢

热点阅读