SpringSecurity权限管理系统实战—一、从零搭建:项目架构解析与开发环境一站式配置

发布时间:2026/7/14 13:19:18
SpringSecurity权限管理系统实战—一、从零搭建:项目架构解析与开发环境一站式配置 1. 项目背景与技术选型当你接手一个企业后台管理系统开发任务时权限管理往往是第一个需要攻克的堡垒。我经历过太多项目因为初期权限设计不合理导致后期不得不推倒重来的惨痛教训。这次我们选择SpringBootSpringSecurity这套黄金组合不仅因为它们是Spring家族的原生解决方案更因为其约定优于配置的理念能让我们快速搭建出健壮的权限骨架。为什么不是Shiro这里说句实在话Shiro确实轻量灵活但SpringSecurity与Spring生态的无缝集成才是企业级项目的首选。就像组装电脑用同一品牌的配件总能避免兼容性问题。我们这套技术栈还包含LayUI轻量级前端框架适合快速搭建管理后台MyBatis灵活的ORM框架方便复杂SQL优化Pear Admin我见过最漂亮的LayUI后台模板没有之一2. 环境搭建全攻略2.1 开发工具准备工欲善其事必先利其器这是我的开发环境清单IDEA 2023智能提示和代码索引能省30%编码时间JDK 17LTS版本新特性足够用又不会太激进Maven 3.8记得配置阿里云镜像下载速度飞起MySQL 8.0千万级数据量下性能依然稳定小技巧在IDEA的Settings→Build→Compiler里开启Build project automatically配合spring-boot-devtools实现热更新改代码不用频繁重启2.2 项目初始化用Spring Initializr创建项目时勾选这些核心依赖dependencies !-- Spring基础套件 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency !-- 安全模块先注释后续逐步引入 -- !-- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-security/artifactId /dependency -- !-- 持久层相关 -- dependency groupIdorg.mybatis.spring.boot/groupId artifactIdmybatis-spring-boot-starter/artifactId version3.0.3/version /dependency dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId scoperuntime/scope /dependency !-- 开发辅助 -- dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-devtools/artifactId scoperuntime/scope optionaltrue/optional /dependency /dependencies3. 项目架构设计3.1 分层架构图解我们的项目采用经典MVC分层但做了些优化调整com.example ├── config # 配置类 ├── controller # 控制层 ├── service # 业务层 │ ├── impl # 实现类 ├── dao # 持久层 ├── entity # 实体类 ├── util # 工具包 └── security # 安全模块(后续添加)3.2 实体类设计技巧所有表都有的公共字段id, create_time等可以抽象成基类Data public abstract class BaseEntity { private Long id; JsonFormat(pattern yyyy-MM-dd HH:mm:ss) private Date createTime; JsonFormat(pattern yyyy-MM-dd HH:mm:ss) private Date updateTime; } // 用户实体继承示例 public class User extends BaseEntity { private String username; private String password; // 其他字段... }这样既避免重复编码又统一了时间格式处理。4. 前端集成实战4.1 Pear Admin模板配置下载Pear Admin Layui版建议4.0将静态资源放入resources/static/PearAdmin修改thymeleaf模板引用路径link relstylesheet th:href{/PearAdmin/component/layui/css/layui.css} / script th:src{/PearAdmin/component/layui/layui.js}/script4.2 菜单动态加载Pear Admin的菜单是通过JSON配置的我们先模拟一个基础菜单// resources/PearAdmin/admin/data/menu.json [{ id: 1, title: 系统管理, icon: layui-icon-set-fill, children: [{ id: 101, title: 用户管理, href: /system/user, openType: _iframe }] }]对应的Controller需要配置路由转发Controller public class RouteController { GetMapping(/system/user) public String userManage() { return system/user; // 对应templates下的HTML文件 } }5. 数据库初始化5.1 RBAC核心表结构执行以下SQL创建基础表MySQL语法CREATE TABLE sys_user ( id bigint NOT NULL AUTO_INCREMENT, username varchar(50) NOT NULL COMMENT 登录名, password varchar(100) NOT NULL COMMENT 密码, create_time datetime DEFAULT CURRENT_TIMESTAMP, update_time datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY idx_username (username) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; -- 角色表、权限表等省略...5.2 数据源配置application.yml关键配置spring: datasource: url: jdbc:mysql://localhost:3306/security_demo?useSSLfalse username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver mybatis: mapper-locations: classpath:mapper/*.xml configuration: map-underscore-to-camel-case: true6. 常见问题解决方案问题1静态资源被拦截Configuration public class WebConfig implements WebMvcConfigurer { Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler(/PearAdmin/**) .addResourceLocations(classpath:/static/PearAdmin/); } }问题2页面跳转404 检查三个地方Controller是否加了Controller注解不是RestController模板文件是否放在templates目录下返回的视图名称是否与文件名一致问题3LayUI图标不显示 确保字体文件正确加载style font-face { font-family: layui-icon; src: url(/PearAdmin/component/layui/font/iconfont.woff) format(woff); } /style7. 项目启动验证启动SpringBoot应用访问 http://localhost:8080应该看到Pear Admin的登录界面暂时跳过登录点击左侧菜单应能正常跳转如果遇到页面样式错乱按F12查看浏览器控制台通常是因为资源路径错误。我在首次集成时花了3小时排查一个CSS加载问题最后发现是路径中多了个斜杠——这种细节问题最容易让人抓狂。