SpringSecurity授权服务器、资源服务器
授权服务器
注意:之前的授权服务器框架 Spring security oauth2 官方已经不再维护了 参考以下资料 为什么你使用的 Spring Security OAuth 过期了?
所以这篇文章主要还是介绍旧的 Spring security oauth2 资源服务器
资源服务器是围绕着授权服务器进行的,在 oauth2 中当有了授权服务器以后,才会有资源服务器
先来了解几个概念
Authorize Endpoint:授权端点,进行授权Token Endpoint:令牌端点,经过授权拿到对应的 TokenIntrospection Endpoint:校验端点 ,校验 Token 的合法性Revocation Endpoint:撤销端点,撤销授权

添加依赖
<!-- 这里使用的是 spring-cloud-starter-security 不是 SpringBoot的 -->
<!-- 挺神奇当的,默认的 springboot-oauth2 的一些方法注解是过期的,
但是 spring-cloud-starter-oauth2 却没有-->
<properties>
<java.version>1.8</java.version>
<!-- 注意 SpringBoot 的版本要对的上 -->
<!-- 参考:https://spring.io/projects/spring-cloud#overview -->
<spring.cloud-version>Hoxton.SR8</spring.cloud-version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud-version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-oauth2</artifactId>
</dependency>
<!-- 一些其他的基本依赖就省了(例如 SpringBoot 启动器) -->
</dependencies>
配置 Security
自定义一个 UserDetails 实现类
public class MyUser implements UserDetails {
private final String password;
private final String username;
private final List<GrantedAuthority> authorities;
public MyUser(String password, String username, List<GrantedAuthority> authorities) {
this.password = password;
this.username = username;
this.authorities = authorities;
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return authorities;
}
// 略,总之把 false 都改成 true
}
配置登陆服务 UserDetailsService
@Service
public class UserService implements UserDetailsService {
@Autowired
private PasswordEncoder passwordEncoder;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
String password = passwordEncoder.encode("admin");
return new MyUser(username, password, AuthorityUtils.commaSeparatedStringToAuthorityList("admin"));
}
}
配置 Security 认证
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
// 这里放行了 oauth,其是专门用来授权的接口
.antMatchers("/oauth/**","/login/**","/logout/**").permitAll()
.anyRequest().authenticated()
.and()
// 表单请求放行
.formLogin().permitAll()
.and()
.csrf().disable();
}
}