怎么在SpringSecurity中动态加载用户角色权限

发布时间:2021-05-31 17:46:04 作者:Leah
来源:亿速云 阅读:163

怎么在SpringSecurity中动态加载用户角色权限?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

一、动态数据登录验证的基础知识

在本号之前的文章中,已经介绍了Spring Security的formLogin登录认证模式,RBAC的权限控制管理模型,并且针对Spring Security的登录认证逻辑源码进行了解析等等。我们所有的用户、角色、权限信息都是在配置文件里面写死的,然而在实际的业务系统中,这些信息通常是存放在RBAC权限模型的数据库表中的。下面我们来回顾一下其中的核心概念:

以上是对一些核心的基础知识的总结,如果您对这些知识还不是很清晰,建议您先往下读本文。如果看完本文仍然理解困难,建议您翻看本号之前的文章。

二、UserDetails与UserDetailsService接口

下面我们来看一下UserDetails接口都有哪些方法。

public interface UserDetails extends Serializable {
 //获取用户的权限集合
 Collection<? extends GrantedAuthority> getAuthorities();
 //获取密码
 String getPassword();
 //获取用户名
 String getUsername();
 //账号是否没过期
 boolean isAccountNonExpired();
 //账号是否没被锁定
 boolean isAccountNonLocked();
 //密码是否没过期
 boolean isCredentialsNonExpired();
 //账户是否可用
 boolean isEnabled();
}

现在,我们明白了,只要我们把这些信息提供给Spring Security,Spring Security就知道怎么做登录验证了,根本不需要我们自己写Controller实现登录验证逻辑。

三、实现UserDetails 接口

public class SysUser implements UserDetails{
 String password(); //密码
 String username(); //用户名
 boolean accountNonExpired; //是否没过期
 boolean accountNonLocked; //是否没被锁定
 boolean credentialsNonExpired; //是否没过期
 boolean enabled; //账号是否可用
 Collection<? extends GrantedAuthority> authorities; //用户的权限集合
 //省略构造方法
 //省略set方法
 //省略get方法(即接口UserDetails的方法)
}

我们就是写了一个适应于UserDetails的java POJO类,所谓的 UserDetails接口实现就是一些get方法。get方法由Spring Security调用,我们通过set方法或构造函数为 Spring Security提供UserDetails数据。

四、实现UserDetailsService接口

@Component
public class MyUserDetailsService implements UserDetailsService{
 @Override
 public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
  
 //这里从数据库sys_user表里面查询实体类对象。loadUser方法可使用Mybatis或JDBC或JPA自行实现。
 SysUser sysUser = loadUser(username); 
 // 判断用户是否存在 
 if(user == null) { throw new UsernameNotFoundException("用户名不存在"); }
 //从数据库该用户所有的角色信息,所有的权限标志
 //遍历所有的ROLE角色及所有的Authority权限(菜单、按钮)。
 //用逗号分隔他们的唯一标志,具体过程自行实现。
 sysUser.setAuthorities(  AuthorityUtils.commaSeparatedStringToAuthorityList("ROLE_AMIN , system:user:delete")); 
 //sysUser.setAccountNonLocked(true或false);
 return sysUser;
 }
}

五、最后说明

至此,我们将系统里面的所有的用户、角色、权限信息都通过UserDetailsService和UserDetails告知了Spring Security。但是多数朋友可能仍然不知道该怎样实现登录的功能,其实剩下的事情很简单了:

看完上述内容,你们掌握怎么在SpringSecurity中动态加载用户角色权限的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!

推荐阅读:
  1. 查询oracle用户角色权限
  2. Jenkins用户角色权限设置

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

springsecurity

上一篇:怎么在SpringBoot中实现Shiro授权

下一篇:怎么在iOS中实现表情键盘

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》