java后台管理系统如何实现登录注册和权限模块

发布时间:2021-11-15 17:21:03 作者:iii
来源:亿速云 阅读:879
# Java后台管理系统如何实现登录注册和权限模块

## 一、系统架构概述

典型的Java后台管理系统通常采用以下技术栈:
- **前端**:Vue.js/React + Element UI/Ant Design
- **后端**:Spring Boot + Spring Security
- **数据库**:MySQL/PostgreSQL
- **权限模型**:RBAC(基于角色的访问控制)

## 二、数据库设计

### 1. 用户表(user)
```sql
CREATE TABLE `sys_user` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `username` varchar(50) NOT NULL COMMENT '用户名',
  `password` varchar(100) NOT NULL COMMENT '密码',
  `salt` varchar(20) COMMENT '加密盐值',
  `email` varchar(100) COMMENT '邮箱',
  `phone` varchar(20) COMMENT '手机号',
  `status` tinyint DEFAULT 1 COMMENT '状态(0-禁用,1-正常)',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

2. 角色表(role)

CREATE TABLE `sys_role` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL COMMENT '角色名称',
  `code` varchar(50) NOT NULL COMMENT '角色编码',
  `remark` varchar(100) COMMENT '备注',
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_code` (`code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

3. 用户角色关联表(user_role)

CREATE TABLE `sys_user_role` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `user_id` bigint NOT NULL,
  `role_id` bigint NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_user_role` (`user_id`,`role_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

三、登录注册实现

1. 密码加密存储

采用BCryptPasswordEncoder进行密码加密:

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

2. 注册接口实现

@PostMapping("/register")
public Result register(@RequestBody UserRegisterDTO dto) {
    // 验证用户名是否已存在
    if (userService.existsUsername(dto.getUsername())) {
        throw new BusinessException("用户名已存在");
    }
    
    // 密码加密
    String encodedPwd = passwordEncoder.encode(dto.getPassword());
    
    // 创建用户
    SysUser user = new SysUser();
    user.setUsername(dto.getUsername());
    user.setPassword(encodedPwd);
    user.setEmail(dto.getEmail());
    
    userService.save(user);
    return Result.success();
}

3. 登录认证流程

  1. 用户提交用户名/密码
  2. 过滤器链进行认证(UsernamePasswordAuthenticationFilter)
  3. 认证成功后生成JWT令牌
  4. 将令牌返回前端并存入Redis
@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .csrf().disable()
        .authorizeRequests()
            .antMatchers("/api/auth/**").permitAll()
            .anyRequest().authenticated()
        .and()
        .addFilter(new JwtAuthenticationFilter(authenticationManager()))
        .addFilter(new JwtAuthorizationFilter(authenticationManager()))
        .sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS);
}

四、权限控制实现

1. 基于注解的权限控制

@PreAuthorize("hasRole('ADMIN')")
@GetMapping("/admin/users")
public Result<List<UserVO>> getUserList() {
    // ...
}

@PreAuthorize("hasAuthority('user:delete')")
@DeleteMapping("/users/{id}")
public Result deleteUser(@PathVariable Long id) {
    // ...
}

2. 动态权限配置

实现FilterInvocationSecurityMetadataSource接口:

@Override
public Collection<ConfigAttribute> getAttributes(Object object) {
    // 1. 获取请求路径
    String requestUrl = ((FilterInvocation) object).getRequestUrl();
    
    // 2. 查询路径需要的权限
    List<SysPermission> permissions = permissionService.listByUrl(requestUrl);
    
    // 3. 转换为Spring Security需要的格式
    return permissions.stream()
        .map(p -> new SecurityConfig(p.getCode()))
        .collect(Collectors.toList());
}

3. 权限缓存优化

使用Redis缓存权限数据:

@Cacheable(value = "user_permissions", key = "#userId")
public List<String> getUserPermissions(Long userId) {
    return permissionMapper.selectByUserId(userId);
}

五、前端权限控制

1. 菜单权限控制

根据用户权限动态生成路由:

// 过滤有权限的路由
function filterAsyncRoutes(routes, permissions) {
  return routes.filter(route => {
    if (route.meta && route.meta.permission) {
      return permissions.includes(route.meta.permission)
    }
    return true
  })
}

2. 按钮级权限控制

使用自定义指令:

Vue.directive('permission', {
  inserted(el, binding) {
    const { value } = binding
    const permissions = store.getters.permissions
    
    if (value && !permissions.includes(value)) {
      el.parentNode && el.parentNode.removeChild(el)
    }
  }
})

六、安全增强措施

  1. 登录失败限制:5次失败后锁定账户30分钟
  2. 密码强度策略:至少8位,包含大小写字母和数字
  3. JWT安全:设置合理的过期时间(建议2小时)
  4. HTTPS:全站启用HTTPS加密
  5. 日志审计:记录关键操作日志

七、总结

本文实现了Java后台管理系统的核心安全模块: 1. 采用RBAC模型设计权限系统 2. 使用Spring Security+JWT实现认证授权 3. 前后端配合完成细粒度权限控制 4. 通过多种措施提升系统安全性

完整示例代码可参考GitHub仓库:示例项目链接 “`

注:实际文章可根据需要补充以下内容: 1. 异常处理细节 2. 验证码集成方案 3. 第三方登录实现 4. 分布式环境下的会话管理 5. 具体的性能优化方案

推荐阅读:
  1. .net开源权限管理系统
  2. Django实现auth模块下的登录注册与注销功能

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java

上一篇:无服务器PaaS Rainbond的逻辑和技术实现是怎样的

下一篇:Ubuntu系统日志如何配置 /var/log/messages

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》