diff --git a/pom.xml b/pom.xml index 10ba91db..5ad2e195 100644 --- a/pom.xml +++ b/pom.xml @@ -89,6 +89,25 @@ 0.11.5 runtime + + + + ch.qos.logback + logback-core + 1.5.16 + + + ch.qos.logback + logback-classic + 1.5.16 + + + + org.slf4j + slf4j-api + 2.0.16 + + diff --git a/src/main/java/com/bruce/sams/Config/SecurityConfig.java b/src/main/java/com/bruce/sams/Config/SecurityConfig.java new file mode 100644 index 00000000..21ad4e2a --- /dev/null +++ b/src/main/java/com/bruce/sams/Config/SecurityConfig.java @@ -0,0 +1,95 @@ +package com.bruce.sams.Config; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.bruce.sams.Entity.SysRole; +import com.bruce.sams.Service.SysUserService; +import com.bruce.sams.Entity.SysUser; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.web.SecurityFilterChain; + +/** + * Spring Secrutiy 配置类 提供密码验证和鉴权 + */ + +@Configuration +public class SecurityConfig { + + private final SysUserService userService; + + public SecurityConfig(SysUserService userService) { + this.userService = userService; + } + + // 配置 AuthenticationManager,处理用户登录 + @Bean + public AuthenticationManager authenticationManager(HttpSecurity http) throws Exception { + AuthenticationManagerBuilder authenticationManagerBuilder = http.getSharedObject(AuthenticationManagerBuilder.class); + authenticationManagerBuilder.userDetailsService(userDetailsService()) + .passwordEncoder(passwordEncoder()); + return authenticationManagerBuilder.build(); + } + + // 配置 UserDetailsService,用于从数据库加载用户信息 + + @Bean + public UserDetailsService userDetailsService() { + return username -> { + // 获取用户信息 + SysUser user = userService.getOne(Wrappers.lambdaQuery().eq(SysUser::getUserName, username)); + + if (user == null) { + throw new UsernameNotFoundException("用户不存在"); + } + + // 获取角色信息 + SysRole role = userService.getRoleByUserId(user.getUserId()); // 假设你提供了这个方法来查询角色 + + if (role == null) { + throw new UsernameNotFoundException("用户角色不存在"); + } + + // 将角色添加为 ROLE_ 前缀 + return org.springframework.security.core.userdetails.User + .withUsername(user.getUserName()) + .password(user.getPasswd()) + .roles("ROLE_" + role.getRoleKey()) // 根据角色的 role_key 设置角色,确保加上 ROLE_ 前缀 + .build(); + }; + } + + + // 配置密码加密方式 + @Bean + public PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } + + // 配置 HttpSecurity,进行权限管理 + @Bean + public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { + http + .authorizeHttpRequests(authz -> authz + .requestMatchers("/login", "/register").permitAll() // 登录和注册允许匿名访问 + .requestMatchers("/admin/**").hasRole("ADMIN") // 只有 ADMIN 角色才能访问 /admin 路径 + .requestMatchers("/user/**").hasRole("USER") // 只有 USER 角色才能访问 /user 路径 + .anyRequest().authenticated() // 其他请求需要认证 + ) + .formLogin(form -> form + .loginPage("/login") // 登录页面 + .permitAll() + ) + .logout(logout -> logout + .permitAll() + ); + + return http.build(); + } +} diff --git a/src/main/java/com/bruce/sams/Controller/LoginController.java b/src/main/java/com/bruce/sams/Controller/LoginController.java index 820c47f5..a8e22478 100644 --- a/src/main/java/com/bruce/sams/Controller/LoginController.java +++ b/src/main/java/com/bruce/sams/Controller/LoginController.java @@ -1,6 +1,6 @@ package com.bruce.sams.Controller; -import com.bruce.sams.service.SysLoginService; +import com.bruce.sams.Service.SysLoginService; import com.bruce.sams.Utils.AjaxResult; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -15,15 +15,15 @@ public class LoginController { /** * 用户登录 * - * @param username 用户名 + * @param schoolId 用户名 * @param password 密码 * @return AjaxResult 包含登录状态和token */ @PostMapping - public AjaxResult login(@RequestParam String username, @RequestParam String password) { + public AjaxResult login(@RequestParam String schoolId, @RequestParam String password) { try { // 调用登录服务,生成Token - String token = sysLoginService.login(username, password); + String token = sysLoginService.login(schoolId, password); // 返回成功的响应,并包含生成的Token return AjaxResult.success("登录成功", token); diff --git a/src/main/java/com/bruce/sams/Controller/UserController.java b/src/main/java/com/bruce/sams/Controller/UserController.java index a5921e63..803f5f1f 100644 --- a/src/main/java/com/bruce/sams/Controller/UserController.java +++ b/src/main/java/com/bruce/sams/Controller/UserController.java @@ -1,18 +1,10 @@ package com.bruce.sams.Controller; -import com.bruce.sams.service.SysUserService; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/user") public class UserController { - @Autowired - private SysUserService userService; - public Object addUesr(){ - - return null; - } } diff --git a/src/main/java/com/bruce/sams/Entity/SysRole.java b/src/main/java/com/bruce/sams/Entity/SysRole.java new file mode 100644 index 00000000..52aefde9 --- /dev/null +++ b/src/main/java/com/bruce/sams/Entity/SysRole.java @@ -0,0 +1,95 @@ +package com.bruce.sams.Entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +/** + * 用户角色表 + * @TableName sys_role + */ +@TableName(value ="sys_role") +@Data +public class SysRole { + /** + * 主键 + */ + @TableId(type = IdType.AUTO) + private Long roleId; + + /** + * 角色名称 + */ + private String roleName; + + /** + * 角色标识 + */ + private String roleKey; + + /** + * 数据范围(1:参与者 2:社团管理 3:院级管理4:校级管理) + */ + private String dataScope; + + /** + * 状态(0正常 1停用) + */ + private String status; + + /** + * 备注 + */ + private String remark; + + @Override + public boolean equals(Object that) { + if (this == that) { + return true; + } + if (that == null) { + return false; + } + if (getClass() != that.getClass()) { + return false; + } + SysRole other = (SysRole) that; + return (this.getRoleId() == null ? other.getRoleId() == null : this.getRoleId().equals(other.getRoleId())) + && (this.getRoleName() == null ? other.getRoleName() == null : this.getRoleName().equals(other.getRoleName())) + && (this.getRoleKey() == null ? other.getRoleKey() == null : this.getRoleKey().equals(other.getRoleKey())) + && (this.getDataScope() == null ? other.getDataScope() == null : this.getDataScope().equals(other.getDataScope())) + && (this.getStatus() == null ? other.getStatus() == null : this.getStatus().equals(other.getStatus())) + && (this.getRemark() == null ? other.getRemark() == null : this.getRemark().equals(other.getRemark())); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((getRoleId() == null) ? 0 : getRoleId().hashCode()); + result = prime * result + ((getRoleName() == null) ? 0 : getRoleName().hashCode()); + result = prime * result + ((getRoleKey() == null) ? 0 : getRoleKey().hashCode()); + result = prime * result + ((getDataScope() == null) ? 0 : getDataScope().hashCode()); + result = prime * result + ((getStatus() == null) ? 0 : getStatus().hashCode()); + result = prime * result + ((getRemark() == null) ? 0 : getRemark().hashCode()); + return result; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(getClass().getSimpleName()); + sb.append(" ["); + sb.append("Hash = ").append(hashCode()); + sb.append(", roleId=").append(roleId); + sb.append(", roleName=").append(roleName); + sb.append(", roleKey=").append(roleKey); + sb.append(", dataScope=").append(dataScope); + sb.append(", status=").append(status); + sb.append(", remark=").append(remark); + sb.append("]"); + return sb.toString(); + } +} \ No newline at end of file diff --git a/src/main/java/com/bruce/sams/Entity/SysUser.java b/src/main/java/com/bruce/sams/Entity/SysUser.java index 7b36d1ee..fe721643 100644 --- a/src/main/java/com/bruce/sams/Entity/SysUser.java +++ b/src/main/java/com/bruce/sams/Entity/SysUser.java @@ -8,7 +8,6 @@ import lombok.Data; /** * 系统用户表 - * @TableName sys_user */ @TableName(value ="sys_user") @Data diff --git a/src/main/java/com/bruce/sams/Mapper/SysRoleMapper.java b/src/main/java/com/bruce/sams/Mapper/SysRoleMapper.java new file mode 100644 index 00000000..b00a53da --- /dev/null +++ b/src/main/java/com/bruce/sams/Mapper/SysRoleMapper.java @@ -0,0 +1,20 @@ +package com.bruce.sams.Mapper; + +import com.bruce.sams.Entity.SysRole; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** +* @author bruce +* @description 针对表【sys_role(用户角色表)】的数据库操作Mapper +* @createDate 2025-02-10 17:48:11 +* @Entity com.bruce.sams.Entity.SysRole +*/ +@Mapper +public interface SysRoleMapper extends BaseMapper { + +} + + + + diff --git a/src/main/java/com/bruce/sams/mapper/SysUserMapper.java b/src/main/java/com/bruce/sams/Mapper/SysUserMapper.java similarity index 92% rename from src/main/java/com/bruce/sams/mapper/SysUserMapper.java rename to src/main/java/com/bruce/sams/Mapper/SysUserMapper.java index 663a6c23..dd383605 100644 --- a/src/main/java/com/bruce/sams/mapper/SysUserMapper.java +++ b/src/main/java/com/bruce/sams/Mapper/SysUserMapper.java @@ -1,4 +1,4 @@ -package com.bruce.sams.mapper; +package com.bruce.sams.Mapper; import com.bruce.sams.Entity.SysUser; import com.baomidou.mybatisplus.core.mapper.BaseMapper; diff --git a/src/main/java/com/bruce/sams/service/SysLoginService.java b/src/main/java/com/bruce/sams/Service/SysLoginService.java similarity index 51% rename from src/main/java/com/bruce/sams/service/SysLoginService.java rename to src/main/java/com/bruce/sams/Service/SysLoginService.java index 4b11627a..3cacb41f 100644 --- a/src/main/java/com/bruce/sams/service/SysLoginService.java +++ b/src/main/java/com/bruce/sams/Service/SysLoginService.java @@ -1,11 +1,11 @@ -package com.bruce.sams.service; +package com.bruce.sams.Service; public interface SysLoginService { /** * 用户登录方法 - * @param username 用户名 + * @param schoolId 学号 * @param password 密码 * @return token */ - public String login(String username, String password); + String login(String schoolId, String password); } diff --git a/src/main/java/com/bruce/sams/Service/SysRoleService.java b/src/main/java/com/bruce/sams/Service/SysRoleService.java new file mode 100644 index 00000000..41c32ddb --- /dev/null +++ b/src/main/java/com/bruce/sams/Service/SysRoleService.java @@ -0,0 +1,13 @@ +package com.bruce.sams.Service; + +import com.bruce.sams.Entity.SysRole; +import com.baomidou.mybatisplus.extension.service.IService; + +/** +* @author bruce +* @description 针对表【sys_role(用户角色表)】的数据库操作Service +* @createDate 2025-02-10 17:48:11 +*/ +public interface SysRoleService extends IService { + +} diff --git a/src/main/java/com/bruce/sams/service/SysUserService.java b/src/main/java/com/bruce/sams/Service/SysUserService.java similarity index 60% rename from src/main/java/com/bruce/sams/service/SysUserService.java rename to src/main/java/com/bruce/sams/Service/SysUserService.java index 53683fdc..3830f039 100644 --- a/src/main/java/com/bruce/sams/service/SysUserService.java +++ b/src/main/java/com/bruce/sams/Service/SysUserService.java @@ -1,5 +1,6 @@ -package com.bruce.sams.service; +package com.bruce.sams.Service; +import com.bruce.sams.Entity.SysRole; import com.bruce.sams.Entity.SysUser; import com.baomidou.mybatisplus.extension.service.IService; @@ -16,5 +17,12 @@ public interface SysUserService extends IService { * @param newPassword 新密码 * @return 修改成功T 失败F */ - public boolean changePassword(Long userId, String newPassword); + boolean changePassword(Long userId, String newPassword); + + /** + * 根据用户ID获取权限列表 + * @param userId 用户id + * @return 权限 + */ + SysRole getRoleByUserId(Long userId); } diff --git a/src/main/java/com/bruce/sams/service/impl/SysLoginServiceImpl.java b/src/main/java/com/bruce/sams/Service/impl/SysLoginServiceImpl.java similarity index 92% rename from src/main/java/com/bruce/sams/service/impl/SysLoginServiceImpl.java rename to src/main/java/com/bruce/sams/Service/impl/SysLoginServiceImpl.java index 63fb12b5..f63761c8 100644 --- a/src/main/java/com/bruce/sams/service/impl/SysLoginServiceImpl.java +++ b/src/main/java/com/bruce/sams/Service/impl/SysLoginServiceImpl.java @@ -1,4 +1,4 @@ -package com.bruce.sams.service.impl; +package com.bruce.sams.Service.impl; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -7,8 +7,8 @@ import com.bruce.sams.Exception.User.IncorrectPasswordException; import com.bruce.sams.Exception.User.UserNotFoundException; import com.bruce.sams.Utils.PasswordEncoder; import com.bruce.sams.Utils.TokenUtil; -import com.bruce.sams.mapper.SysUserMapper; -import com.bruce.sams.service.SysLoginService; +import com.bruce.sams.Mapper.SysUserMapper; +import com.bruce.sams.Service.SysLoginService; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; diff --git a/src/main/java/com/bruce/sams/Service/impl/SysRoleServiceImpl.java b/src/main/java/com/bruce/sams/Service/impl/SysRoleServiceImpl.java new file mode 100644 index 00000000..312eb274 --- /dev/null +++ b/src/main/java/com/bruce/sams/Service/impl/SysRoleServiceImpl.java @@ -0,0 +1,22 @@ +package com.bruce.sams.Service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bruce.sams.Entity.SysRole; +import com.bruce.sams.Service.SysRoleService; +import com.bruce.sams.Mapper.SysRoleMapper; +import org.springframework.stereotype.Service; + +/** +* @author bruce +* @description 针对表【sys_role(用户角色表)】的数据库操作Service实现 +* @createDate 2025-02-10 17:48:11 +*/ +@Service +public class SysRoleServiceImpl extends ServiceImpl + implements SysRoleService{ + +} + + + + diff --git a/src/main/java/com/bruce/sams/service/impl/SysUserServiceImpl.java b/src/main/java/com/bruce/sams/Service/impl/SysUserServiceImpl.java similarity index 76% rename from src/main/java/com/bruce/sams/service/impl/SysUserServiceImpl.java rename to src/main/java/com/bruce/sams/Service/impl/SysUserServiceImpl.java index 55edef8f..1f2e8781 100644 --- a/src/main/java/com/bruce/sams/service/impl/SysUserServiceImpl.java +++ b/src/main/java/com/bruce/sams/Service/impl/SysUserServiceImpl.java @@ -1,12 +1,14 @@ -package com.bruce.sams.service.impl; +package com.bruce.sams.Service.impl; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bruce.sams.Entity.SysRole; import com.bruce.sams.Entity.SysUser; +import com.bruce.sams.Mapper.SysRoleMapper; import com.bruce.sams.Utils.PasswordEncoder; -import com.bruce.sams.service.SysUserService; -import com.bruce.sams.mapper.SysUserMapper; +import com.bruce.sams.Service.SysUserService; +import com.bruce.sams.Mapper.SysUserMapper; import jakarta.annotation.Resource; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; /** @@ -21,6 +23,12 @@ public class SysUserServiceImpl extends ServiceImpl @Resource private PasswordEncoder passwordEncoder; + @Autowired + private SysUserMapper userMapper; + + @Autowired + private SysRoleMapper roleMapper; + /** * 新增用户(更改加密) * @param entity 新增用户实体 @@ -68,4 +76,16 @@ public class SysUserServiceImpl extends ServiceImpl return this.updateById(user); // 更新用户信息 } + /** + * 根据用户ID获取权限列表 + * @param userId 用户id + * @return 角色信息 + */ + public SysRole getRoleByUserId(Long userId){ + //todo + Long roleId =userMapper.selectById(userId).getRoleId(); + + return roleMapper.selectById(roleId); + } + } diff --git a/src/main/resources/com/bruce/sams/Mapper/SysRoleMapper.xml b/src/main/resources/com/bruce/sams/Mapper/SysRoleMapper.xml new file mode 100644 index 00000000..1d712927 --- /dev/null +++ b/src/main/resources/com/bruce/sams/Mapper/SysRoleMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + role_id,role_name,role_key,data_scope,status,remark + + diff --git a/src/main/resources/com/bruce/sams/mapper/SysUserMapper.xml b/src/main/resources/com/bruce/sams/Mapper/SysUserMapper.xml similarity index 100% rename from src/main/resources/com/bruce/sams/mapper/SysUserMapper.xml rename to src/main/resources/com/bruce/sams/Mapper/SysUserMapper.xml diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml new file mode 100644 index 00000000..03256661 --- /dev/null +++ b/src/main/resources/logback.xml @@ -0,0 +1,44 @@ + + + + + + System.out + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %c [%thread] : %msg%n + + + + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + utf-8 + + + /log/itheima-data.log + + + + /log/itheima-data2-%d{yyyy-MMdd}.log%i.gz + + 1MB + + + + + + + + + \ No newline at end of file