时间:2021-05-20
很多人觉得Spring Security实现登录验证很难,我最开始学习的时候也这样觉得。因为我好久都没看懂我该怎么样将自己写的用于接收用户名密码的Controller与Spring Security结合使用,这是一个先入为主的误区。后来我搞懂了:根本不用你自己去写Controller。
你只需要告诉Spring Security用户信息、角色信息、权限信息、登录页是什么?登陆成功页是什么?或者其他有关登录的一切信息。具体的登录验证逻辑它来帮你实现。
一、动态数据登录验证的基础知识
在本号之前的文章中,已经介绍了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接口
@Componentpublic 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。但是多数朋友可能仍然不知道该怎样实现登录的功能,其实剩下的事情很简单了:
然后把这些信息通过配置方式告知Spring Security ,以上的配置信息名称都可以灵活修改。如果您不知道如何配置请参考本号之前的文章《formLogin登录认证模式》。
总结
以上所述是小编给大家介绍的SpringSecurity动态加载用户角色权限实现登录及鉴权功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
此案例主要实现了一个功能是,在vue实例首次运行时,在加载了login和404两个路由规则,登录成功后,根据登录用户角色权限获取该角色相应菜单权限,生成新的路由
在上一次写的文章中,为大家说到了如何动态的从数据库加载用户、角色、权限信息,从而实现登录验证及授权。在实际的开发过程中,我们通常会有这样的一个需求:当用户多次登
这里我们以用户登录鉴权为例express依赖express-session中间件实现session功能若我们不加载express-session组件router
缘起标准的RABC,权限需要支持动态配置,springsecurity默认是在代码里约定好权限,真实的业务场景通常需要可以支持动态配置角色访问权限,即在运行时去
本文讲述springboot整合springsecurity在方法上使用注解实现权限控制,使用自定义userdetailservice,从mysql中加载用户信