若依后台权限核心:Spring Security 认证授权详解

简介: 若依(RuoYi)框架整合 Spring Security 的具体实现方式,我会从核心原理、整合步骤、关键配置、实战示例四个维度,结合若依前后端分离版(Spring Boot + Vue)的特点,给出可直接落地的整合方案,帮你理解若依是如何基于 Spring Security 实现权限管控

 你想了解若依(RuoYi)框架整合 Spring Security 的具体实现方式,我会从核心原理、整合步骤、关键配置、实战示例四个维度,结合若依前后端分离版(Spring Boot + Vue)的特点,给出可直接落地的整合方案,帮你理解若依是如何基于 Spring Security 实现权限管控的:


最新版本若依源码下载:

https://gitee.com/ruoyieleadmin/ruoyi-ele-admin


一、核心原理:若依与 Spring Security 的整合逻辑

若依框架原生已深度整合 Spring Security,并非 “额外整合”,其核心逻辑是:

  1. Spring Security 提供基础的认证(登录)、授权(权限校验)、资源拦截能力;
  2. 若依在此基础上扩展了基于 RBAC 的权限模型(用户 - 角色 - 菜单 - 按钮)、JWT 令牌、自定义权限校验规则,适配后台管理系统的复杂权限需求;
  3. 核心交互流程:

image.gif 编辑

二、关键整合步骤(若依原生实现,可参考改造)

以下是若依整合 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>

image.gif

步骤 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);
    }
}

image.gif

步骤 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);
    }
}

image.gif

步骤 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);
    }
}

image.gif

步骤 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) {
    // 业务逻辑
}

image.gif

总结

  1. 若依框架原生已深度整合 Spring Security,核心是通过扩展 UserDetailsService 实现用户认证、自定义过滤器实现 JWT 校验、@PreAuthorize 实现细粒度权限控制;
  2. 整合核心配置集中在 SecurityConfig.java,关键扩展点包括:用户信息加载、令牌校验过滤器、权限注解、异常处理;
  3. 适配业务系统时,只需基于若依的基础整合,扩展权限标识、拦截规则、异常处理即可,无需重新搭建 Spring Security 体系。


最新版本若依源码下载:

https://gitee.com/ruoyieleadmin/ruoyi-ele-admin

相关文章
若依框架----登录界面美化
若依框架----登录界面美化
1693 0
|
前端开发 数据安全/隐私保护
若依框架---权限控制角色设计
若依框架---权限控制角色设计
4402 0
|
2月前
|
XML Java 应用服务中间件
一步到位!若依框架升级 Tomcat 最新版完整教程
若依(RuoYi)框架升级 Tomcat 到最新版本的完整流程,我会从升级前提、核心步骤、版本适配、避坑指南四个维度拆解,覆盖单体版(RuoYi-Vue)和微服务版(RuoYi-Cloud),确保升级后系统稳定运行
480 3
|
Shell 网络安全 开发工具
Tabby终端工具的配置和使用
Tabby终端工具的配置和使用
9674 0
|
IDE Java 程序员
IDEA创建maven项目过慢,一直卡在resolving dependencies...的解决办法
作为一个从事 Java 开发的程序员,每天离不开ide的帮助。一开始学习java的时候基本都是使用eclipse进行开发, 后来接触了idea,发现是真的香,比eclipse好用太多了,能够大大提升开发的效率。
5933 0
IDEA创建maven项目过慢,一直卡在resolving dependencies...的解决办法
|
3月前
|
Java Maven
【2026最新】Maven配置阿里云镜像
本文介绍在Maven 3.9与JDK 21环境下,如何配置阿里云镜像加速依赖下载。通过修改Maven的conf/settings.xml文件,在&lt;mirrors&gt;标签中添加阿里云公共仓库镜像配置,提升构建效率。
2564 1
|
4月前
|
存储 算法 BI
xxljob本地运行
本文介绍XXL-JOB分布式任务调度框架的部署与使用,涵盖源码获取、服务端数据库初始化、配置启动、客户端注册及定时任务测试全过程,助您快速搭建并运行调度系统。
|
安全 Java 数据库
Spring Security 实战指南:从入门到精通
本文详细介绍了Spring Security在Java Web项目中的应用,涵盖登录、权限控制与安全防护等功能。通过Filter Chain过滤器链实现请求拦截与认证授权,核心组件包括AuthenticationProvider和UserDetailsService,负责用户信息加载与密码验证。文章还解析了项目结构,如SecurityConfig配置类、User实体类及自定义登录逻辑,并探讨了Method-Level Security、CSRF防护、Remember-Me等进阶功能。最后总结了Spring Security的核心机制与常见配置,帮助开发者构建健壮的安全系统。
1855 0
|
JSON 数据挖掘 API
京东店铺所有商品 API 接口系列(京东 API)
京东店铺所有商品API接口用于获取指定店铺的全面商品信息,包括基本属性、价格、库存、销售数据等。前期需仔细研读接口文档,掌握请求地址、参数格式及频率限制。接口支持分页和筛选参数,返回JSON格式数据。Python示例中使用`requests`库发送HTTP请求并处理返回数据。该API适用于竞品分析、商品管理工具开发、市场调研及价格监测等场景,助力电商从业者优化运营策略。
|
监控 NoSQL Java
若依RuoYi项目环境搭建教程(RuoYi-Vue + RuoYi-Vue3版本)
若依(RuoYi)是一款基于Spring Boot和Vue.js的开源Java快速开发脚手架,支持OAuth2、JWT鉴权,集成多种安全框架和持久化框架。它提供了系统管理、监控管理、任务调度、代码生成等常用功能模块,适合中小型公司快速搭建Web应用。本文主要介绍若依框架的特点、版本发展、优缺点及项目部署步骤,帮助开发者快速上手并部署若依项目。
18806 3
若依RuoYi项目环境搭建教程(RuoYi-Vue + RuoYi-Vue3版本)

热门文章

最新文章