详细介绍SpringBoot整合SpringSecurity

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用版 2核4GB 50GB
简介: 本文我们来详细给小伙伴们介绍下SpringBoot整合SpringSecurity的过程,用到的技术为:SpringBoot2.2.1+SpringSecurity+SpringDataJPA+jsp来整合。

本文我们来详细给小伙伴们介绍下SpringBoot整合SpringSecurity的过程,用到的技术为:SpringBoot2.2.1+SpringSecurity+SpringDataJPA+jsp来整合。


一、环境准备


1.创建SpringBoot项目


 创建一个SpringBoot项目


2.导入基础依赖


 导入基础的依赖

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.1.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>


3.创建controller


1.png


4.访问请求


20191205171509795.png


二、初步整合


 环境准备好之后我们可以来初步整合SpringSecurity。


1.导入SpringSecurityjar包

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


2.再次访问


 SpringBoot已经为SpringSecurity提供了默认配置,默认所有资源都必须认证通过才能访问。2019120517161833.png

 那么问题来了!此刻并没有连接数据库,也并未在内存中指定认证用户,如何认证呢?其实SpringBoot已经提供了默认用户名user,密码在项目启动时随机生成,如图:

20191205171636859.png

输入账号密码后就可以继续访问了


20191205171650549.png


三、自定义登录界面


说明

SpringBoot官方是不推荐在SpringBoot中使用jsp的,那么到底可以使用吗?答案是肯定的!不过需要导入tomcat插件启动项目,不能再用SpringBoot默认tomcat了。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>
<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
</dependency>


2.1加入jsp页面等静态资源


 在src/main目录下创建webapp目录

20191205171759519.png

这时webapp目录并不能正常使用,因为只有web工程才有webapp目录,在pom文件中修改项目为web工程

20191205171813558.png

20191205171819783.png


这时webapp目录,可以正常使用了!

2019120517183318.png


然后可以将我们前面的jsp内容导入过来了,注意不用加 WEB-INF等文件了


20191205171847880.png


3.提供SpringSecurity配置类

package com.dpb.springboot53security.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.User;
/**
 * @program: springboot-53-security
 * @description: SpringSecurity的配置类
 * @author: 波波烤鸭
 * @create: 2019-12-02 20:49
 */
@Configuration
@EnableWebSecurity
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {
    /**
     * 先通过内存中的账号密码来处理
     * @param auth
     * @throws Exception
     */
    public void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
                .withUser("zhang")
                .password("{noop}123")
                .roles("USER");
    }
    public void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/login.jsp","/failuer.jsp","/css/**","/img/**")
                .permitAll()
                .antMatchers("/**").hasAnyRole("USER")
                .anyRequest()
                .authenticated()
                .and()
                .formLogin()
                .loginPage("/login.jsp")
                .loginProcessingUrl("/login")
                .successForwardUrl("/home.jsp")
                .failureForwardUrl("/failure.jsp")
                .permitAll()
                .and()
                .logout()
                .logoutUrl("/logout")
                .invalidateHttpSession(true)
                .logoutSuccessUrl("/login.jsp")
                .permitAll()
                .and()
                .csrf()
                .disable();
    }
}


4.启动服务测试

20191205171935380.png20191205171942787.png20191205171951749.png


搞定~


四、使用数据库认证


 接下来我们看看如何通过数据库的数据来验证,用到的数据还是我们前面案例中的标结果数据,只是在此处我们通过SpringDataJPA来实现认证


1.SpringDataJPA整合


1.1导入相关的依赖

<!-- springBoot的启动器 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- mysql -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.47</version>
</dependency>
<!-- druid连接池 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.0.9</version>
</dependency>

 

1.2 数据库相关信息配置


在application.properties中添加如下信息

# jdbc 的相关信息
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/srm?characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=123456
# 配置连接池信息
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
# 配置jpa的相关参数
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true


1.3 pojo处理

package com.dpb.springboot53security.pojo;
import javax.persistence.*;
/**
 * @program: springboot-53-security
 * @description:
 * @author: 波波烤鸭
 * @create: 2019-12-02 23:49
 */
@Entity
@Table(name = "t_user")
public class UserPojo {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Integer id;
    @Column(name = "username")
    private String username;
    @Column(name = "password")
    private String password;
    @Column(name = "status")
    private Integer status;
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public Integer getStatus() {
        return status;
    }
    public void setStatus(Integer status) {
        this.status = status;
    }
}


1.4 接口定义

/**
 * @program: springboot-53-security
 * @description:
 * @author: 波波烤鸭
 * @create: 2019-12-02 23:51
 */
public interface UserDao extends JpaRepository<UserPojo,Integer> {
    @Query("from UserPojo where username = :username ")
    public UserPojo queryUesrByUserNameJPQL(String username);
}


2.SpringSecurity配置


 持久层的处理准备好后我们就可以修改下SpringSecurity中的配置了。


2.1.service配置


 之前分析过认证的源码流程,所以此处继承 UserDetailService接口即可


2019120517224994.png

/**
 * @program: springboot-53-security
 * @description:
 * @author: 波波烤鸭
 * @create: 2019-12-02 23:53
 */
@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserDao dao;
    @Override
    public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
        // 根据账号查询
        UserPojo userPojo = dao.queryUesrByUserNameJPQL(s);
        if(userPojo != null){
            List<SimpleGrantedAuthority> authorities = new ArrayList<>();
            authorities.add(new SimpleGrantedAuthority("USER"));
            UserDetails user = new User(userPojo.getUsername(),userPojo.getPassword(),authorities);
            return user;
        }
        return null;
    }
}


2.2.加密处理


在SpringBoot的启动器中注册


2019120517231615.png

2.3配置文件修改


20191205172335298.png


3.测试


启动服务,访问测试即可


20191205172350813.png


五、授权管理


1.在启动类上添加开启方法级的授权注解

20191205172408715.png20191205172414270.png

2.控制器中我们可以测试


20191205172427661.png20191205172433589.png


3.自定义异常处理


此处参考前面介绍的SpringBoot全局异常处理即可


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3月前
|
Java 应用服务中间件 Maven
SpringBoot 项目瘦身指南
SpringBoot 项目瘦身指南
102 0
|
3月前
SpringBoot+Mybatis-Plus+PageHelper分页+多条件查询
SpringBoot+Mybatis-Plus+PageHelper分页+多条件查询
75 0
|
3月前
|
安全 数据安全/隐私保护
Springboot+Spring security +jwt认证+动态授权
Springboot+Spring security +jwt认证+动态授权
159 0
|
5天前
|
NoSQL 关系型数据库 MySQL
SpringBoot 集成 SpringSecurity + MySQL + JWT 附源码,废话不多直接盘
SpringBoot 集成 SpringSecurity + MySQL + JWT 附源码,废话不多直接盘
14 2
|
5天前
|
安全 Java 数据安全/隐私保护
基于SpringBoot+Spring Security+Jpa的校园图书管理系统
本文介绍了一个基于SpringBoot、Spring Security和JPA开发的校园图书管理系统,包括系统的核心控制器`LoginController`的代码实现,该控制器处理用户登录、注销、密码更新、角色管理等功能,并提供了系统初始化测试数据的方法。
9 0
基于SpringBoot+Spring Security+Jpa的校园图书管理系统
|
7天前
|
安全 Java 数据库
|
7天前
|
JSON 安全 Java
|
5天前
|
安全 Java 关系型数据库
SpringBoot SpringSecurity 介绍(基于内存的验证)
SpringBoot SpringSecurity 介绍(基于内存的验证)
13 0
|
2月前
|
运维 Java 关系型数据库
Spring运维之boot项目bean属性的绑定读取与校验
Spring运维之boot项目bean属性的绑定读取与校验
36 2
|
2月前
|
存储 运维 Java
Spring运维之boot项目开发关键之日志操作以及用文件记录日志
Spring运维之boot项目开发关键之日志操作以及用文件记录日志
39 2