Spring Security(2)

news2024/7/6 20:03:42

您好,我是湘王,这是我的CSDN博客,欢迎您来,欢迎您再来~

前面已经把需要的环境准备好了,包括数据库和SQL语句,现在再来写代码。至于安装MySQL什么的就跳过去了,娘度子里面一大把。

先做一点声明:因为考虑到有些初学Java的工程师可能并不太熟悉MyBatis,而且MyBatis也并非能完全代替SQL,所以在接下来的所有业务代码中,会以JDBC为主。这么做也很好理解:会MyBatis的很大可能也会JDBC,但会JDBC的就不一定会MyBatis了。而且MyBatis用多了,写SQL能力可能会退化,这其实不好。当然,以上纯属个人意见,不喜可喷,欢迎来喷。

先创建一个专门用来操作数据库的Dao类,就叫MySQLDao吧:

/**
 * MySQLDao
 *
 * @author 湘王
 */
@Component
public class MySQLDao<T> {
	@Autowired
	private JdbcTemplate jdbcTemplate;

	// 创建数据
	public int create(final String sql, final @Nullable Object... args) throws Exception {
		try {
			if (1 <= jdbcTemplate.update(sql, args)) {
				return 0;
			}

			return -1;
		} catch (DuplicateKeyException e) {
			e.printStackTrace();
			throw new DuplicateKeyException("data duplicate exception");
		} catch (DataAccessException e) {
			e.printStackTrace();
			throw new RuntimeException("create data exception");
		}
	}

	// 查询数量
	public Integer count(final String sql, final Object[] args) {
		try {
			return jdbcTemplate.queryForObject(sql, args, Integer.class);
		} catch (DataAccessException e) {
			e.printStackTrace();
		}

		return null;
	}

	// 查询单条数据
	public Object findOne(final String sql, final RowMapper<?> rowMapper, final @Nullable Object... args) {
		try {
			List<?> list = jdbcTemplate.query(sql, rowMapper, args);
			if (null != list && list.size() > 0) {
				return list.get(0);
			}
		} catch (DataAccessException e) {
			e.printStackTrace();
		}

		return null;
	}

	// 获得列表
	public List<?> find(final String sql, final RowMapper<?> rowMapper, final @Nullable Object... args) {
		try {
			List<?> list = jdbcTemplate.query(sql, rowMapper, args);
			if (null != list && 0 != list.size()) {
				return list;
			}
		} catch (DataAccessException e) {
			e.printStackTrace();
		}

		return null;
	}

	// 更新或删除数据
	public boolean update(final String sql, final @Nullable Object... args) throws Exception {
		try {
			return 0 <= jdbcTemplate.update(sql, args);
		} catch (DataAccessException e) {
			e.printStackTrace();
			throw new RuntimeException("update or remove object exception");
		}
	}
}

接着创建实体类Entity(以SysUser为例):

/**
 * 用户entity
 *
 * @author 湘王
 */
public class SysUser implements Serializable, RowMapper<SysUser> {
    private static final long serialVersionUID = -1214743110268373599L;

    private int id;
    private String username;
    private String password;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    protected Date createtime;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    protected Date updatetime;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    @JsonIgnore
    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Date getCreatetime() {
        return createtime;
    }

    public void setCreatetime(Date createtime) {
        this.createtime = createtime;
    }

    public Date getUpdatetime() {
        return updatetime;
    }

    public void setUpdatetime(Date updatetime) {
        this.updatetime = updatetime;
    }

    @Override
    public SysUser mapRow(ResultSet result, int i) throws SQLException {
        SysUser user = new SysUser();

        user.setId(result.getInt("id"));
        user.setUsername(result.getString("username"));
        user.setPassword(result.getString("password"));
        user.setCreatetime(result.getTimestamp("createtime"));
        user.setUpdatetime(result.getTimestamp("updatetime"));

        return user;
    }
}

接着创建SysRole和SysUserRole,与SysUser类似:

/**
 * 角色entity
 *
 * @author 湘王
 */
public class SysRole implements Serializable, RowMapper<SysRole> {
    private static final long serialVersionUID = 6980192718775578676L;

    private int id;
    private String name;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    protected Date createtime;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    protected Date updatetime;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Date getCreatetime() {
        return createtime;
    }

    public void setCreatetime(Date createtime) {
        this.createtime = createtime;
    }

    public Date getUpdatetime() {
        return updatetime;
    }

    public void setUpdatetime(Date updatetime) {
        this.updatetime = updatetime;
    }

    @Override
    public SysRole mapRow(ResultSet result, int i) throws SQLException {
        SysRole role = new SysRole();

        role.setId(result.getInt("id"));
        role.setName(result.getString("name"));
        role.setCreatetime(result.getTimestamp("createtime"));
        role.setUpdatetime(result.getTimestamp("updatetime"));

        return role;
    }
}



/**
 * 用户角色entity
 *
 * @author 湘王
 */
public class SysUserRole implements Serializable, RowMapper<SysUserRole> {
    private static final long serialVersionUID = 9171155241328712313L;

    private int userid;
    private int roleid;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date createtime;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date updatetime;

    public int getUserid() {
        return userid;
    }

    public void setUserid(int userid) {
        this.userid = userid;
    }

    public int getRoleid() {
        return roleid;
    }

    public void setRoleid(int roleid) {
        this.roleid = roleid;
    }

    public Date getCreatetime() {
        return createtime;
    }

    public void setCreatetime(Date createtime) {
        this.createtime = createtime;
    }

    public Date getUpdatetime() {
        return updatetime;
    }

    public void setUpdatetime(Date updatetime) {
        this.updatetime = updatetime;
    }

    @Override
    public SysUserRole mapRow(ResultSet result, int i) throws SQLException {
        SysUserRole userRole = new SysUserRole();

        userRole.setUserid(result.getInt("userid"));
        userRole.setRoleid(result.getInt("roleid"));
        userRole.setCreatetime(result.getTimestamp("createtime"));
        userRole.setUpdatetime(result.getTimestamp("updatetime"));

        return userRole;
    }
}

接着创建Service:

/**
 * 用户Service
 *
 * @author 湘王
 */
@Service
public class UserService {
    @Autowired
    private MySQLDao mySQLDao;

    public Integer count() {
        String sql = "SELECT COUNT(id) FROM sys_user;";
        return mySQLDao.count(sql, new Object[] {});
    }

    public int save(String username, String password) throws Exception {
        String sql = "INSERT INTO sys_user(username, password) VALUES (?, ?);";
        return mySQLDao.create(sql, username, password);
    }

    public SysUser getById(int id) {
        String sql = "SELECT id, username, password, createtime, updatetime FROM sys_user WHERE id = ?";
        return (SysUser) mySQLDao.findOne(sql, new SysUser(), id);
    }

    public SysUser getByName(String username) {
        String sql = "SELECT id, username, password, createtime, updatetime FROM sys_user WHERE username = ?";
        return (SysUser) mySQLDao.findOne(sql, new SysUser(), username);
    }

    public List<SysUser> getAll() {
        String sql = "SELECT id, username, password, createtime, updatetime FROM sys_user";
        return mySQLDao.find(sql, new SysUser());
    }
}



/**
 * 角色Service
 *
 * @author 湘王
 */
@Service
public class RoleService {
    @Autowired
    private MySQLDao roleDao;

    public void save(String name) throws Exception {
        String sql = "INSERT INTO sys_role(name) VALUES (?);";
        roleDao.create(sql, name);
    }

    public SysRole getById(int id) {
        String sql = "SELECT id, name, createtime, updatetime FROM sys_role WHERE id = ?";
        return (SysRole) roleDao.findOne(sql, new SysRole(), id);
    }

    public SysRole getByName(String name) {
        String sql = "SELECT id, name, createtime, updatetime FROM sys_role WHERE name = ?";
        return (SysRole) roleDao.findOne(sql, new SysRole(), name);
    }

    public List<SysRole> getAll() {
        String sql = "SELECT id, name, createtime, updatetime FROM sys_role";
        return roleDao.find(sql, new SysRole());
    }

    public List<SysRole> getByUserId(int userid) {
        String sql = "SELECT r.id, r.name, r.createtime, r.updatetime " +
                "FROM sys_role AS r, sys_user_role AS ur, sys_user AS u " +
                "WHERE u.id = ? AND u.id = ur.userid AND ur.roleid = r.id";
        return (List<SysRole>) roleDao.findOne(sql, new SysRole(), userid);
    }
}



/**
 * 用户角色Service
 *
 * @author 湘王
 */
@Service
public class UserRoleService {
    @Autowired
    private MySQLDao mySQLDao;

    public void save(int userid, int roleid) throws Exception {
        String sql = "INSERT INTO sys_user_role(userid, roleid) VALUES (?, ?);";
        mySQLDao.create(sql, userid, roleid);
    }

    public List<SysUserRole> getByUserId(int userid) {
        String sql = "SELECT userid, roleid, createtime, updatetime FROM sys_user_role WHERE userid = ?";
        return mySQLDao.find(sql, new SysUserRole(), userid);
    }

    public List<SysUserRole> getByRoleId(int roleid) {
        String sql = "SELECT userid, roleid, createtime, updatetime FROM sys_user_role WHERE roleid = ?";
        return mySQLDao.find(sql, new SysUserRole(), roleid);
    }

    public SysUserRole getById(int userid, int roleid) {
        String sql = "SELECT userid, roleid, createtime, updatetime FROM sys_user_role WHERE userid = ? AND roleid = ?";
        return (SysUserRole) mySQLDao.findOne(sql, new SysUserRole(), userid, roleid);
    }
}

最后创建一个LoginController:

/**
 * 登录Controller
 *
 * @author 湘王
 */
@RestController
public class LoginController {
    @GetMapping("/")
    public String index() {
        final String username = SecurityContextHolder.getContext().getAuthentication().getName();
        System.out.println("当前登录用户:" + username);

        return "SUCCESS";
    }

    // 登录
    @PostMapping("/login")
    public String login(String username, String password) {
        System.out.println("当前登录用户:" + username);

        return "SUCCESS";
    }

    // 登出
    @GetMapping("/logout")
    public String logout(String username) {
        System.out.println("登出用户:" + username);

        return "SUCCESS";
    }
}

启动应用:

/**
 * 应用入口
 *
 * @author 湘王
 */
@SpringBootApplication
public class RBACApplication {
    public static void main(String[] args) {
        SpringApplication.run(RBACApplication.class);
    }
}

用postman(或其他工具,如apipost)或者IDE工具接口对接口进行进行测试:

 

却发现它什么都没显示?

对,没有任何显示是正常的,因为还有很重要的内容没有写呢。


感谢您的大驾光临!咨询技术、产品、运营和管理相关问题,请关注后留言。欢迎骚扰,不胜荣幸~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/25937.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

保护Excel表格的4种常用方法

今天来说说&#xff0c;根据不同需求&#xff0c;我们可以给Excel表格设置保护的4种常用方法&#xff0c;记得保存收藏&#xff0c;总有一个适合你。 方法一&#xff1a; 如果不想Excel表格被他人随意打开&#xff0c;可以设置“打开密码”&#xff0c;这样只有输入设置的密码…

OpenSergo 流量路由:从场景到标准化的探索

流量路由&#xff0c;顾名思义就是将具有某些属性特征的流量&#xff0c;路由到指定的目标。流量路由是流量治理中重要的一环&#xff0c;多个路由如同流水线一样&#xff0c;形成一条路由链&#xff0c;从所有的地址表中筛选出最终目的地址集合&#xff0c;再通过负载均衡策略…

git ssh permission denied解决办法

git ssh permission denied解决办法 1. SSH配置 参考链接 SSH配置文档 2. ssh报错(permission denied) 解决方式&#xff1a; 找到git安装目录 进入etc/ssh文件夹内&#xff0c;找到ssh_config文件&#xff0c;在# Added by git-extra后面添加t替换代码具体参考下面图片 H…

2022强网拟态pwn-store

2022强网拟态pwn-store 这是一个综合题&#xff0c;io链接的构造&#xff0c;orw的系统位数的限制 首先是这个沙箱&#xff0c;64位只有r和w&#xff0c;一开始看的时候很纳闷多了32位的限制&#xff0c;64位还没有o&#xff0c;查了一下才知道这样的seccomp-tools是以64位的…

Design Compiler工具学习笔记(4)

目录 引言 知识储备 实际操作 设计源码 Vivado2018.3仿真 VCS2016仿真 Tcl脚本 约束脚本 MY_TOP.tcl 运行脚本 RUN.tcl 引言 本篇继续学习 DC的基本使用。本篇主要学习 DC 需要的环境约束。 前文链接&#xff1a; Design Compiler工具学习笔记&#xff08;1&#x…

【苹果推iMessage位置推相册共享推送】软件安装上传到appstore都是需要的Activity

推荐内容IMESSGAE相关 作者推荐内容iMessage苹果推软件 *** 点击即可查看作者要求内容信息作者推荐内容1.家庭推内容 *** 点击即可查看作者要求内容信息作者推荐内容2.相册推 *** 点击即可查看作者要求内容信息作者推荐内容3.日历推 *** 点击即可查看作者要求内容信息作者推荐…

maxcompute优化慢执行语句思路

maxcompute慢执行任务优化如何锁定慢执行任务&#xff1f;判断是何种类型的慢任务如何锁定慢执行任务&#xff1f; 第一步&#xff1a;如果是周期任务可以通过任务执行日志中的LogView 链接查看 &#xff0c;如果是临时任务则通过maxcompute命令行 执行wait instanceId instanc…

现代密码学导论-2-古典密码及其密码分析

目录 1.3 古典密码和密码分析 1.3.1 凯撒密码 Caesar’s cipher 1.3.2 移位密码 shift cipher 1.3.3 充分密钥空间原则 1.3.4 单表代换密码 mono-alphabetic substitution cipher 1.3.5 利用字母频率对移位密码的一种改进攻击 1.3.6 维吉尼亚密码(多表代换密码)Vigenere…

Ansys Zemax | 使用 OpticStudio 进行闪光激光雷达系统建模(上)

前言 在消费类电子产品领域&#xff0c;工程师可利用激光雷达实现众多功能&#xff0c;如面部识别和3D映射等。尽管激光雷达系统的应用非常广泛而且截然不同&#xff0c;但是 “闪光激光雷达” 解决方案通常都适用于在使用固态光学元件的目标场景中生成可检测的点阵列。凭借具…

教育行业数据可视化应用方案与实践

教育行业背景介绍 随着信息技术发展&#xff0c;教育领域中的学习方式、教学模式、教学内容均已发生重大变革&#xff0c;以云计算、人工智能、物联网、大数据等技术的结合&#xff0c;“智慧教育”的需求也变的紧迫&#xff0c;需要围绕“智慧教育”而产生的产品和解决方案也…

课程思政案例----简道云零代码应用开发实训平台

为了更好推动零代码开发课程的思政建设&#xff0c;在传递大数据相关知识和技能的同时帮助学生塑造正确的世界观、人生观和价值观。我们整理了与简道云平台结合的应用案例&#xff0c;开放给全国各大高校使用。 1、杨卫红&#xff1a;一位55岁不懂代码的农经员&#xff0c;为家…

Windows下将文件夹映射为磁盘

Windows下将文件夹映射为磁盘背景描述方法一&#xff1a;使用命令方法二&#xff1a;映射网络驱动器背景描述 公司发的新电脑&#xff0c;只有普通用户权限&#xff0c;所以可想而知磁盘只有一个C盘&#xff0c;但是以前习惯性的将一些软件啥的放在D盘中&#xff0c;所以把C盘…

打好“三场仗”,数据库新晋厂商石原子胜券在握

纵观数字经济时代&#xff0c;数据规模呈爆发式增长&#xff0c;国产化替代加速发展。据中国信通院《数据库发展研究报告(2021年)》预测&#xff0c;预计到2025年&#xff0c;全球数据库市场规模将达到798亿美元&#xff0c;其中&#xff0c;中国数据库市场总规模将达到688亿元…

js文件模块化引用问题(JavaScript modules)

有个前端项目&#xff0c;需要用到配置文件。这个配置文件实在是太大了&#xff0c;就想拆成多个小的&#xff0c;然后一一引入&#xff0c;组合成一个完整的配置文件。 如果是vue代码&#xff0c;这种情况根本是手到擒来&#xff0c;不费吹灰之力&#xff0c;而该前端项目是个…

(WRF-UCM)高精度城市化气象动力模拟技术

气候变化及应对是政府、科学界及商业界关注的焦点。气候是多个领域&#xff08;生态、水资源、风资源及碳中和等问题&#xff09;的主要驱动因素&#xff0c;合理认知气候变化有利于解释生态环境变化机理及过程&#xff0c;而了解现在、未来气候变化则是进行生态、环境及能源评…

vs2022 编译遇见编译器堆空间不足,解决办法(针对CMAKE工程)

1、原因&#xff1a; 就是编译工程文件太大&#xff0c;导致堆栈溢出。原始vs默认的编译器是32位&#xff0c;我们设置为64位就可解决部分问题。 具体可能造成的原因可以参考&#xff1a; 错误 C1060 |微软学习 (microsoft.com) 2、解决&#xff1a; 1、需要提前安装cmake…

iOS关于搜索不规则瀑布流布局的实现小结

最近在项目开发中遇到了不规则搜索布局的问题。 之前常用的解决方案是用一个tableview用一个循环动态的加载&#xff0c;唯一的缺点是需要动态的移除&#xff0c;其实也已经足够。ios搜索历史记录不规则布局-IOS代码类资源-CSDN下载&#xff0c;需要的话可以下载使用。请教了一…

双向链表的实现

这里以结构体的方式来实现链表&#xff0c;也可以使用类。结构体在没有修饰符的情况下&#xff0c;默认是共有访问。如有不对&#xff0c;希望能指出。 目录 一、链表和结点结构体的声明 (ListNode.h) 二、链表各个功能的实现 1、增 (1) 构造函数&#xff08;创建链表头结点…

简历上写着“精通 MySQL”,阿里面试官非要跟我死磕,最后还是给我发了 offer

事情是这样的 前段时间因为想要跳槽就去面试了下阿里&#xff0c;大家也都清楚&#xff0c;精通这个词在简历上属于很难把握住的一个词&#xff0c;如果你在你的简历上面写着你精通 XX 技术&#xff0c;那面试官就会默认你是真的很会&#xff0c;刨根问底问到你崩溃。 我之前…

【踩坑】工作中真实踩坑,一个or让sql变慢7倍

工作中真实踩坑&#xff0c;一个or让sql变慢1000倍1.情况说明2.解释计划3.or改成union4.总结1.情况说明 测试环境&#xff0c;有两张表&#xff0c;分别是讲师表t_train_lecturer(后面简称B表&#xff09;,和讲师的授课时长表t_train_activity&#xff08;后面简称A表&#xf…