赞
踩
OAuth 2 标准中定义了以下几种角色:
OAuth 协议的授权模式共分为 4 种,分别说明如下:
由于 Spring Boot 中的 OAuth 协议是在 Spring Security 基础上完成的。因此首先编辑 pom.xml,添加 Spring Security 以及 OAuth 依赖。
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-security</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.security.oauth</groupId>
- <artifactId>spring-security-oauth2</artifactId>
- <version>2.3.3.RELEASE</version>
- </dependency>
授权服务器和资源服务器可以是同一台服务器,也可以是不同服务器,本案例中假设是同一台服务器,通过不同的配置开启授权服务器和资源服务器。
下面是授权服务器配置代码。创建一个自定义类继承自 AuthorizationServerConfigurerAdapter,完成对授权服务器的配置,然后通过 @EnableAuthorizationServer 注解开启授权服务器:
- @Configuration
- @EnableAuthorizationServer
- public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
-
- // 该对象用来支持 password 模式
- @Autowired
- AuthenticationManager authenticationManager;
-
- // 该对象用来将令牌信息存储到内存中
- @Autowired(required = false)
- TokenStore inMemoryTokenStore;
-
- // 该对象将为刷新token提供支持
- @Autowired
- UserDetailsService userDetailsService;
-
- // 指定密码的加密方式
- @Bean
- PasswordEncoder passwordEncoder() {
- // 使用BCrypt强哈希函数加密方案(密钥迭代次数默认为10)
- return new BCryptPasswordEncoder();
- }
-
- // 配置 password 授权模式
- @Override
- public void configure(ClientDetailsServiceConfigurer clients)
- throws Exception {
- clients.inMemory()
- .withClient("password")
- .authorizedGrantTypes("password", "refresh_token") //授权模式为password和refresh_token两种
- .accessTokenValiditySeconds(1800) // 配置access_token的过期时间
- .resourceIds("rid") //配置资源id
- .scopes("all")
- .secret("$2a$10$RMuFXGQ5AtH4wOvkUqyvuecpqUSeoxZYqilXzbz50dceRsga.WYiq"); //123加密后的密码
- }
-
- @Override
- public void configure(AuthorizationServerEndpointsConfigurer endpoints) {
- endpoints.tokenStore(inMemoryTokenStore) //配置令牌的存储(这里存放在内存中)
- .authenticationManager(authenticationManager)
- .userDetailsService(userDetailsService);
- }
-
- @Override
- public void configure(AuthorizationServerSecurityConfigurer security) {
- // 表示支持 client_id 和 client_secret 做登录认证
- security.allowFormAuthenticationForClients();
- }
- }
接下来配置资源服务器。自定义类继承自 ResourceServerConfigurerAdapter,并添加 @EnableResourceServer 注解开启资源服务器配置。
- @Configuration
- @EnableResourceServer
- public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
-
- @Override
- public void configure(ResourceServerSecurityConfigurer resources) {
-
- resources.resourceId("rid") // 配置资源id,这里的资源id和授权服务器中的资源id一致
- .stateless(true); // 设置这些资源仅基于令牌认证
- }
-
- // 配置 URL 访问权限
- @Override
- public void configure(HttpSecurity http) throws Exception {
- http.authorizeRequests()
- .antMatchers("/admin/**").hasRole("admin")
- .antMatchers("/user/**").hasRole("user")
- .anyRequest().authenticated();
- }
- }
这里 Spring Security 的配置与传统的 Security 大体相同,不同在于:
- @Configuration
- public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
- @Bean
- @Override
- public AuthenticationManager authenticationManagerBean() throws Exception {
- return super.authenticationManagerBean();
- }
-
- @Bean
- @Override
- protected UserDetailsService userDetailsService() {
-
- return super.userDetailsService();
- }
-
- @Override
- protected void configure(AuthenticationManagerBuilder auth) throws Exception {
- auth.inMemoryAuthentication()
- .withUser("admin")
- .password("$2a$10$RMuFXGQ5AtH4wOvkUqyvuecpqUSeoxZYqilXzbz50dceRsga.WYiq") //123
- .roles("admin")
- .and()
- .withUser("sang")
- .password("$2a$10$RMuFXGQ5AtH4wOvkUqyvuecpqUSeoxZYqilXzbz50dceRsga.WYiq") //123
- .roles("user");
- }
-
- @Override
- protected void configure(HttpSecurity http) throws Exception {
- http.antMatcher("/oauth/**").authorizeRequests()
- .antMatchers("/oauth/**").permitAll()
- .and().csrf().disable();
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。