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