0

0

Java中如何用Spring Security做权限控制

冰火之心

冰火之心

发布时间:2025-06-29 18:31:05

|

651人浏览过

|

来源于php中文网

原创

spring security实现权限控制的核心是认证和授权,其步骤如下:1. 添加spring-boot-starter-security依赖;2. 创建配置类继承websecurityconfigureradapter并重写configure方法设置访问规则,如permitall、hasrole等;3. 通过@preauthorize注解在controller层进行细粒度权限控制;4. 使用userdetailsservice接口从数据库加载用户信息,并配置passwordencoder加密密码;5. 自定义authenticationentrypoint和accessdeniedhandler处理认证失败和授权失败。整个流程确保用户身份验证和资源访问控制的安全性。

Java中如何用Spring Security做权限控制

Spring Security在Java应用中进行权限控制,核心在于认证(Authentication)和授权(Authorization)。认证确认用户的身份,授权决定用户可以访问哪些资源。

Java中如何用Spring Security做权限控制

解决方案

Java中如何用Spring Security做权限控制
  1. 添加依赖: 首先,在pom.xml文件中添加Spring Security的依赖。

    立即学习Java免费学习笔记(深入)”;

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
  2. 配置Spring Security: 创建一个配置类,继承WebSecurityConfigurerAdapter,并重写configure(HttpSecurity http)方法来配置安全规则。

    Java中如何用Spring Security做权限控制
    @Configuration
    @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
    
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
                .authorizeRequests()
                    .antMatchers("/public/**").permitAll() // 允许所有用户访问
                    .antMatchers("/admin/**").hasRole("ADMIN") // 需要ADMIN角色
                    .anyRequest().authenticated() // 其他请求需要认证
                .and()
                .formLogin() // 使用表单登录
                    .permitAll()
                .and()
                .logout() // 允许注销
                    .permitAll();
        }
    
        @Autowired
        public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
            auth.inMemoryAuthentication()
                .withUser("user").password("{noop}password").roles("USER")
                .and()
                .withUser("admin").password("{noop}password").roles("ADMIN");
        }
    }

    这里使用了内存中的用户存储,实际项目中通常会使用数据库。{noop}表示密码未加密,生产环境必须使用加密算法。

  3. 定义用户角色和权限:configureGlobal方法中,定义了两个用户:useradmin,分别具有USERADMIN角色。

  4. Controller层权限控制: 在Controller层,可以使用@PreAuthorize注解进行更细粒度的权限控制。

    @RestController
    public class MyController {
    
        @GetMapping("/public/hello")
        public String publicHello() {
            return "Hello, public!";
        }
    
        @GetMapping("/admin/hello")
        @PreAuthorize("hasRole('ADMIN')")
        public String adminHello() {
            return "Hello, admin!";
        }
    
        @GetMapping("/user/hello")
        @PreAuthorize("hasRole('USER')")
        public String userHello() {
            return "Hello, user!";
        }
    }

    @PreAuthorize注解允许使用SpEL表达式进行权限判断,例如hasRole('ADMIN')表示需要ADMIN角色才能访问。

Spring Security如何与数据库集成?

Inworld.ai
Inworld.ai

InWorldAI是一个AI角色开发平台,开发者可以创建具有自然语言、上下文意识和多模态的AI角色,并可以继承到游戏和实时媒体中

下载

Spring Security可以通过UserDetailsService接口与数据库集成。你需要创建一个类实现该接口,并重写loadUserByUsername方法,从数据库中加载用户信息。

@Service
public class MyUserDetailsService 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");
        }
        return new org.springframework.security.core.userdetails.User(
            user.getUsername(), user.getPassword(), getAuthorities(user.getRoles()));
    }

    private Collection<? extends GrantedAuthority> getAuthorities(List<Role> roles) {
        List<GrantedAuthority> authorities = new ArrayList<>();
        for (Role role : roles) {
            authorities.add(new SimpleGrantedAuthority(role.getName()));
        }
        return authorities;
    }
}

然后,在SecurityConfig中配置使用自定义的UserDetailsService

@Autowired
private MyUserDetailsService userDetailsService;

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
}

@Bean
public PasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
}

这里使用了BCryptPasswordEncoder对密码进行加密。

如何实现更细粒度的权限控制,例如基于资源的权限?

除了基于角色的权限控制,Spring Security还支持基于资源的权限控制。可以使用@PreAuthorize注解结合SpEL表达式来实现。

例如,假设有一个Article类,每个Article都有一个author属性,只有文章的作者才能修改该文章。

@PutMapping("/articles/{id}")
@PreAuthorize("@articleService.isAuthor(principal.username, #id)")
public String updateArticle(@PathVariable Long id, @RequestBody Article article) {
    // ...
    return "Article updated";
}

这里,@articleService.isAuthor(principal.username, #id)表示调用articleServiceisAuthor方法,判断当前用户是否是文章的作者。principal.username表示当前登录用户的用户名,#id表示PathVariable中的id参数。

ArticleService的实现如下:

@Service
public class ArticleService {

    @Autowired
    private ArticleRepository articleRepository;

    public boolean isAuthor(String username, Long articleId) {
        Article article = articleRepository.findById(articleId).orElse(null);
        if (article == null) {
            return false;
        }
        return article.getAuthor().equals(username);
    }
}

如何处理认证失败和授权失败的情况?

Spring Security提供了多种方式来处理认证失败和授权失败的情况。

  • 认证失败: 可以配置自定义的AuthenticationEntryPoint来处理认证失败的情况。例如,可以返回一个401 Unauthorized错误。
  • 授权失败: 可以配置自定义的AccessDeniedHandler来处理授权失败的情况。例如,可以返回一个403 Forbidden错误。
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private AuthenticationEntryPoint authenticationEntryPoint;

    @Autowired
    private AccessDeniedHandler accessDeniedHandler;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/public/**").permitAll()
                .antMatchers("/admin/**").hasRole("ADMIN")
                .anyRequest().authenticated()
            .and()
            .exceptionHandling()
                .authenticationEntryPoint(authenticationEntryPoint)
                .accessDeniedHandler(accessDeniedHandler)
            .and()
            .formLogin()
                .permitAll()
            .and()
            .logout()
                .permitAll();
    }
}

可以自定义AuthenticationEntryPointAccessDeniedHandler来实现不同的处理逻辑。例如,可以记录日志、跳转到错误页面等。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

155

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

88

2026.01.26

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1945

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2119

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

1167

2024.11.28

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1899

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

656

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2386

2025.12.29

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

4

2026.03.10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Git 教程
Git 教程

共21课时 | 4.1万人学习

PHP自制框架
PHP自制框架

共8课时 | 0.6万人学习

ThinkPHP6.x 微实战--十天技能课堂
ThinkPHP6.x 微实战--十天技能课堂

共26课时 | 1.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号