大家好 我是积极向上的湘锅锅
(50条消息) 万字详解 SpringSecurity+Mybatis前后端分离的安全管理实现(二)_湘锅锅的博客-CSDN博客
目录
1.创建工程
2.配置工程
1.基础配置
2.pom.xml 配置
3.mybatis配置
4.springboot配置
3.数据库设计
1.创建表
2.数据库表内容
4.springsecurity配置
1.WebSecurityConfig
2.MD5工具类
3.自定义密码校验器
4.自定义登录校验
5. 开始测试
SpringSecurity
SpringSecurity提供了一个权限的验证管理的快速搭建工具。
以Web开发为例,使用SpringSecurity框架后
- 可以对前端发来的url请求进行拦截,从而验证用户的权限是否允许该用户进行此请求。
- 提供了登录和登出的接口,当用户向接口传入账号密码信息后,框架会根据已知的用户列表验证账号密码,并读取该用户的权限,标记该用户的Session对象;登出时,也会销毁用户的JSessionID信息。
- 这个用户列表既可以写在代码里面(基于内存访问),也可以通过Dao层和Service层从数据库里获取(基于JDBC的访问)。
- 支持用户和权限直接对应,也支持RBAC(基于角色的控制管理),即用户和角色对应,角色再对应权限。
勾选以下依赖
点击finish咱们的工程就创建好啦
先把不需要的先删掉
把application.properties改成application.yaml
这里采用yaml的写法
加入德鲁伊 druid
com.alibaba
druid-spring-boot-starter
1.1.22
如果报错记得这俩个来回点一下
在application.yaml种写入自己的mybatis配置
写入自己的账号密码还有url这些
spring:
datasource:
username: root
password: root
url: jdbc:mysql://localhost:3306/springboot?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=false
driver-class-name: com.mysql.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
---
//注意看下一张图
mybatis:
mapper-locations: classpath:mybatis/mapper/*.xml
然后创建pojo,mapper,sevice
这些都是mybatis的操作 就不过多阐述
完成后如下
开启包扫描 扫描mapper
然后可以自己用测试类测试一下是否连接成功
如果报错估计就是配置或者路径不对
实在不行可以clean一下 然后compile
在数据库运行即可
/*
Navicat Premium Data Transfer
Source Server : SSM
Source Server Type : MySQL
Source Server Version : 80027
Source Host : localhost:3306
Source Schema : springboot
Target Server Type : MySQL
Target Server Version : 80027
File Encoding : 65001
Date: 05/05/2022 23:35:09
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`uid` int(0) NOT NULL AUTO_INCREMENT,
`username` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '用户名',
`password` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '密码',
`roles` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '角色',
PRIMARY KEY (`uid`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (1, 'superadmin', '7175f5c5ea79851930b990a81bac06f9', 'ROLE_SUPER_ADMIN');
INSERT INTO `user` VALUES (2, 'admin', '7175f5c5ea79851930b990a81bac06f9', 'ROLE_ADMIN');
INSERT INTO `user` VALUES (3, 'ideal', '7175f5c5ea79851930b990a81bac06f9', 'ROLE_USER');
SET FOREIGN_KEY_CHECKS = 1;
创建config文件夹==>创建WebSecurityConfig==>继承WebSecurityConfigurerAdapter
==>添加@Configuration和@EnableWebSecurity注解
完成后如下
//权限
@Override
protected void configure(HttpSecurity http) throws Exception {
super.configure(http);
}
//认证
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
super.configure(auth);
}
configure(HttpSecurity http)的实现
这个configure方法是核心的配置方法。鉴权的决定器、自定义的登录登出、匿名用户访问、会话管理都在在这里定义
这个configure方法是进行身份验证的。也就是说需要用到我们所定义的UserDetailsService实现类
同时,5.x以上的Security框架要求数据库中或内存中存放的用户密码必须经过加密!以密文形式存储,因此还需要通知configure方法我们使用的加密方法
在config文件夹新建MD5Util==>CV代码
/**
* MD5加密工具
*
*/
public class MD5Util {
private static final String SALT = "xhx";
public static String encode(String password) {
password = password + SALT;
MessageDigest md5 = null;
try {
md5 = MessageDigest.getInstance("MD5");
} catch (Exception e) {
throw new RuntimeException(e);
}
char[] charArray = password.toCharArray();
byte[] byteArray = new byte[charArray.length];
for (int i = 0; i < charArray.length; i++)
byteArray[i] = (byte) charArray[i];
byte[] md5Bytes = md5.digest(byteArray);
StringBuffer hexValue = new StringBuffer();
for (int i = 0; i < md5Bytes.length; i++) {
int val = ((int) md5Bytes[i]) & 0xff;
if (val < 16) {
hexValue.append("0");
}
hexValue.append(Integer.toHexString(val));
}
return hexValue.toString();
}
public static void main(String[] args) {
String encode = MD5Util.encode("123456");
System.out.println(encode);
}
}
说明一下 这是加盐的MD5 所以可以根据自己需要 改一下SALT就行
在config文件夹新建MyPasswordEncoder
public class MyPasswordEncoder implements PasswordEncoder {
@Override
public boolean matches(CharSequence rawPassword, String encodedPassword) {
return encodedPassword.equals(MD5Util.encode(rawPassword.toString()));
}
@Override
public String encode(CharSequence rawPassword) {
return MD5Util.encode(rawPassword.toString());
}
}
然后在WebSecurityConfig注入这个bean 告诉springboot我使用自定义密码认证方式
// 设置默认的加密方式(MD5方式加密)
@Resource
private PasswordEncoder passwordEncoder;
在sevice的impl新建UserSevice 一定要implements UserDetailsService!!!
框架提供的UserDetail的Service接口,其中需要实现的方法是UserDetails loadUserByUsername(String username)
@Service
public class UserSevice implements UserDetailsService {
@Autowired
UserMapper userMapper;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
UserExample example = new UserExample();
UserExample.Criteria criteria = example.createCriteria();
criteria.andUsernameEqualTo(username);
List users = userMapper.selectByExample(example);
//以上调用自己的就好 不用复制
User user = null;
user = users.get(0);
if(user==null){
throw new UsernameNotFoundException("用户名不存在");
}
List authorityList = new ArrayList<>();
String role = user.getRoles();
//ROLE是分辨是角色还是用户 以下划线分隔
//权限就自动附加上去了
if(role!=null){
authorityList.add(new SimpleGrantedAuthority(role.trim()));
}
return new org.springframework.security.core.userdetails.User(user.getUsername(),user.getPassword(),authorityList);
}
}
在WebSecurityConfig注入这个sevice 然后在 configure(AuthenticationManagerBuilder auth) 里面调用
@Autowired
UserSevice userSevice;
//认证
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userSevice).passwordEncoder(passwordEncoder);
}
在configure(HttpSecurity http)写入
//首页所有人可以访问,功能页只有对应权限的人才能访问
http.authorizeRequests().antMatchers("/").permitAll()
.antMatchers("/level1/**").hasAnyRole("USER","ADMIN","SUPER_ADMIN")
.antMatchers("/level2/**").hasAnyRole("ADMIN","SUPER_ADMIN")
.antMatchers("/level3/**").hasRole("SUPER_ADMIN")
.and().authorizeRequests();
整个 WebSecurityConfig就为这样
授权操作已经在自定义登录时完成了
所以权限那块就只需要我们设置权限就好 这里做个参考
要访问leve1下的内容 必须要USER,ADMIN,SUPER_ADMIN
而要访问level2下的内容 需要ADMIN,SUPER_ADMIN,有USER权限的就不行
好啦 一个简单的mybatis整合就完成啦
接下来就是实现多自定义模块化处理
(50条消息) 万字详解 SpringSecurity+Mybatis前后端分离的安全管理实现(二)_湘锅锅的博客-CSDN博客
欢迎点赞关注收藏