本文章对应视频可在B站查看SpringSecurity6对应视频教程,记得三连哦,这对我很重要呢!
温馨提示:视频与文章相辅相成,结合学习效果更强哦!
系列文章链接
1、初识SpringSecurity,认识主流Java权限框架,SpringSecurity入门使用
2、SpringSecurity集成数据库,完成认证授权操作
3、SpringSecurity实现动态权限,OAuth2.0授权登录等
集成数据库实现认证和授权
- 提供数据表:单表
- 创建Maven项目
- 引入相关依赖
- 配置mysql
- 实体类
- mapper和service
- controller:提供登陆接口
- 配置SpringSecurity
数据表
CREATE TABLE `ums_sys_user` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '用户ID',
`username` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户账号',
`nickname` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户昵称',
`email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT '' COMMENT '用户邮箱',
`mobile` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT '' COMMENT '手机号码',
`sex` int DEFAULT '0' COMMENT '用户性别(0男 1女 2未知)',
`avatar` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT '' COMMENT '头像地址',
`password` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT '' COMMENT '密码',
`status` int DEFAULT '0' COMMENT '帐号状态(0正常 1停用)',
`creator` bigint DEFAULT '1' COMMENT '创建者',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`updater` bigint DEFAULT '1' COMMENT '更新者',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '备注',
`deleted` tinyint DEFAULT '0',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='后台用户表';
创建实体类
package com.stt.springsecuritydemo4.domain.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Collection;
// @Data注解可以自动生成getter、setter、无参构造
// SpringSecurity会将认证的用户信息存储到UserDetails中
@Data
@TableName("ums_sys_user")
public class UmsSysUser implements Serializable, UserDetails {
@TableId
private Long id;
private String username;
private String nickname;
private String email;
private Integer sex;
private String avatar;
private String password;
private Integer status;
private Long creator;
private Long updater;
private LocalDateTime createTime;
private LocalDateTime updateTime;
@TableLogic
private Integer deleted;
private String remark;
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return null;
}
@Override
public String getPassword() {
return password;
}
@Override
public String getUsername() {
return username;
}
@Override
public boolean isAccountNonExpired() {
return status == 0;
}
@Override
public boolean isAccountNonLocked() {
return status == 0;
}
@Override
public boolean isCredentialsNonExpired() {
return status == 0;
}
@Override
public boolean isEnabled() {
return status == 0;
}
}
认证流程
认证实现流程
- 创建一个UserDetailsService实现SpringSecurity的UserDetailsService接口
- 写的是查询用户的逻辑
- 通过配置类对AuthenticationManager与自定义的UserDetailsService进行关联
- SpringSecurity是通过AuthenticationManager实现的认证,会判断用户名和密码对不对
- 在登录方法所在的类中注入AuthenticationManager,调用authenticate实现认证逻辑
- 认证之后返回认证后的用户信息
UserDetailsService
package com.stt.springsecuritydemo4.web;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.stt.springsecuritydemo4.domain.entity.UmsSysUser;
import com.stt.springsecuritydemo4.mapper.UmsSysUserMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
@Service
@Slf4j
public class UmsSysUserDetailsService implements UserDetailsService {
private final UmsSysUserMapper sysUserMapper;
public UmsSysUserDetailsService(UmsSysUserMapper sysUserMapper) {
this.sysUserMapper = sysUserMapper;
}
/**
* 根据用户名查询用户:如果没有查到用户会抛出异常 UsernameNotFoundException【用户名不存在】
* 返回:UserDetails,SpringSecurity定义的类,用来存储用户信息
* UmsSysUser:实现了UserDetails接口了,根据多态,它就是一个UserDetails
* @throws UsernameNotFoundException
*/
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
log.info("loadUserByUsername=========>{}",username);
UmsSysUser umsSysUser = sysUserMapper.selectOne(new LambdaQueryWrapper<UmsSysUser>().eq(UmsSysUser::getUsername, username));
log.info("loadUserByUsername=====umsSysUser====>{}",umsSysUser);
// TODO 后期可以查看权限,角色等等
return umsSysUser;
}
}
Controller
package com.stt.springsecuritydemo4.controller;
import com.stt.springsecuritydemo4.domain.dto.LoginParams;
import com.stt.springsecuritydemo4.serivice.IUmsSysUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("auth")
public class AuthController {
private final IUmsSysUserService sysUserService;
public AuthController(IUmsSysUserService sysUserService) {

最低0.47元/天 解锁文章
3197





