pom配置
<dependencies>
<dependency>
<groupId>org.springframework.security.oauth</groupId>
<artifactId>spring-security-oauth2</artifactId>
<version>2.0.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
</dependencies>
security配置
水电费
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
public void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/oauth/**").permitAll()
.and()
.csrf().disable();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
// 基于内存的认证
auth.inMemoryAuthentication()
.withUser("user")
.password(new BCryptPasswordEncoder().encode("111111"))
.roles("USER")
.and()
.withUser("admin")
.password(new BCryptPasswordEncoder().encode("111111"))
.roles("ADMIN");
}
/**
* 需要配置这个支持password模式
* support password grant type
* @return
* @throws Exception
*/
@Override
@Bean
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
auth配置
@Configuration
@EnableAuthorizationServer
public class AuthorizationConfig extends AuthorizationServerConfigurerAdapter {
@Autowired
private TokenStore tokenStore;
/**
* 注入authenticationManager
* 来支持 password grant type
*/
@Autowired
private AuthenticationManager authenticationManager;
/**
* 配置编码器
*/
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.inMemory() // 基于内存
.withClient("app") //授权客户端
.secret(passwordEncoder().encode("111111")) //授权码
.accessTokenValiditySeconds((int) TimeUnit.SECONDS.toSeconds(30)) // 授权过期时间
.authorizedGrantTypes("password", "refresh_token", "client_credentials") // 授权模式
.scopes("all") // 授权范围
.resourceIds("rid"); // 授权资源
}
@Override
public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception {
oauthServer .tokenKeyAccess("permitAll()")
.checkTokenAccess("permitAll()")
.allowFormAuthenticationForClients();
}
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints.tokenStore(tokenStore)
.authenticationManager(authenticationManager);
}
@Bean
public TokenStore tokenStore() {
//这里为了简单达到目的,直接使用内存存储Token和用户信息。
return new InMemoryTokenStore();
}
}
@EnableResourceServer
@Configuration
public class ResourceConfigure extends ResourceServerConfigurerAdapter {
@Override
public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
resources.resourceId("rid");
}
@Override
public void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/user/**").authenticated()// 只是告知授权才能访问
.antMatchers("/test/**").hasRole("ADMIN");// 当密码授权访问时,告知哪个角色能访问
}
}
测试Controller
@Slf4j
@RestController
@RequestMapping("/test")
public class TestController {
@RequestMapping("/hello")
public String hello() {
try {
return "Hello Word test";
} catch (Exception e) {
log.error("", e);
return "test/hello 异常";
}
}
}
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {
@RequestMapping("/hello")
public String hello() {
try {
return "Hello Word user";
} catch (Exception e) {
log.error("", e);
return "user/hello 异常";
}
}
}
请求测试
password授权模式获取token

根据token访问后台

客户端授权模式获取token

根据token访问后台

注意:以上两次访问后台对应的token授权方式肯定要和上面配置的一致,不然就会报错