SpringSecurity授权实现基本思路
一、授权基本思路
在SpringSecurity中,会使用默认的FilterSecurityInterceptor来进行权限校验。在 FilterSecurityInterceptor中会从SecurityContextHolder获取其中的Authentication,然后获取其中的 权限信息。当前用户是否拥有访问当前资源所需的权限。
所以我们在项目中只需要把当前登录用户的权限信息也存入Authentication。然后设置我们的资源所需 要的权限即可
二、实现过程
(1)开启相关配置
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig{
.....
}然后就可以使用对应的注解。@PreAuthorize在各接口
@RestController
public class HelloController {
@RequestMapping("/hello")
@PreAuthorize("hasAuthority('test')")
public String hello(){
return "hello";
}
}(2)自定义LoginUser,封装权限信息
我们之前定义了UserDetails的实现类LoginUser,想要让其能封装权限信息就要对其进行修改。
@Data
@NoArgsConstructor
public class LoginUser implements UserDetails{
private User user;
//查询到的权限列表
private List<String> list;
public LoginUser(User user, List<String> list) {
this.list = list;
this.user = user;
}
//自定义一个权限列表的集合 中转操作
@JSONField(serialize = false)
List<SimpleGrantedAuthority> authorities;
//返回权限
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
if (authorities != null) {
return authorities;
}
authorities = new ArrayList<>();
for (String item : list) {
SimpleGrantedAuthority authority = new SimpleGrantedAuthority(item);
authorities.add(authority);
}
return authorities;
}
//获取密码
@Override
public String getPassword() {
return user.getPassword();
}
//获取用户名
@Override
public String getUsername() {
return user.getUserName();
}
//判断账号是否未过期
@Override
public boolean isAccountNonExpired() {
return true;
}
//判断账号是否没有锁定
@Override
public boolean isAccountNonLocked() {
return true;
}
//判断账号是否没有超时
@Override
public boolean isCredentialsNonExpired() {
return true;
}
//判断账号是否可用
@Override
public boolean isEnabled() {
return true;
}
}(3)从数据库查询权限信息
RBAC模型
我们可以在UserDetailsServiceImpl中去调用该mapper的方法查询权限信息封装到LoginUser对象 中即可。
@Service
public class UserDetailServiceImpl implements UserDetailsService {
@Autowired
private UserMapper userMapper;
@Autowired
private MenuMapper menuMapper;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
//1.查询用户信息
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("user_name", username);
User user = userMapper.selectOne(queryWrapper);
//如果没有查询到用户,就抛出异常
if (Objects.isNull(user)) {
throw new RuntimeException("用户名或密码错误");
}
//2.查询用户对应的权限信息
// List<String> list = new ArrayList<>();
// list.add("select");
// list.add("delete");
List<String> list = menuMapper.selectPermsByUserId(user.getId());
//3.返回UserDetails对象
return new LoginUser(user, list);
}
}到此这篇关于SpringSecurity授权实现的文章就介绍到这了,更多相关SpringSecurity授权内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
springboot restTemplate连接池整合方式
这篇文章主要介绍了springboot restTemplate连接池整合方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-10-10
教你安装eclipse2021并配置内网maven中心仓库的图文详解
本文能通过图文并茂的形式给大家介绍安装eclipse2021并配置内网maven中心仓库的相关知识,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧2021-09-09
Java Swing中的工具栏(JToolBar)和分割面版(JSplitPane)组件使用案例
这篇文章主要介绍了Java Swing中的工具栏(JToolBar)和分割面版(JSplitPane)组件使用案例,本文直接给出代码实例和效果截图,需要的朋友可以参考下2014-10-10


最新评论