SpringBoot整合SpringSecurity详细教程(实战开发讲解)

这篇具有很好参考价值的文章主要介绍了SpringBoot整合SpringSecurity详细教程(实战开发讲解)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

今天小编使用到了SpringBoot+SpringSecurity进行公司项目开发,之前使用到项目都是采用xml配置来整合SpringSecurity,对于第一次使用SpringBoot整合SpringSecurity也是比较陌生,过程中也是遇到各种各样的问题,在CSDN的知识海洋中遗留的相关的整合教程也是五花八门,找一篇完整的教程简直像是大海捞针,so,小编决定亲自挥笔,整顿这种低质量博文

首先、我们创建一个SpringBoot项目工程,SpringBoot项目工程的搭建,小编这里就不做演示,比较简单 ,目前已经搭建并成功启动

springboot+springsecurity,java,spring boot,java,spring

接下来、对于SpringBoot整合SpringSecurity最重要的一步,毫无疑问必然是SpringSecurity依赖导入,这里导入的是spring-boot-starter-security依赖

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

springboot+springsecurity,java,spring boot,java,spring

 依赖已经成功导入,此时你访问SpringBoot项目地址:http://localhost:8080/,你将会跳转到SpringSecurity默认的登录页面,由于小编这里只是讲解操作,所以就没有设置自定义的登陆页面,默认登陆页面如下:

springboot+springsecurity,java,spring boot,java,spring

 SpringSecurity其实设置的有默认的登录账号和密码,默认的账号是user,默认的登录密码在SpringBoot项目启动的时候会自动生成,图中红框部分就是SpringSecurity生成的初始密码,大家可以自行测试登陆

springboot+springsecurity,java,spring boot,java,spring

 接下来的知识和操作就比较重要了,大家一定要收藏、关注加点赞,拿出自己的小本本记录下来,下面即将讲述SpringSecurity相关的配置操作

首先,建立一个config文件包,用来存储相关的SpringSecurity的配置文件类springboot+springsecurity,java,spring boot,java,spring

第二、新建一个SpringSecurity的配置类SecurityConfig,继承于WebSecurityConfigurerAdapter,代码块如图所示,大家可以直接复制,下面会对其中存疑的代码进行解释

package com.geli.config;

import com.geli.service.impl.LoginUserDetailsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    private LoginUserDetailsService loginUserDetailsService;
    
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(loginUserDetailsService)// 设置自定义的userDetailsService
                .passwordEncoder(passwordEncoder());
    }

    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/css/**","/fonts/**","/images/**","/js/**");
    }

    @Bean
    public PasswordEncoder passwordEncoder(){
        // 使用BCrypt加密密码
        return new BCryptPasswordEncoder();
    }


    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.headers().frameOptions().disable();//开启运行iframe嵌套页面
        http//1、配置权限认证
                .authorizeRequests()
                //配置不拦截路由
                .antMatchers("/500").permitAll()
                .antMatchers("/403").permitAll()
                .antMatchers("/404").permitAll()
                .antMatchers("/goLogin.do").permitAll()
                .antMatchers("/login.do").permitAll()
                .anyRequest() //任何其它请求
                .authenticated() //都需要身份认证
                .and()
                //2、登录配置表单认证方式
                .formLogin()
                .loginPage("/goLogin.do")//自定义登录页面的url
                .usernameParameter("username")//设置登录账号参数,与表单参数一致
                .passwordParameter("password")//设置登录密码参数,与表单参数一致
                // 告诉Spring Security在发送指定路径时处理提交的凭证,默认情况下,将用户重定向回用户来自的页面。登录表单form中action的地址,也就是处理认证请求的路径,
                // 只要保持表单中action和HttpSecurity里配置的loginProcessingUrl一致就可以了,也不用自己去处理,它不会将请求传递给Spring MVC和您的控制器,所以我们就不需要自己再去写一个/user/login的控制器接口了
                .loginProcessingUrl("/login.do")//配置默认登录入口
                .defaultSuccessUrl("/goIndex.do")//登录成功后默认的跳转页面路径
                .failureUrl("/goLogin.do?error=true")
                .and()
                //3、注销
                .logout()
                .logoutUrl("/logout.do")
                .permitAll()
                .and()
                //4、session管理
                .sessionManagement()
                .invalidSessionUrl("/login.html") //失效后跳转到登陆页面
                //单用户登录,如果有一个登录了,同一个用户在其他地方登录将前一个剔除下线
                //.maximumSessions(1).expiredSessionStrategy(expiredSessionStrategy())
                //单用户登录,如果有一个登录了,同一个用户在其他地方不能登录
                //.maximumSessions(1).maxSessionsPreventsLogin(true) ;
                .and()
                //5、禁用跨站csrf攻击防御
                .csrf()
                .disable();
    }

}

1、对于注入的loginUserDetailsService对象,马上就会讲到,后面会创建,大家不用着急

2、第二部分代码是认证管理器的,大家自行复制就行springboot+springsecurity,java,spring boot,java,spring

 3、第三部分是用来放行静态资源文件的,SpringSecurity会默认拦截静态资源文件

springboot+springsecurity,java,spring boot,java,spring

4、第四部分代码是用来设置加密方式的

springboot+springsecurity,java,spring boot,java,spring

 5、最后一部分是用来设置权限认证配置

第三、新建上面缺少的LoginUserDetailsService类,该类需要添加@Service注解,所以小编放置在service包下面在,该类实现UserDetailsService接口,其中注入的是查询数据库的UserService,没有注入dao,只是为了方便测试,打开根据自己需要进行修改就是,目的只是为了查询数据库数据

package com.geli.service.impl;

import com.geli.domain.Permission;
import com.geli.domain.User;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;


@Service
public class LoginUserDetailsService implements UserDetailsService {
    @Resource
    private UserServiceImpl userService;
    


    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        User user = userService.findUserByUserName(username);
        if (user == null){
            throw new UsernameNotFoundException("not found");
        }
        //定义权限列表.
        List<GrantedAuthority> authorities = new ArrayList<>();
        // 用户可以访问的资源名称(或者说用户所拥有的权限) 注意:必须"ROLE_"开头
        if (user.getRole()!=null){
            authorities.add(new SimpleGrantedAuthority(user.getRole().getKeyWord()));
            if (user.getRole().getPermissionList() !=null && user.getRole().getPermissionList().size()>0){
                for (Permission permission : user.getRole().getPermissionList()) {
                    authorities.add(new SimpleGrantedAuthority(permission.getKeyWord()));
                }
            }
        }

        org.springframework.security.core.userdetails.User user1 = new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), authorities);
        return user1;
    }
}

其中比较重要的就是添加用户角色和权限的部分,大家根据自己的实际需求进行修改就可以 ,就是图中这部分代码springboot+springsecurity,java,spring boot,java,spring

 第四,小编这里贴一下自己的实体类代码,大家可以方便理解

用户实体类

package com.geli.domain;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Date;

@NoArgsConstructor
@AllArgsConstructor
@Data
public class User implements Serializable {
    private Integer id; //用户id
    private String username;    //用户账号
    private String password;    //用户密码
    private String addUser;     //添加用户人员账号
    private String editUser;  //编辑用户人员账号
    private Date addDate;   //添加账号时间
    private Date updateDate;    //更新账号时间
    private Role role;  //用户角色

}

角色实体类

package com.geli.domain;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Set;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Role implements Serializable {
    private Integer id;     //角色id
    private String name;    //角色名称
    private String keyWord; //角色关键字
    private String description; //角色描述
    private Set<Permission> permissionList;    //用户权限集合
}

权限实体类

package com.geli.domain;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Permission implements Serializable {
    private Integer id;     //权限id
    private String name;    //权限名称
    private String keyWord; //权限关键字
    private String description; //权限描述

}

第四、就下来就是测试SpringSecurity,小编在UserServiceImpl里面添加了一个用户账号,代码如图所示:

import com.geli.service.UserService;
import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl implements UserService {
    @Override
    public User findUserByUserName(String username) {
        User user = new User();
        user.setId(1);
        user.setUsername("D46033");
  user.setPassword("$2a$10$Pgs46f8LzTjOvA5Sg6qDkOBbUoAtWQQdHFoEbbmWPak.34/NwJQrW");
        return user;
    }
}

进入登陆页面 springboot+springsecurity,java,spring boot,java,spring

 登陆成功之后自动跳转到自定义的index页面springboot+springsecurity,java,spring boot,java,spring

 以上就是SpringBoot整合SpringSecurity的所有内容,中间测试过程中缺少了相关配置,与SpringSecurity无关,小编就不进行展示了,一篇小小的文章耗费的是作者众多实验的心血,希望大家多多支持,一键三连!文章来源地址https://www.toymoban.com/news/detail-617879.html

到了这里,关于SpringBoot整合SpringSecurity详细教程(实战开发讲解)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何用SpringBoot整合Redis(详细讲解~)

    大家好,我是卷心菜。本篇主要讲解用SpringBoot整合Redis,如果您看完文章有所收获,可以三连支持博主哦~,嘻嘻。 🎁 作者简介: 在校大学生一枚,Java领域新星创作者,Java、Python正在学习中,期待和大家一起学习一起进步~ 💗 个人主页:我是一棵卷心菜的个人主页 🔶 本

    2024年01月17日
    浏览(35)
  • 【花艺电商】SpringBoot集成MyBatis-Plus、Swagger2、SpringSecurity、OAuth2等技术整合开发

    目录 一、功能介绍 1. 说明 2. 功能实现 3. 技术应用 二、技术详述 1.MyBatis-Plus 主要体现 项目应用 2.SpringSecurity 应用作用 三、页面展示 1. 登入 2. 主页 3. 详情 4. 购物车 5. 订单 6. 沙箱支付 每篇一获 这个项目主要使用了 Spring Security 、 MyBatis-Plus 、 Redis 、 雪花ID 、 参数校验技

    2024年01月25日
    浏览(51)
  • springboot2.7整合springSecurity

    本着前人栽树,后人乘凉的这种思想,自己花了一些时间,用心的整理了一套springboot整合springsecurity的教程。 该教程是基于springboot2.7.3版本开发的,在2.7以上版本中,springSecurity已经废弃了WebSecurityConfigurerAdapter,而是使用 bean 注入的方式,详情可参阅官方文档:https://spring

    2023年04月21日
    浏览(44)
  • SpringBoot整合SpringSecurity和JWT

    JWT 1.介绍: 全称 JSON Web Token ,通过数字签名的方式,以 JSON 为载体,在不同的服务终端之间安全的传递信息。 常用于授权认证,用户登录后的每个请求都包含 JWT ,后端处理请求之前都要进行校验。 2.组成: Header :数据头,令牌类型和加密算法 Payload :负载,请求体和其他

    2024年02月03日
    浏览(56)
  • SpringBoot整合WebSocket详细教程

    共开启两个页面,实现一对一聊天。 服务端代码:https://gitee.com/lianaozhe/springboot-websocket.git 导入相关依赖: WebSocketConfig配置类: WebSocket操作类: TestController测试接口类: test.html文件: 复制test.html文件为test2.html文件,将上面的userId由’20’改为’10’,后面测试使用。 运行服

    2024年02月01日
    浏览(47)
  • SpringSecurity框架快速搭建(SpringBoot整合Security)

    目录 Common类 Config类 CorsConfig(解决跨域问题) RedisConfig (Redis数据库配置) Spring Security (配置安全功能的类) expression类(Expression 类通常用于权限控制和安全策略的定义) SGExpressionRoot(判断用户是否具有某个权限) Filter类 JwtAuthenticationTokenFilter(解析token看是否放行) Handler类

    2024年02月09日
    浏览(43)
  • 使用SpringBoot一小时快速搭建一个简单后台管理(增删改查)(超详细教程) 各大技术基础教学、实战项目开发教学

     最近也是临近期末了,各种的期末大作业,后台管理也是很多地方需要用到的,为了方便大家能快速上手,快速搭建一个简单的后台管理,我花了两天时间整理了一下 我会从0开始介绍,从数据库的设计到前端页面的引入最后到后端代码的编写,你只需要会一点前端的基础和

    2023年04月13日
    浏览(92)
  • 《SpringBoot篇》18.SpringBoot整合Memcached缓存超详细教程

    陈老老老板 说明:工作了,学习一些新的技术栈和工作中遇到的问题,边学习边总结,各位一起加油。需要注意的地方都标红了,还有资源的分享. 一起加油。 本文是介绍Memcached与SpringBoot整合 整合之前先大致了解一下Memcached,是一个​ 免费开源的、高性能的、具有分布式内

    2024年02月03日
    浏览(49)
  • springboot整合springsecurity+oauth2.0密码授权模式

    本文采用的springboot去整合springsecurity,采用oauth2.0授权认证,使用jwt对token增强。本文仅为学习记录,如有不足多谢提出。 OAuth 2.0是用于授权的行业标准协议。OAuth 2.0为简化客户端开发提供了特定的授权流,包括Web应用、桌面应用、移动端应用等。 Resource owner(资源拥有者)

    2024年02月04日
    浏览(61)
  • SpringBoot3整合SpringSecurity,实现自定义接口权限过滤

    接口权限过滤是指对于某些接口或功能,系统通过设定一定的权限规则,只允许经过身份认证且拥有相应权限的用户或应用程序进行访问和操作 。这种技术可以有效地保护系统资源和数据安全,防止未授权的用户或程序进行恶意操作或非法访问。通常情况下,接口权限过滤需

    2024年02月08日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包