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;
}
}
* 通常数据库表sys\_user字段要和SysUser属性一一对应,比如username、password、enabled。但是比如accountNonLocked字段用于登录多次错误锁定,但我们一般不会在表里存是否锁定,而是存一个锁定时间字段。通过锁定时间是否大于当前时间判断账号是否锁定,所以实现过程中可以灵活做判断并用好set方法,不必拘泥于一一对应的形式。
* 角色是一种特殊的权限,在Spring Security我们可以使用hasRole(角色标识)表达式判断用户是否具有某个角色,决定他是否可以做某个操作;通过hasAuthority(权限标识)表达式判断是否具有某个操作权限。
五、最后说明
------
至此,我们将系统里面的所有的用户、角色、权限信息都通过UserDetailsService和UserDetails告知了Spring Security。但是多数朋友可能仍然不知道该怎样实现登录的功能,其实剩下的事情很简单了:
* 写一个登录界面,写一个登录表单,表单使用post方法提交到默认的/login路径
* 表单的用户名、密码字段名称默认是username、password。
* 写一个登录成功之后的跳转页面,比如index.html
**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**
**深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**
**因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**
![img](https://img-blog.csdnimg.cn/img_convert/f4882f402b204f6e94953460e004a470.jpeg)
![img](https://img-blog.csdnimg.cn/img_convert/e644a50250e289a3d78cdf291333bff8.png)
![img](https://img-blog.csdnimg.cn/img_convert/0defe7895c67430fb8ce5a8c2e150f7e.png)
![img](https://img-blog.csdnimg.cn/img_convert/783e55f93fbddbb75e49a1063f4ca76e.png)
![img](https://img-blog.csdnimg.cn/img_convert/5c0e3712e89308cf2151ecafd23c90b0.png)
![img](https://img-blog.csdnimg.cn/img_convert/e8afccaf2caab198c85eb8f3b89e183e.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!**
**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**
**如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)**
![img](https://img-blog.csdnimg.cn/img_convert/698af857a451011f3b4dd57761e1fa95.jpeg)
# 最后
关于面试刷题也是有方法可言的,建议最好是按照专题来进行,然后由基础到高级,由浅入深来,效果会更好。当然,这些内容我也全部整理在一份pdf文档内,分成了以下几大专题:
* Java基础部分
![](https://img-blog.csdnimg.cn/img_convert/9038d53e4004e2568c2b30962024fe0b.webp?x-oss-process=image/format,png)
* 算法与编程
![](https://img-blog.csdnimg.cn/img_convert/240f3ef86a60675ffe184ca997dee285.webp?x-oss-process=image/format,png)
* 数据库部分
![](https://img-blog.csdnimg.cn/img_convert/a335a1e1d54dcdb28f6fcbc5b8d01ad1.webp?x-oss-process=image/format,png)
* 流行的框架与新技术(Spring+SpringCloud+SpringCloudAlibaba)
![](https://img-blog.csdnimg.cn/img_convert/038e707178ce22c00d2747738f5874fb.webp?x-oss-process=image/format,png)
这份面试文档当然不止这些内容,实际上像JVM、设计模式、ZK、MQ、数据结构等其他部分的面试内容均有涉及,因为文章篇幅,就不全部在这里阐述了。
**作为一名程序员,阶段性的学习是必不可少的,而且需要保持一定的持续性,这次在这个阶段内,我对一些重点的知识点进行了系统的复习,一方面巩固了自己的基础,另一方面也提升了自己的知识广度和深度。**
la-1711996163889)]
这份面试文档当然不止这些内容,实际上像JVM、设计模式、ZK、MQ、数据结构等其他部分的面试内容均有涉及,因为文章篇幅,就不全部在这里阐述了。
**作为一名程序员,阶段性的学习是必不可少的,而且需要保持一定的持续性,这次在这个阶段内,我对一些重点的知识点进行了系统的复习,一方面巩固了自己的基础,另一方面也提升了自己的知识广度和深度。**