SpringSecurity单体项目最佳实践到这里,我们的SpringSecurity就已经完结啦 , 文章中可能有些地方不能做到全面覆盖,视频教程地址
- 初始项目地址
- 完成项目地址
- 建议下载初始项目,跟着文章一步一步搭建 。加深对于
SpringSecurity
的理解 。
- 需要将
application.properties
的数据库配置,改成您自己对应的信息
- 如若依赖问题 , 修改Idea Maven,改成自己的
- 还需将Jdk版本改成您自己所使用的的版本 。项目使用的是
JDK12
- 数据库脚本在完成项目中的sql文件中
- 添加
SpringSecurity
依赖
- 注:这里没有申明版本号,是由于我们项目继承的SpringBoot父项目,它已经为我们适配了对于的版本 。
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency>
【👍SpringSecurity单体项目最佳实践】然后启动项目即可:- ? 观察控制台:这是
SpringSecurity
为我们临时生成的密码,默认用户名为user
文章插图
- ? 回到浏览器 , 输入
http://localhost:8080/community
,由于我们此时还未登陆,会重定向到默认创建的登陆页面中 , 这是SpringSecurity默认为我们做的 。 - 输入控制台的密码 , 即可进入到系统,
文章插图
3、自定义使用
- 相信小伙伴们已经对
SpringSecurity
已经有了初步的了解,但是正常的项目中 , 不可能采用这个默认登陆页面呀 , 这点SpringSecurity
也早就想到了 。 - 当然可以自定义登陆页面,但是在自定义登陆页面之前,我们需要简单处理一下我们的实体类 。
在用户登录时,系统会根据用户名,从存储设备查找该用户的密码及权限等,将其组装成一个UserDetails
对象 。并用UserDetails
中的数据对用户进行认证 , 决定其输入的用户名/密码是否正确 。
- 观察
UserDetails
结构
public interface UserDetails extends Serializable { Collection<? extends GrantedAuthority> getAuthorities();//权限 String getPassword();//密码 String getUsername();//用户名 boolean isAccountNonExpired();//账号是否未过期 boolean isAccountNonLocked();//账号是否未锁定 boolean isCredentialsNonExpired();//密码是否未过期 boolean isEnabled();//是否激活
- 里面定义了许多关于用户的信息 , 可以看到它是一个接口,并不能直接使用 。那么肯定就有默认的实现类,要不然我们上面的登陆功能是怎么完成的呢 。
- ? 此项目中采用 实体类继承它的方式来完成 。
@Datapublic class User implements UserDetails {private int id;private String username;private String password;private String salt;private String email;private int type; // 1 管理员 2普通用户private int status;private String activationCode;private String headerUrl;private Date createTime;//权限@Overridepublic Collection<? extends GrantedAuthority> getAuthorities() {List<GrantedAuthority> permissions = new ArrayList<>();permissions.add((GrantedAuthority) () -> {switch (type) { //case 1:return "ADMIN";default:return "USER";}});return permissions;}// true 帐户未过期@Overridepublic boolean isAccountNonExpired() {return true;}// true 帐户未锁定@Overridepublic boolean isAccountNonLocked() {return true;}// true 凭证未过期@Overridepublic boolean isCredentialsNonExpired() {return true;}// true 账号是否可用@Overridepublic boolean isEnabled() {return true;}}
- ? 定义了UserDetails之后,当然还远远不够,哪个方法查询数据库来获取我们的用户信息呢?就是Security中的
UserDetailsService
接口
文章插图
- ? 它肯定也有默认实现类的 , 但是我们需要查询数据库对应的用户数据,所以我们还是采用
自定义
的方式去完成 。
@Servicepublic class UserService implements UserDetailsService {@Resourceprivate UserMapper userMapper;// 根据用户名去查询用户数据public User findUserByName(String username) {return userMapper.selectByName(username);}@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {return this.findUserByName(username);}}
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- .NET 源码学习 [数据结构-线性表1.2] 链表与 LinkedList<T>
- PGL Paddle Graph Learning 关于图计算&图学习的基础知识概览:前置知识点学习
- 持续更新~ Arch Linux + KDE 配置&美化
- <一>类,对象,this指针
- "xxx cannot be cast to jakarta.servlet.Servlet "报错解决方式
- LAPM概述及配置
- 【lwip】10-ICMP协议&源码分析
- Unreal NetMode&NetRole 解析
- 【lwip】09-IPv4协议&超全源码实现分析
- 38 全球名校AI课程库| 马萨诸塞大学 · 自然语言处理进阶课程『Advanced Natural Language Processing』