SpringBoot搭建Spring Security 入门

简介: SpringBoot搭建Spring Security 入门


简介

Spring Security 是一个提供身份验证,授权,保护以及防止常见攻击的框架,由于同时支持响应式和命令式,是spring框架的安全标准。

前提条件

jdk1.8+

例子使用SpringBoot版本 【2.0.5.RELEASE】,代码都是简写,只写关键代码,源码demo,文章底部github

引入maven jar包(正常添加jar包依赖,只需保留第一步的jarbao,第三步第四步忽略即可)

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

因为SpringBoot提供了BOM来管理版本,因此不需要指定版本,如果我们需要指定版本可以通过配置maven属性来配置

<properties>
    <!-- ... -->
    <spring-security.version>5.2.2.BUILD-SNAPSHOT</spring-security.version>
</dependencies>
  1. 如果使用SNAPSHOT版本则需要定义Spring Snapshot存储库
<repositories>
    <!-- ... possibly other repository elements ... -->
    <repository>
        <id>spring-snapshot</id>
        <name>Spring Snapshot Repository</name>
        <url>https://repo.spring.io/snapshot</url>
    </repository>
</repositories>
  1. 如果使用里程碑版本或者候选的版本,则需要指定Spring Milestone存储库
<repositories>
    <!-- ... possibly other repository elements ... -->
    <repository>
        <id>spring-milestone</id>
        <name>Spring Milestone Repository</name>
        <url>https://repo.spring.io/milestone</url>
    </repository>
</repositories>
  1. application.properties 配置属性内容
# 启动端口
server.port=8081
# 启动项目路径
server.servlet.context-path=/simple-security
  1. 此时简单版的demo就已经完成了,访问http://127.0.0.1:8081会重定向到http://127.0.0.1:8081/simple-security/login 页面显示内容如下

  2. 默认的用户名:user,密码为控制台打印的uuid

8.此时我们输入用户名密码之后验证通过了,但是会显示404,这是因为我们没有配置登录成功的首页,现在开始配置首页

9.新建一个WebSecurityConfig配置类,继承

WebSecurityConfigurerAdapter,此处配置关闭了csrf,支持表单登录,

拦截/login登录的请求,登录成功跳转login-success

代码如下

@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // 屏蔽csrf跨站
        http.csrf().disable()
                // 支持表单登录
                .formLogin()
                // 登录逻辑处理url
                .loginProcessingUrl("/login")
                // 登录页面
//                .loginPage("login-view")
                //自定义成功登录页面
                .successForwardUrl("/login-success");
    }
    /**
     * 密码验证方式
     * NoOpPasswordEncoder.getInstance() 字符串校验
     * @return
     */
    @Bean
    public PasswordEncoder passwordEncoder(){
        return  NoOpPasswordEncoder.getInstance();
    }
}
  1. 配置一个WebMvcConfig,重定向我们的url,实现登录逻辑处理
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("redirect:/login");
    }
}
  1. 编写一个controller,作为登录成功之后的跳转
@RestController
public class LoginController {
    @RequestMapping("/login-success")
    public String login(){
        return "login success";
    }
}

12.此时启动项目,访问http://127.0.0.1:8081/simple-security/login,输入用户名user,密码(控制台打印的uuid)登录成功即可看到打印的login success

  1. 自定义用户,实现UserDetailsService,此处我们生成的用户名是tz,密码就是123,我们实际使用中,可以根据用户名在数据库中查找返回,此处为了方便直接设置了一下,没有进行数据库查询。这样我们就成功配置了一个用户名tz密码123的账号,现在就来登录试一下吧
@Service
public class MyUserDetailService implements UserDetailsService {
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        UserDetails userDetails = User.withUsername("tz").password("123").build();
        return userDetails;
    }
}

14.浏览器打开输入http://127.0.0.1:8081/simple-security/login

账号tz,密码123,点击login,登录成功跳转到我们刚才定义的controller,密码太简单了,我们平常不能直接使用明文密码啊,一般都是加密的,先看上面的WebSecurityConfig中我们定义了

PasswordEncoder的Bean 我们返回了一个

NoOpPasswordEncoder.getInstance()

这个代表进行简单的字符串匹配,也就是字符串相等就OK,我们下面配置另一个加密,BCryptPasswordEncoder(),修改我们的WebSecurityConfig

/**
     * 密码验证方式
     * NoOpPasswordEncoder.getInstance() 字符串校验
     * @return
     */
    @Bean
    public PasswordEncoder passwordEncoder(){
        return  new BCryptPasswordEncoder();
    }

15.新建一个test类,生成我们的Bcrypt加密的密码,方便一会我们测试

@SpringBootTest
public class SimpleSecurityApplicationTests {
    @Test
    public void contextLoads() {
        String hashpw = BCrypt.hashpw("123", BCrypt.gensalt());
        System.out.println(hashpw);
    }
   // 打印结果   $2a$10$pTffBwh9mawjeGG9K5ZhbenBfWQRV1aFVgZqVt59eM67iJhDqARyG
   // 这个字符串就代表123,上面我们是使用的随机盐的方式,每次生成的密码都不一样,但是校验时原密码都是123
 }

下面把打印的结果替换到我们的MyUserDetailService中

修改结果如下

@Override
    public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
        UserDetails userDetails = User.withUsername("tz").password("$2a$10$pTffBwh9mawjeGG9K5ZhbenBfWQRV1aFVgZqVt59eM67iJhDqARyG").build();
        return userDetails;
    }
  1. 启动项目,继续使用用户tz密码123登录,此时也是显示登录成功
  2. 下面展示一下基本的授权
Controller中新增资源url
    @RequestMapping("/r/r1")
    public String r1(){
        return "r1";
    }
    @RequestMapping("/r/r2")
    public String r2(){
        return "r2";
    }

WebSecurityConfig增加对资源的拦截,此处访问/r/r1需要p1权限,访问/r/r2需要p2权限

// 屏蔽csrf跨站
        http.csrf().disable()
                .authorizeRequests()
                // 拦截/r/**请求需要认证
                .antMatchers("/r/r1").hasAuthority("p1")
                .antMatchers("/r/r2").hasAuthority("p2")
                .antMatchers("/r/**").authenticated()
//                // 除了/r/** 其他都可以访问
                .anyRequest().permitAll()
                .and()
                // 支持表单登录
                .formLogin()
                // 登录逻辑处理url
                .loginProcessingUrl("/login")
                //自定义成功登录页面
                .successForwardUrl("/login-success");
    }

MyUserDetailService中给tz用户增加p1权限

@Override
    public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
        UserDetails userDetails = User.withUsername("tz").password("$2a$10$pTffBwh9mawjeGG9K5ZhbenBfWQRV1aFVgZqVt59eM67iJhDqARyG").authorities("p1").build();
        return userDetails;
    }

18.此时基本的权限拦截就完成了,如需更复杂的请参考官网验证,下面演示一下浏览器访问http://127.0.0.1:8081/simple-security/login使用用户名tz密码123来进行登录

修改为r1的访问url,访问查看我们 已经读取到r1 的资源

修改为r2的访问URL,访问查看我们已经被拒绝,显示403,因为我们只有p1权限,访问r1需要p1权限,所以我们可以访问,访问r2需要p2权限,我们没有p2权限,所以拒绝我们的访问

19. 好了入门教程到此结束了,如有错误欢迎指出

github demo地址 https://github.com/TianPuJun/springboot-demo/tree/master/springboot-simple-security

官网 https://spring.io/projects/spring-security

参考https://docs.spring.io/spring-security/site/docs/5.2.2.BUILD-SNAPSHOT/reference/htmlsingle/

目录
相关文章
|
4月前
|
人工智能 Java API
Spring AI 实战|Spring AI入门之DeepSeek调用
本文介绍了Spring AI框架如何帮助Java开发者轻松集成和使用大模型API。文章从Spring AI的初探开始,探讨了其核心能力及应用场景,包括手动与自动发起请求、流式响应实现打字机效果,以及兼容不同AI服务(如DeepSeek、通义千问)的方法。同时,还详细讲解了如何在生产环境中添加监控以优化性能和成本管理。通过Spring AI,开发者可以简化大模型调用流程,降低复杂度,为企业智能应用开发提供强大支持。最后,文章展望了Spring AI在未来AI时代的重要作用,鼓励开发者积极拥抱这一技术变革。
1525 71
Spring AI 实战|Spring AI入门之DeepSeek调用
|
6月前
|
安全 Java Apache
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 身份和权限认证
本文介绍了 Apache Shiro 的身份认证与权限认证机制。在身份认证部分,分析了 Shiro 的认证流程,包括应用程序调用 `Subject.login(token)` 方法、SecurityManager 接管认证以及通过 Realm 进行具体的安全验证。权限认证部分阐述了权限(permission)、角色(role)和用户(user)三者的关系,其中用户可拥有多个角色,角色则对应不同的权限组合,例如普通用户仅能查看或添加信息,而管理员可执行所有操作。
298 0
|
6月前
|
安全 Java 数据安全/隐私保护
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 三大核心组件
本课程介绍如何在Spring Boot中集成Shiro框架,主要讲解Shiro的认证与授权功能。Shiro是一个简单易用的Java安全框架,用于认证、授权、加密和会话管理等。其核心组件包括Subject(认证主体)、SecurityManager(安全管理员)和Realm(域)。Subject负责身份认证,包含Principals(身份)和Credentials(凭证);SecurityManager是架构核心,协调内部组件运作;Realm则是连接Shiro与应用数据的桥梁,用于访问用户账户及权限信息。通过学习,您将掌握Shiro的基本原理及其在项目中的应用。
234 0
|
5月前
|
安全 Java 数据库
Spring Security 实战指南:从入门到精通
本文详细介绍了Spring Security在Java Web项目中的应用,涵盖登录、权限控制与安全防护等功能。通过Filter Chain过滤器链实现请求拦截与认证授权,核心组件包括AuthenticationProvider和UserDetailsService,负责用户信息加载与密码验证。文章还解析了项目结构,如SecurityConfig配置类、User实体类及自定义登录逻辑,并探讨了Method-Level Security、CSRF防护、Remember-Me等进阶功能。最后总结了Spring Security的核心机制与常见配置,帮助开发者构建健壮的安全系统。
318 0
|
3月前
|
Java 关系型数据库 MySQL
【Spring】【事务】初学者直呼学会了的Spring事务入门
本文深入解析了Spring事务的核心概念与使用方法。Spring事务是一种数据库事务管理机制,通过确保操作的原子性、一致性、隔离性和持久性(ACID),维护数据完整性。文章详细讲解了声明式事务(@Transactional注解)和编程式事务(TransactionTemplate、PlatformTransactionManager)的区别与用法,并探讨了事务传播行为(如REQUIRED、REQUIRES_NEW等)及隔离级别(如READ_COMMITTED、REPEATABLE_READ)。
254 1
|
3月前
|
Java API 微服务
Java 21 与 Spring Boot 3.2 微服务开发从入门到精通实操指南
《Java 21与Spring Boot 3.2微服务开发实践》摘要: 本文基于Java 21和Spring Boot 3.2最新特性,通过完整代码示例展示了微服务开发全流程。主要内容包括:1) 使用Spring Initializr初始化项目,集成Web、JPA、H2等组件;2) 配置虚拟线程支持高并发;3) 采用记录类优化DTO设计;4) 实现JPA Repository与Stream API数据访问;5) 服务层整合虚拟线程异步处理和结构化并发;6) 构建RESTful API并使用Springdoc生成文档。文中特别演示了虚拟线程配置(@Async)和StructuredTaskSco
359 0
|
5月前
|
前端开发 Java Maven
Spring 和 Spring Boot 之间的比较
本文对比了标准Spring框架与Spring Boot的区别,重点分析两者在模块使用(如MVC、Security)上的差异。Spring提供全面的Java开发基础设施支持,包含依赖注入和多种开箱即用的模块;而Spring Boot作为Spring的扩展,通过自动配置、嵌入式服务器等功能简化开发流程。文章还探讨了两者的Maven依赖、Mvc配置、模板引擎配置、启动方式及打包部署等方面的异同,展示了Spring Boot如何通过减少样板代码和配置提升开发效率。总结指出,Spring Boot是Spring的增强版,使应用开发、测试与部署更加便捷高效。
666 11
|
5月前
|
存储 安全 Java
Spring Security 入门与详解
Spring Security 是 Spring 框架中的核心安全模块,提供认证、授权及防护功能。本文详解其核心概念,包括认证(Authentication)、授权(Authorization)和过滤器链(Security Filter Chain)。同时,通过代码示例介绍基本配置,如 PasswordEncoder、UserDetailsService 和自定义登录页面等。最后总结常见问题与解决方法,助你快速掌握 Spring Security 的使用与优化。
1265 0
|
6月前
|
消息中间件 Java 微服务
微服务——SpringBoot使用归纳——Spring Boot中集成ActiveMQ——发布/订阅消息的生产和消费
本文详细讲解了Spring Boot中ActiveMQ的发布/订阅消息机制,包括消息生产和消费的具体实现方式。生产端通过`sendMessage`方法发送订阅消息,消费端则需配置`application.yml`或自定义工厂以支持topic消息监听。为解决点对点与发布/订阅消息兼容问题,可通过设置`containerFactory`实现两者共存。最后,文章还提供了测试方法及总结,帮助读者掌握ActiveMQ在异步消息处理中的应用。
260 0