SpringSecurity前后端分离的安全管理实现(一)

大家好 我是积极向上的湘锅锅  

(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(基于角色的控制管理),即用户和角色对应,角色再对应权限。

1.创建工程

SpringSecurity前后端分离的安全管理实现(一)_第1张图片

 SpringSecurity前后端分离的安全管理实现(一)_第2张图片

勾选以下依赖 

SpringSecurity前后端分离的安全管理实现(一)_第3张图片SpringSecurity前后端分离的安全管理实现(一)_第4张图片 

SpringSecurity前后端分离的安全管理实现(一)_第5张图片

SpringSecurity前后端分离的安全管理实现(一)_第6张图片

SpringSecurity前后端分离的安全管理实现(一)_第7张图片 SpringSecurity前后端分离的安全管理实现(一)_第8张图片

 点击finish咱们的工程就创建好啦


2.配置工程

1.基础配置

先把不需要的先删掉

SpringSecurity前后端分离的安全管理实现(一)_第9张图片

=====》 SpringSecurity前后端分离的安全管理实现(一)_第10张图片

 把application.properties改成application.yaml

这里采用yaml的写法

SpringSecurity前后端分离的安全管理实现(一)_第11张图片


2.pom.xml 配置

加入德鲁伊 druid


       com.alibaba
        druid-spring-boot-starter
        1.1.22
 

如果报错记得这俩个来回点一下

SpringSecurity前后端分离的安全管理实现(一)_第12张图片

3.mybatis配置

在application.yaml种写入自己的mybatis配置

SpringSecurity前后端分离的安全管理实现(一)_第13张图片

写入自己的账号密码还有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的操作 就不过多阐述

完成后如下

SpringSecurity前后端分离的安全管理实现(一)_第14张图片


  4.springboot配置

        开启包扫描 扫描mapper

SpringSecurity前后端分离的安全管理实现(一)_第15张图片

 然后可以自己用测试类测试一下是否连接成功

 如果报错估计就是配置或者路径不对

 实在不行可以clean一下 然后compile


3.数据库设计 

 1.创建表

        在数据库运行即可

/*
 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;

 2.数据库表内容

SpringSecurity前后端分离的安全管理实现(一)_第16张图片

4.springsecurity配置

 1.WebSecurityConfig

创建config文件夹==>创建WebSecurityConfig==>继承WebSecurityConfigurerAdapter

==>添加@Configuration和@EnableWebSecurity注解 

完成后如下

SpringSecurity前后端分离的安全管理实现(一)_第17张图片

        重写以下方法 SpringSecurity前后端分离的安全管理实现(一)_第18张图片

  //权限
    @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(AuthenticationManagerBuilder auth)的实现

这个configure方法是进行身份验证的。也就是说需要用到我们所定义的UserDetailsService实现类

 同时,5.x以上的Security框架要求数据库中或内存中存放的用户密码必须经过加密!以密文形式存储,因此还需要通知configure方法我们使用的加密方法


 2.MD5工具类 

在config文件夹新建MD5Util==>CV代码

SpringSecurity前后端分离的安全管理实现(一)_第19张图片


/**
 * 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就行 

 3.自定义密码校验器

在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;

  4.自定义登录校验

在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);
    }

5. 开始测试

在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就为这样

SpringSecurity前后端分离的安全管理实现(一)_第20张图片

 授权操作已经在自定义登录时完成了

所以权限那块就只需要我们设置权限就好 这里做个参考

要访问leve1下的内容 必须要USER,ADMIN,SUPER_ADMIN

而要访问level2下的内容 需要ADMIN,SUPER_ADMIN,有USER权限的就不行

好啦 一个简单的mybatis整合就完成啦

接下来就是实现多自定义模块化处理

(50条消息) 万字详解 SpringSecurity+Mybatis前后端分离的安全管理实现(二)_湘锅锅的博客-CSDN博客


欢迎点赞关注收藏

你可能感兴趣的:(springboot,spring,boot,后端,spring,intellij,idea,java)