后端进阶之路——Spring Security构建强大的身份验证和授权系统(四)

简介: 后端进阶之路——Spring Security构建强大的身份验证和授权系统(四)

1. 自定义认证和授权逻辑

在Spring Security中,我们可以自定义认证和授权逻辑来满足特定的需求。以下是两种常见的方法:

1.1 实现自定义的UserDetailsService接口


通过实现自定义的UserDetailsService接口,我们可以从数据库、LDAP或其他数据源中加载用户信息并进行认证。

@Service
public class CustomUserDetailsService implements UserDetailsService {
    @Autowired
    private UserRepository userRepository;
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        User user = userRepository.findByUsername(username);
        if (user == null) {
            throw new UsernameNotFoundException("User not found with username: " + username);
        }
        // 构建UserDetails对象并返回(通常使用User实体类的实例)
        return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(),
                user.isEnabled(), user.isAccountNonExpired(), user.isCredentialsNonExpired(),
                user.isAccountNonLocked(), user.getAuthorities());
    }
}


上述代码中,我们使用自定义的UserRepository从数据库中获取用户实体对象,并构建一个实现UserDetails接口的UserDetails对象。

1.2 扩展AbstractSecurityInterceptor类以自定义访问控制


通过扩展AbstractSecurityInterceptor类,我们可以实现基于自定义表达式的访问控制逻辑。

public class CustomSecurityInterceptor extends AbstractSecurityInterceptor implements Filter {
    // 通过注入自定义的AccessDecisionManager和AuthenticationManager实现类
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        HttpServletResponse httpResponse = (HttpServletResponse) response;
        // 创建FilterInvocation对象,表示当前过滤器链的调用
        FilterInvocation filterInvocation = new FilterInvocation(httpRequest, httpResponse, chain);
        // 执行授权过程
        invoke(filterInvocation);
    }
    @Override
    public Class<?> getSecureObjectClass() {
        return FilterInvocation.class;
    }
    @Override
    public SecurityMetadataSource obtainSecurityMetadataSource() {
        return null;
    }
    // 调用AccessDecisionManager执行访问控制逻辑
    @Override
    public void invoke(FilterInvocation fi) throws IOException, ServletException {
        InterceptorStatusToken token = super.beforeInvocation(fi);
        try {
            // 执行下一个拦截器
            fi.getChain().doFilter(fi.getRequest(), fi.getResponse());
        } finally {
            super.afterInvocation(token, null);
        }
    }
}

上述代码中,我们通过扩展AbstractSecurityInterceptor类,并实现其相关方法,来自定义访问控制的逻辑。其中,invoke方法用于执行访问控制的逻辑,并调用AccessDecisionManager进行访问决策。

2. Spring Security注解

Spring Security提供了一系列注解,用于在代码中进行细粒度的权限控制和安全保护。以下是常用的注解及其作用:

@PreAuthorize

@PreAuthorize注解用于在方法执行之前对方法的调用进行权限验证。

@PreAuthorize("hasRole('ROLE_ADMIN')")
public void adminOnlyMethod() {
    // 只有具有ROLE_ADMIN角色的用户才能执行该方法
}


上述代码中,只有具有ROLE_ADMIN角色的用户才能成功调用adminOnlyMethod()方法。

@PostAuthorize

@PostAuthorize注解用于在方法执行之后对方法的返回值进行权限验证。

@PostAuthorize("returnObject.author == principal.username")
public Book getBook(String bookId) {
    // 根据bookId获取书籍对象,并返回
}

上述代码中,getBook()方法返回的Book对象将被验证,只有当Book对象的author与当前登录用户的用户名相同时,才能成功返回。

@Secured

@Secured注解用于对方法进行角色验证。

@Secured("ROLE_ADMIN")
public void adminOnlyMethod() {
    // 只有具有ROLE_ADMIN角色的用户才能执行该方法
}

上述代码中,只有具有ROLE_ADMIN角色的用户才能成功调用adminOnlyMethod()方法。

@PreFilter

@PreFilter注解用于在方法执行之前对方法的参数进行过滤,并对满足条件的参数进行权限验证。

@PreFilter("hasRole('ROLE_ADMIN') or filterObject.userId == principal.username")
public void updateUserInfo(List<User> userList) {
    // 根据userId更新用户信息
}

上述代码中,updateUserInfo()方法的userList参数将被过滤,只有其中的元素满足hasRole('ROLE_ADMIN') or filterObject.userId == principal.username条件才能执行相应操作。

5. 总结

综上所述,SpringSecurity提供了灵活的机制来自定义认证和授权逻辑,并通过注解提供了便捷的方式来实现细粒度的权限控制。结合这些功能,我们可以构建安全可靠的应用程序。

相关文章
|
6月前
|
人工智能 Java Nacos
基于 Spring AI Alibaba + Nacos 的分布式 Multi-Agent 构建指南
本文将针对 Spring AI Alibaba + Nacos 的分布式多智能体构建方案展开介绍,同时结合 Demo 说明快速开发方法与实际效果。
4744 94
|
7月前
|
安全 Java Ruby
我尝试了所有后端框架 — — 这就是为什么只有 Spring Boot 幸存下来
作者回顾后端开发历程,指出多数框架在生产环境中难堪重负。相比之下,Spring Boot凭借内置安全、稳定扩展、完善生态和企业级支持,成为构建高可用系统的首选,真正经受住了时间与规模的考验。
572 2
|
8月前
|
JSON 人工智能 Java
基于Spring AI构建智能Text-to-SQL转换器:一个完整的MCP
Spring AI 更新结构化输出转换器,弃用旧版 Parser 类,引入与 Spring 框架对齐的 Converter 体系,提升命名规范与功能兼容性。新版本支持 JSON、XML 及 Java 对象转换,确保 LLM 输出结构化,便于下游应用处理。
|
8月前
|
监控 Java API
Spring Boot 3.2 结合 Spring Cloud 微服务架构实操指南 现代分布式应用系统构建实战教程
Spring Boot 3.2 + Spring Cloud 2023.0 微服务架构实践摘要 本文基于Spring Boot 3.2.5和Spring Cloud 2023.0.1最新稳定版本,演示现代微服务架构的构建过程。主要内容包括: 技术栈选择:采用Spring Cloud Netflix Eureka 4.1.0作为服务注册中心,Resilience4j 2.1.0替代Hystrix实现熔断机制,配合OpenFeign和Gateway等组件。 核心实操步骤: 搭建Eureka注册中心服务 构建商品
1262 3
|
7月前
|
人工智能 Java API
构建基于Java的AI智能体:使用LangChain4j与Spring AI实现RAG应用
当大模型需要处理私有、实时的数据时,检索增强生成(RAG)技术成为了核心解决方案。本文深入探讨如何在Java生态中构建具备RAG能力的AI智能体。我们将介绍新兴的Spring AI项目与成熟的LangChain4j框架,详细演示如何从零开始构建一个能够查询私有知识库的智能问答系统。内容涵盖文档加载与分块、向量数据库集成、语义检索以及与大模型的最终合成,并提供完整的代码实现,为Java开发者开启构建复杂AI智能体的大门。
4291 58
|
6月前
|
缓存 监控 Java
《深入理解Spring》性能监控与优化——构建高性能应用的艺术
本文系统介绍了Spring生态下的性能监控与优化实践,涵盖监控体系构建、数据库调优、缓存策略、线程池配置及性能测试等内容,强调通过数据驱动、分层优化和持续迭代提升应用性能。
|
6月前
|
负载均衡 Java API
《深入理解Spring》Spring Cloud 构建分布式系统的微服务全家桶
Spring Cloud为微服务架构提供一站式解决方案,涵盖服务注册、配置管理、负载均衡、熔断限流等核心功能,助力开发者构建高可用、易扩展的分布式系统,并持续向云原生演进。
|
7月前
|
存储 前端开发 安全
实现“永久登录”:针对蜻蜓Q系统的用户体验优化方案(前端uni-app+后端Laravel详解)-优雅草卓伊凡
实现“永久登录”:针对蜻蜓Q系统的用户体验优化方案(前端uni-app+后端Laravel详解)-优雅草卓伊凡
317 5
|
7月前
|
XML Java 测试技术
使用 Spring 的 @Import 和 @ImportResource 注解构建模块化应用程序
本文介绍了Spring框架中的两个重要注解`@Import`和`@ImportResource`,它们在模块化开发中起着关键作用。文章详细分析了这两个注解的功能、使用场景及最佳实践,帮助开发者构建更清晰、可维护和可扩展的Java应用程序。
351 0
|
9月前
|
小程序 安全 关系型数据库
专业打造一款圈子源码软件系统 / 后端 PHP 搭建部署一样实现利益化
本教程详解基于PHP后端与Uni-app的小程序开发全流程,涵盖技术选型、环境搭建、源码导入、接口对接及功能实现。采用Laravel/Symfony框架,结合MySQL/PostgreSQL数据库,使用WebSocket实现实时通信,并集成IM SDK实现音视频聊天。前端使用Uni-app开发,支持跨平台运行。教程包含完整部署流程与安全优化方案,助力快速搭建高性能、安全稳定的小程序系统。
537 5