实例: https://blog.csdn.net/xyjcfucdi128/article/details/87163388 --转载
demo是下载的, 上面是原博主的博客, 记录一下使用demo过程的一些问题
依赖:
由于 Spring Boot 中的 OAuth 协议是在 Spring Security 基础上完成的。因此首先编辑 pom.xml,添加 Spring Security 以及 OAuth 依赖。
认证服务器的配置有哪些?
主要集中在资源的获取源配置、缓存配置
oauth认证服务器还需要提供一个返回Principal对象的接口,具体作用会在下文中详解
@RestController
@RequestMapping("/api")
public class MemberController {
@GetMapping("/member")
public Principal user(Principal member) {
//获取当前用户信息
return member;
}
}
如何实现对请求的拦截?
微服务架构需要在每个服务配置spring security的拦截规则,使用@Configuration和@EnableWebSecurity注解 ,如下图
.antMatchers("/api/**").authenticated() //对所有api/**请求拦截
拦截的请求返回401, 需要请求token:
/oauth/token的接口是框架提供的, 选择Basic Auth填写客户端信息
客户端信息来源: 内存或者数据库
选择数据库来源, 需要存储在表oauth_client_details
token请求后的存储:
在认证服务器中会配置redisToken存储, 同时redis的过期时间很适合token设置有效时间。
权限资源又是怎么获取到的?
用户请求token时会调用loadUserByUsername()方法,返回user对象,该对象包含用户的权限资源。
/**
* 〈自定义UserDetailService〉
* 自定义认证逻辑
* @author wangmx
* @since 1.0.0
*/
@Service//("userDetailService")
public class MyUserDetailService implements UserDetailsService {
@Autowired
private MemberDao memberDao;
@Override
public UserDetails loadUserByUsername(String memberName) throws UsernameNotFoundException {
Member member = memberDao.findByMemberName(memberName);
if (member == null) {
throw new UsernameNotFoundException(memberName);
}
Set<GrantedAuthority> grantedAuthorities = new HashSet<>();
// 可用性 :true:可用 false:不可用
boolean enabled = true;
// 过期性 :true:没过期 false:过期
boolean accountNonExpired = true;
// 有效性 :true:凭证有效 false:凭证无效
boolean credentialsNonExpired = true;
// 锁定性 :true:未锁定 false:已锁定
boolean accountNonLocked = true;
for (Role role : member.getRoles()) {
//角色必须是ROLE_开头,可以在数据库中设置
GrantedAuthority grantedAuthority = new SimpleGrantedAuthority(role.getRoleName());
grantedAuthorities.add(grantedAuthority);
//获取权限
for (Permission permission : role.getPermissions()) {
GrantedAuthority authority = new SimpleGrantedAuthority(permission.getUri());
grantedAuthorities.add(authority);
}
}
User user = new User(member.getMemberName(), member.getPassword(),
enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, grantedAuthorities);
return user;
}
}
请求资源服务器api,怎么判断用户是否有该api访问权限?
请求/api/current接口,成功返回结果
断点看一下访问流程,发现会调用oauth认证服务器的接口/member
由此可以知道,用户在访问权限控制的接口时,需要通过认证服务器提供的接口返回principal对象,进行资源的匹配,有权限则成功访问。
那资源服务器又是怎么找到认证服务器提供的接口呢?
答案就是在bootstrap.yml文件中配置认证服务器的接口地址
ResourceServerConfig配置中可以不拦截请求,通过@PreAuthorize注解需要权限控制的接口
当使用hasRole权限时,需要加前缀ROLE_,否则会拒绝访问
数据库修改成
其他表达式:
参考: https://blog.csdn.net/qq_22172133/article/details/86503223 --springSecurity
https://blog.csdn.net/qq_41948525/article/details/106589811 --.关于SpringSecurity安全拦截请求.authenticated()未起作用
关于oauth的概念,参考上一节 oauth