Spring Security打造用户权限管理系统

本文涉及的产品
访问控制,不限时长
简介: Spring Security是一个基于Spring框架的安全框架,它提供了一套完整的安全性解决方案,可用于保护Java应用程序的Web和非Web部分

一、简介

1 什么是Spring Security

Spring Security是一个基于Spring框架的安全框架,它提供了一套完整的安全性解决方案,可用于保护Java应用程序的Web和非Web部分。

2 Spring Security的作用和优势

Spring Security的作用是为应用程序提供授权和身份验证功能。使用Spring Security框架可以很容易地添加安全性到基于Web的应用程序和服务,并使其更加可靠和安全。

Spring Security的优势包括:

  1. 简化安全性实现
  2. 提供一致和全面的安全性解决方案
  3. 开发者可根据自身需要,通过配置和扩展等方式,定制应用程序的安全性策略。
  4. 提供基于角色的访问控制功能,方便实现多种访问控制方案。

3 Spring Security的设计理念

Spring Security的设计理念是将安全性解决方案与业务逻辑分离。设计者通过对安全性解决方案的模块化分割,使得开发人员能够更加高效地定制应用程序的安全策略。

二、Spring Security框架使用

2 准备工作:环境搭建

在开始使用Spring Security之前需要先搭建好开发环境。只需在您的项目中添加Spring Security的依赖项即可。

2 导入Spring Security依赖

使用Spring Security需要导入Spring Security的依赖项。可以通过Maven或Gradle自动化构建工具来导入。

<!-- Spring Security依赖 -->
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-web</artifactId>
    <version>5.4.2</version>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-config</artifactId>
    <version>5.4.2</version>
</dependency>

3 配置Spring Security

Spring Security的配置通常包括安全性策略配置和用户权限配置。下面是Spring Security的配置示例:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
   

    @Autowired
    private MyUserDetailsService myUserDetailsService;

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

    @Override
    protected void configure(HttpSecurity http) throws Exception {
   
        http
            .authorizeRequests()
                .antMatchers("/admin/**").hasRole("ADMIN")  // 针对/admin/**的请求,需要ADMIN角色
                .antMatchers("/user/**").hasRole("USER")    // 针对/user/**的请求,需要USER角色
                .anyRequest().authenticated()              // 其他请求需要认证
                .and()
            .formLogin()
                .loginPage("/login")                       // 自定义登录页面的URL
                .defaultSuccessUrl("/index")               // 认证成功后的默认URL
                .failureUrl("/login?error")                // 认证失败后跳转的URL
                .usernameParameter("username")             // 自定义用户名参数的名称
                .passwordParameter("password")             // 自定义密码参数的名称
                .permitAll()                               // 允许所有用户访问
                .and()
            .logout()
                .logoutSuccessUrl("/login?logout")          // 退出登录后跳转的URL
                .logoutUrl("/logout")                      // 注销操作的URL
                .permitAll()                               // 允许所有用户访问
                .and()
            .csrf().disable();                             // 禁用CSRF保护
    }

    @Override
    public void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(myUserDetailsService).passwordEncoder(passwordEncoder());
    }
}

4 自定义登录页面和认证逻辑

可以通过自定义登录页面和认证逻辑实现更灵活的用户认证方式。下面是一个自定义登录页面和认证逻辑的示例:

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
   

    @Override
    public void configure(HttpSecurity http) throws Exception {
   
        http
            .authorizeRequests().anyRequest().authenticated()
            .and()
            .formLogin().loginPage("/login").permitAll()   // 自定义登录页面的URL
            .successHandler(authenticationSuccessHandler()) // 自定义登录成功处理程序
            .failureHandler(authenticationFailureHandler()) // 自定义登录失败处理程序
            .and()
            .csrf().disable();
    }

    private AuthenticationSuccessHandler authenticationSuccessHandler() {
   
        return (request, response, authentication) -> response.sendRedirect("/index"); // 登录成功后跳转的URL
    }

    private AuthenticationFailureHandler authenticationFailureHandler() {
   
        return (request, response, exception) -> response.sendRedirect("/login?error"); // 登录失败后跳转的URL
    }
}

5 添加用户和角色

添加用户和角色可以通过配置文件或代码进行操作。下面是通过配置文件添加用户和角色的示例:

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
   
    auth.inMemoryAuthentication()
        .withUser("user").password("{noop}password").roles("USER")     // 创建一个用户名为user,密码为password,角色为USER的用户
        .and()
        .withUser("admin").password("{noop}admin").roles("USER", "ADMIN");  // 创建一个用户名为admin,密码为admin,角色为USER和ADMIN的用户
}

在上述配置的示例中首先使用auth.inMemoryAuthentication()方式创建了一个内存级别的用户身份认证管理器,在其中配置了两个用户,名称分别为“user”和“admin”。他们的密码明文分别为“password”和“admin”。分配给user用户角色为“USER”,分配给admin用户的角色为“USER”和“ADMIN”。这样就可以通过这些身份信息进行访问控制了。

三、用户权限管理系统

1 用户权限管理的概念

用户权限管理指的是一种细致化的权限控制系统可以通过对用户身份和角色的授权管理,从而针对不同用户给予不同的访问权限和操作权限。

2 用户权限管理的重要性

用户权限管理对于保护系统中的敏感数据和功能来说是至关重要的,这是因为不同用户所涉及的业务不一样,其对应的权限需求也不一致。通过建立用户权限管理系统可以极大地提升系统的可靠性,同时更好地保护用户数据的安全。

3 用户权限管理系统设计要点

在设计用户权限管理系统时需要考虑以下几个要点:

  1. 数据库与表设计:用以存储用户的账户信息、角色信息以及权限信息。
  2. 角色管理:将用户分类到不同的角色中,每个角色对应不同的权限。
  3. 权限管理:对拥有一定角色的用户分配相应的权限。
  4. 登录认证:实现用户登录并鉴别合法性,为后续的授权做准备。
  5. 授权处理:对经过认证的用户进行授权处理,即限制用户所能使用的功能。

四、权限管理模块的实现

1 数据库表设计

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(45) NOT NULL,
  `password` varchar(100) NOT NULL,
  `email` varchar(50) NOT NULL,
  `role` int(11) NOT NULL,
  PRIMARY KEY (`id`)
);

CREATE TABLE `role` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(45) NOT NULL,
  PRIMARY KEY (`id`)
);

CREATE TABLE `permission` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(45) NOT NULL,
  `url` varchar(45) NOT NULL,
  PRIMARY KEY (`id`)
);

CREATE TABLE `role_permission` (
  `role_id` int(11) NOT NULL,
  `permission_id` int(11) NOT NULL,
  PRIMARY KEY (`role_id`,`permission_id`),
  CONSTRAINT `fk_1` FOREIGN KEY (`role_id`) REFERENCES `role` (`id`),
   CONSTRAINT `fk_2` FOREIGN KEY (`permission_id`) REFERENCES `permission` (`id`)
);

这里使用MySQL作为数据库设计了4个表分别存储用户信息、角色信息、权限信息和角色权限信息,并通过外键来关联四张表。其中用户表存储用户账户信息,角色表存储角色信息,权限表存储所有权限,角色权限表用于存储角色可以访问的权限。

2 用户模块的实现

2.1 用户注册

@PostMapping("/register")
public String register(User user){
   
    User userByUsername = userDao.findUserByUsername(user.getUsername());
    if(userByUsername != null){
   
        return "用户名重复";
    }
    // 保存用户信息
    userDao.addUser(user);
    return "注册成功";
}

用户注册流程中前端将用户填写的信息通过POST方式交给后端Spring MVC,后端判断用户名是否重复并保存用户信息到数据库中。

2.2 用户登录

@GetMapping("/login")
public String login(User user){
   
    User loginUser = userDao.findUserByUsernameAndPassword(user.getUsername(), user.getPassword());
    if(loginUser == null){
   
        // 返回登录页面,提示用户名或密码错误
        return "login";
    } else {
   
        // 登录成功,将用户信息保存到Session中
        session.setAttribute("loginUser",loginUser);
        return "redirect:/user/home";
    }
}

用户登录系统时需要输入用户名和密码进行身份验证。通过调用userDao中的findUserByUsernameAndPassword方法进行验证,验证完成后将登录用户信息保存到Session中。

2.3 用户信息展示

@GetMapping("/home")
public String home(){
   
    // 从Session中取出登录用户信息进行展示
    User loginUser = (User) session.getAttribute("loginUser");
    if(loginUser == null){
   
        // 如果Session失效了,跳转到登录页面
        return "redirect:/user/login";
    } else {
   
        // 查询数据库,并展示用户信息
        User user = userDao.findUserById(loginUser.getId());
        ...
    }
}

3 权限与角色模块的实现

3.1 角色管理

@PostMapping("/role/add")
public String addRole(Role role){
   
    roleDao.addRole(role);
    return "redirect:/role/list";
}

@GetMapping("/role/list")
public String listRoles(Model model){
   
    List<Role> roles = roleDao.getAllRoles();
    model.addAttribute("roles",roles);
    return "roleList";
}

@PostMapping("/role/update")
public String updateRole(Role role){
   
    roleDao.updateRole(role);
    return "redirect:/role/list";
}

@GetMapping("/role/delete")
public String deleteRole(int id){
   
    roleDao.deleteRole(id);
    return "redirect:/role/list";
}

角色管理需要包括角色定义、添加角色、更新角色、删除角色等功能。这里我们使用了@RestController注解实现REST API的方式来实现角色的管理。

3.2 权限管理

@PostMapping("/permission/add")
public String addPermission(Permission permission){
   
    permissionDao.addPermission(permission);
    return "redirect:/permission/list";
}

@GetMapping("/permission/list")
public String listPermissions(Model model){
   
    List<Permission> permissions = permissionDao.getAllPermissions();
    model.addAttribute("permissions",permissions);
    return "permissionList";
}

@PostMapping("/permission/update")
public String updatePermission(Permission permission){
   
    permissionDao.updatePermission(permission);
    return "redirect:/permission/list";
}

@GetMapping("/permission/delete")
public String deletePermission(int id){
   
    permissionDao.deletePermission(id);
    return "redirect:/permission/list";
}

权限管理需要包括权限定义、添加权限、更新权限、删除权限等功能。这里同样使用了@RestController注解实现REST API的方式来实现权限的管理。

4 Spring Security与用户权限管理系统的整合

4.1 实现Spring Security用户认证

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
   
    auth.userDetailsService(userService)
            .passwordEncoder(passwordEncoder());
}

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

在Spring Security中实现用户认证时需要在configure(AuthenticationManagerBuilder auth)方法中配置UserDetailsService以及加密方式。

4.2 实现Spring Security用户授权

@Override
protected void configure(HttpSecurity http) throws Exception {
   
    http.authorizeRequests()
            // 所有访问都需要登录认证
            .anyRequest().authenticated()
            .and()
            // 配置登录页面和登录请求处理逻辑
            .formLogin().loginPage("/user/login")
            .loginProcessingUrl("/login").usernameParameter("username").passwordParameter("password")
            .defaultSuccessUrl("/user/home").failureUrl("/user/login?error")
            .permitAll()
            .and()
            // 配置退出登录
            .logout().logoutUrl("/logout").logoutSuccessUrl("/user/login").permitAll();
}

在Spring Security中实现用户授权时主要需要配置HttpSecurity对象的authorizeRequests()方法。此外,还需要配置登录页面和登录请求处理逻辑以及退出登录的逻辑。

五、用户权限管理系统的拓展

1 项目的拓展性分析

用户权限管理系统是现代企业信息化建设的基础部件之一。在项目开发中,应该充分考虑系统的拓展性以应对未来业务的需求变化。其中主要拓展方向包括以下几个方面:

  1. 新增业务模块:如增加文档管理、人力资源管理、营销管理等模块;
  2. 系统集成:如与OA系统、CRM系统等集成,实现数据共享;
  3. 技术架构升级:如迁移至云端、前后端分离等。

在开发过程中,我们应该注重系统的可扩展性、可升级性、可维护性,提升系统的稳定性和可靠性。

2 用户权限管理系统中其他模块的实现

2.1 菜单管理模块

菜单管理模块可以实现动态生成菜单并根据用户的角色进行权限控制。在前端界面中,采用树形菜单展示,每个节点表示一个菜单,包括菜单名称、URL和菜单图标。在后台管理中,可以进行菜单的增加、删除、修改、查询等操作。同时通过权限管理实现菜单的访问控制。

public class Menu {
   
    private Long id;
    private String name;
    private String icon;
    private String url;
    private Long parentId;
    // 省略getters、setters、toString方法
}
<!-- 动态生成菜单 -->
<el-menu :default-active="$route.path" class="el-menu-vertical-demo">
    <template v-for="item in menuList">
        <el-submenu v-if="item.children && item.children.length > 0" :index="item.id" :key="item.id">
            <template>
                <i :class="item.icon"></i>
                <span slot="title">{
  { item.name }}</span>
            </template>
            <template v-for="subItem in item.children">
                <el-menu-item :index="subItem.url" :key="subItem.id">{
  { subItem.name }}</el-menu-item>
            </template>
        </el-submenu>
        <el-menu-item v-else :index="item.url" :key="item.id">
            <i :class="item.icon"></i>
            <span slot="title">{
  { item.name }}</span>
        </el-menu-item>
    </template>
</el-menu>

2.2 部门管理模块

部门管理模块实现了对公司内部部门的管理,包括增加、删除、修改、查询部门信息。在部门管理界面中,展示了部门的编号、部门名称、上级部门、创建日期等信息。同时还可以实现对部门下属员工的管理,如增加、移除员工等操作。

public class Department {
   
    private Long id;
    private Long parentId;
    private String name;
    private Date createDate;
    private List<User> userList;
    // 省略getters、setters、toString方法
}
<!-- 部门管理页面 -->
<el-table :data="departmentList" style="width: 100%">
    <el-table-column label="编号">
        <template slot-scope="scope">{
  { scope.row.id }}</template>
    </el-table-column>
    <el-table-column label="部门名称">
        <template slot-scope="scope">{
  { scope.row.departmentName }}</template>
    </el-table-column>
    <el-table-column label="上级部门">
        <template slot-scope="scope">{
  { scope.row.parentDepartmentName }}</template>
    </el-table-column>
    <el-table-column label="创建日期">
        <template slot-scope="scope">{
  { scope.row.createDate }}</template>
    </el-table-column>
    <el-table-column label="员工列表">
        <template slot-scope="scope">
            <el-tag v-for="user in scope.row.userList" :key="user.userName">{
  { user.userName }}</el-tag>
        </template>
    </el-table-column>
    <el-table-column label="操作">
        <template slot-scope="scope">
            <el-button type="primary" size="small" @click="handleEdit(scope.row)">编辑</el-button>
            <el-button type="danger" size="small" @click="handleDelete(scope.row)">删除</el-button>
        </template>
    </el-table-column>
</el-table>

3 UI界面的优化与改进

随着用户需求和设计趋势的变化UI界面的优化和改进是系统开发的必然趋势。界面的个性化、响应式设计以及多样化的交互方式都是当前系统开发的发展方向。要实现界面的优化可以从以下几点入手:

  1. 界面美观、简洁、舒适;
  2. 采用流畅的交互体验;
  3. 响应式设计,实现移动设备等不同设备的兼容;
  4. 增加用户个性化模块,提供灵活性的配置。

通过UI界面的优化可以提升用户的使用体验,进而加强用户的满意度和系统使用率。

六、小结回顾

1 项目收获和总结

通过本次用户权限管理系统项目开发深入学习了SpringBoot、SpringMVC、MyBatis等技术,了解了Web应用开发的整个流程。在开发过程中加深了对于用户权限管理系统的认识理解。

2 项目的不足之处与展望

本次项目还存在一些不足之处如前端展示的交互体验还需进一步加强、错误处理不够规范、缺乏对软件测试的全面考虑等。在未来维护项目的同时将继续改善上面的问题。此外将继续拓展项目功能完善用户权限管理系统来满足未来的业务需求。比如增加考勤管理模块、社交管理模块等等,使系统的完整性更加的完善,确保系统在保持扩展和升级性的同时也能够保证系统的可靠性和安全性。

相关实践学习
消息队列+Serverless+Tablestore:实现高弹性的电商订单系统
基于消息队列以及函数计算,快速部署一个高弹性的商品订单系统,能够应对抢购场景下的高并发情况。
云安全基础课 - 访问控制概述
课程大纲 课程目标和内容介绍视频时长 访问控制概述视频时长 身份标识和认证技术视频时长 授权机制视频时长 访问控制的常见攻击视频时长
目录
相关文章
|
3月前
|
Java UED Sentinel
微服务守护神:Spring Cloud Sentinel,让你的系统在流量洪峰中稳如磐石!
【8月更文挑战第29天】Spring Cloud Sentinel结合了阿里巴巴Sentinel的流控、降级、熔断和热点规则等特性,为微服务架构下的应用提供了一套完整的流量控制解决方案。它能够有效应对突发流量,保护服务稳定性,避免雪崩效应,确保系统在高并发下健康运行。通过简单的配置和注解即可实现高效流量控制,适用于高并发场景、依赖服务不稳定及资源保护等多种情况,显著提升系统健壮性和用户体验。
87 1
|
4月前
|
安全 Java 数据安全/隐私保护
使用Spring Security实现细粒度的权限控制
使用Spring Security实现细粒度的权限控制
|
4月前
|
安全 Java 数据库
实现基于Spring Security的权限管理系统
实现基于Spring Security的权限管理系统
|
4月前
|
安全 Java 数据安全/隐私保护
解析Spring Security中的权限控制策略
解析Spring Security中的权限控制策略
|
20天前
|
JavaScript NoSQL Java
CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
33 0
|
3月前
|
Java 微服务 Spring
SpringBoot+Vue+Spring Cloud Alibaba 实现大型电商系统【分布式微服务实现】
文章介绍了如何利用Spring Cloud Alibaba快速构建大型电商系统的分布式微服务,包括服务限流降级等主要功能的实现,并通过注解和配置简化了Spring Cloud应用的接入和搭建过程。
SpringBoot+Vue+Spring Cloud Alibaba 实现大型电商系统【分布式微服务实现】
|
3月前
|
消息中间件 Java RocketMQ
微服务架构师的福音:深度解析Spring Cloud RocketMQ,打造高可靠消息驱动系统的不二之选!
【8月更文挑战第29天】Spring Cloud RocketMQ结合了Spring Cloud生态与RocketMQ消息中间件的优势,简化了RocketMQ在微服务中的集成,使开发者能更专注业务逻辑。通过配置依赖和连接信息,可轻松搭建消息生产和消费流程,支持消息过滤、转换及分布式事务等功能,确保微服务间解耦的同时,提升了系统的稳定性和效率。掌握其应用,有助于构建复杂分布式系统。
67 0
|
4月前
|
安全 Java 数据安全/隐私保护
使用Spring Security实现细粒度的权限控制
使用Spring Security实现细粒度的权限控制
|
4月前
|
安全 Java 数据安全/隐私保护
使用Java和Spring Security实现身份验证与授权
使用Java和Spring Security实现身份验证与授权
|
4月前
|
JavaScript Java 数据安全/隐私保护
基于SpringBoot+Vue毕业生信息招聘平台系统【源码+论文+演示视频+包运行成功】_基于spring vue的校园招聘系统源码(2)
基于SpringBoot+Vue毕业生信息招聘平台系统【源码+论文+演示视频+包运行成功】_基于spring vue的校园招聘系统源码
120 0
基于SpringBoot+Vue毕业生信息招聘平台系统【源码+论文+演示视频+包运行成功】_基于spring vue的校园招聘系统源码(2)