栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

目录

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.创建工程

 

勾选以下依赖 

 

 

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


2.配置工程

1.基础配置

先把不需要的先删掉

=====》 

 把application.properties改成application.yaml

这里采用yaml的写法


2.pom.xml 配置

加入德鲁伊 druid


       com.alibaba
        druid-spring-boot-starter
        1.1.22
 

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

3.mybatis配置

在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

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.数据库表内容

4.springsecurity配置

 1.WebSecurityConfig

创建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(AuthenticationManagerBuilder auth)的实现

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

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


 2.MD5工具类 

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


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我使用自定义密码认证方式

@Bean  
public PasswordEncoder passwordEncoder() {  
    return new MyPasswordEncoder();
}  

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

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

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

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

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

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

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

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

待更..........................


欢迎点赞关注收藏

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/868268.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号