跟客户端模式一样,改动一点,同样创建验证服务器和资源服务器
验证服务器的配置
加入红框的东西
把授权类型改一下
Security配置类
在原来的类中加这两个方法
/**
* 使用密码模式需要配置用户签名服务
* 配置AuthenticationManagerBuilder会让Security 自动构建一个AuthenticationManager
* serDetailsService 用于在认证器中根据用户传过来的用户名查找一个用户
* PasswordEncoder 用于密码的加密与比对
* 我们存储用户密码的时候用PasswordEncoder.encode()加密存储,在认证器里会调用PasswordEncoder.matches()进行密码比对
*
* 这里重写了该方法,Security就会启用DaoAuthenticationProvider这个认证器,
* 该认证就是先调用UserDetailsService.loadUserByUsername
* 然后使用PasswordEncoder.matches()进行密码比对,如果认证成功成功则返回一个Authentication对象
*
* void configure(WebSecurity web)这个方法用于配置静态资源的处理方式...
*/
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService()).passwordEncoder(passwordEncoder());
}
/**
* 密码模式验证的数据和权限
* 内存模式的用户数据
*/
@Bean
@Override
protected UserDetailsService userDetailsService() {
InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
manager.createUser(User.withUsername("user1").password(passwordEncoder().encode("123456")).authorities("USER").build());
manager.createUser(User.withUsername("user2").password(passwordEncoder().encode("123456")).authorities("USER").build());
return manager;
}
再加一个包装的用户信息
/**
* SpringSecurity包装的用户信息
*/
@Data
public class SecurityUserDetails implements UserDetails {
String username;
String password;
public Collection<? extends GrantedAuthority> authorities;
//返回当前用户的权限
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return authorities;
}
public SecurityUserDetails(String userName, String password, Collection<? extends GrantedAuthority> authorities){
this.authorities = authorities;
this.username = userName;
this.password = new BCryptPasswordEncoder().encode(password);
}
/**
* 账户是否过期
*/
@Override
public boolean isAccountNonExpired() {
return false;
}
/**
* 是否禁用
*/
@Override
public boolean isAccountNonLocked() {
return false;
}
/**
* 密码是否过期
*/
@Override
public boolean isCredentialsNonExpired() {
return false;
}
/**
* 是否启用
*/
@Override
public boolean isEnabled() {
return true;
}
}
这个包装的用户信息是
比如从数据库中查出了user1和123456和权限等等信息
再用这个包装一下给secuirty使用,会框架里自动校验了
我上面并没有返回我们包装的,直接用框架的内存包装接口返回了,你也可以自定义返回你的
然后,前端用户传密码,密码对了就返回token
这里的后端的密码我是写死了user1,权限 (USER) 没有使用
你也可以把这些信息存到数据库中去读取
资源服务器不用改,看一下密码端口啥的就行了
访问流程:
用户把username:user1,password:123456输入给我们的服务器
我们的服务器带着那个username:user1,password:123456 访问验证服务器获取token返回给前端用户,然后拿token访问资源服务器了
获取token
http://localhost:9992/oauth/token?username=user1&password=123456&grant_type=password&scope=select&client_id=admin2&client_secret=123456
返回的有access_token和refresh_token
请求资源服务器就带着access_token
刷新token就带着refresh_token去验证服务器再获取新token
注意:客户端模式是没有refresh_token