你想了解若依(RuoYi)框架整合 Spring Security 的具体实现方式,我会从核心原理、整合步骤、关键配置、实战示例四个维度,结合若依前后端分离版(Spring Boot + Vue)的特点,给出可直接落地的整合方案,帮你理解若依是如何基于 Spring Security 实现权限管控的:
最新版本若依源码下载:
https://gitee.com/ruoyieleadmin/ruoyi-ele-admin
一、核心原理:若依与 Spring Security 的整合逻辑
若依框架原生已深度整合 Spring Security,并非 “额外整合”,其核心逻辑是:
- Spring Security 提供基础的认证(登录)、授权(权限校验)、资源拦截能力;
- 若依在此基础上扩展了基于 RBAC 的权限模型(用户 - 角色 - 菜单 - 按钮)、JWT 令牌、自定义权限校验规则,适配后台管理系统的复杂权限需求;
- 核心交互流程:
编辑
二、关键整合步骤(若依原生实现,可参考改造)
以下是若依整合 Spring Security 的核心配置步骤,你可基于此理解或自定义扩展:
步骤 1:引入核心依赖(若依已内置)
在 ruoyi-admin/pom.xml 中,若依已引入 Spring Security 及 JWT 相关依赖:
<!-- Spring Security 核心依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <!-- JWT 依赖(若依自定义扩展) --> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.1</version> </dependency>
步骤 2:配置 Spring Security 核心配置类
若依的 SecurityConfig.java 是整合核心,负责配置认证管理器、资源拦截规则、自定义过滤器等:
@Configuration @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true) public class SecurityConfig extends WebSecurityConfigurerAdapter { // 注入若依自定义用户认证逻辑 @Autowired private UserDetailsService userDetailsService; // 注入JWT认证过滤器 @Autowired private JwtAuthenticationTokenFilter authenticationTokenFilter; // 注入自定义未授权处理类 @Autowired private AuthenticationEntryPointImpl unauthorizedHandler; // 注入自定义登出成功处理类 @Autowired private LogoutSuccessHandlerImpl logoutSuccessHandler; /** * 配置认证管理器 */ @Bean @Override public AuthenticationManager authenticationManagerBean() throws Exception { return super.authenticationManagerBean(); } /** * 配置密码加密方式 */ @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } /** * 配置用户认证逻辑 */ @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder()); } /** * 配置资源拦截规则 */ @Override protected void configure(HttpSecurity http) throws Exception { http // 关闭跨域防护 .cors().and().csrf().disable() // 未授权处理 .exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and() // 无状态会话,不创建Session .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and() // 配置拦截规则 .authorizeRequests() // 放行登录接口、验证码接口、静态资源 .antMatchers("/login", "/captchaImage").anonymous() // 放行Swagger文档 .antMatchers("/swagger/**", "/v2/api-docs", "/doc.html").permitAll() // 所有其他请求需要认证 .anyRequest().authenticated() .and() // 配置登出 .logout().logoutUrl("/logout").logoutSuccessHandler(logoutSuccessHandler); // 添加JWT过滤器(在UsernamePasswordAuthenticationFilter之前) http.addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class); } }
步骤 3:自定义 UserDetailsService(用户认证核心)
若依实现 UserDetailsService 接口,从数据库加载用户信息(用户名、密码、角色、权限),供 Spring Security 认证使用:
@Service public class UserDetailsServiceImpl implements UserDetailsService { @Autowired private SysUserMapper userMapper; @Autowired private SysRoleMapper roleMapper; @Autowired private SysMenuMapper menuMapper; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { // 1. 查询用户基本信息 SysUser user = userMapper.selectUserByUserName(username); if (StringUtils.isNull(user)) { throw new UsernameNotFoundException("用户不存在"); } // 2. 查询用户角色 List<SysRole> roles = roleMapper.selectRolePermissionByUserId(user.getUserId()); // 3. 查询用户权限(菜单+按钮) List<String> permissions = menuMapper.selectMenuPermsByUserId(user.getUserId()); // 4. 封装为Spring Security的UserDetails对象 return new LoginUser(user, roles, permissions); } }
步骤 4:自定义 JWT 过滤器(令牌校验)
若依扩展 Spring Security 过滤器链,实现 JWT 令牌的校验,替代传统的 Session 认证:
@Component public class JwtAuthenticationTokenFilter extends OncePerRequestFilter { @Autowired private TokenService tokenService; @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException { // 1. 从请求头中获取token(默认Header:Authorization,前缀Bearer ) LoginUser loginUser = tokenService.getLoginUser(request); // 2. 校验token有效性,且未完成认证 if (StringUtils.isNotNull(loginUser) && StringUtils.isNull(SecurityUtils.getAuthentication())) { // 3. 验证token过期时间 tokenService.verifyToken(loginUser); // 4. 将用户信息存入Spring Security上下文,完成认证 UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(loginUser, null, loginUser.getAuthorities()); authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); SecurityContextHolder.getContext().setAuthentication(authenticationToken); } // 继续执行过滤器链 chain.doFilter(request, response); } }
步骤 5:自定义权限注解(接口 / 按钮级权限控制)
若依基于 Spring Security 的方法级权限控制,扩展了自定义注解 @PreAuthorize,实现细粒度权限管控:
// 示例1:接口级权限控制(仅拥有"system:user:list"权限的角色可访问) @GetMapping("/list") @PreAuthorize("@ss.hasPermi('system:user:list')") public TableDataInfo list(SysUser user) { // 业务逻辑 } // 示例2:角色级权限控制(仅ADMIN角色可访问) @GetMapping("/delete") @PreAuthorize("hasRole('ADMIN')") public AjaxResult delete(Long userId) { // 业务逻辑 }
总结
- 若依框架原生已深度整合 Spring Security,核心是通过扩展
UserDetailsService实现用户认证、自定义过滤器实现 JWT 校验、@PreAuthorize实现细粒度权限控制; - 整合核心配置集中在
SecurityConfig.java,关键扩展点包括:用户信息加载、令牌校验过滤器、权限注解、异常处理; - 适配业务系统时,只需基于若依的基础整合,扩展权限标识、拦截规则、异常处理即可,无需重新搭建 Spring Security 体系。
最新版本若依源码下载: