热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

SpringSecurity在SpringBoot中的使用详解【集中式】

这篇文章主要介绍了SpringSecurity在SpringBoot中的使用【集中式】,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

1.1 准备

 1.1.1 创建 Spring Boot 项目

  创建好一个空的 Spring Boot 项目之后,写一个 controller 验证此时是可以直接访问到该控制器的。

在这里插入图片描述
在这里插入图片描述

1.1.2 引入 Spring Security

  在 Spring Boot 中引入 Spring Security 是相当简单的,可以在用脚手架创建项目的时候勾选,也可以创建完毕后在 pom 文件中加入相关依赖。

在这里插入图片描述


 org.springframework.boot
 spring-boot-starter-security

  引入 Spring Security 后再次访问会发现直接被弹到了登录页面,此时我们还什么都没有配置,为什么 Security 会生效呢,这是因为 Spring Boot 帮我们完成了在 Spring 中需要完成的诸多配置【☞Spring Security 基础入门】。也正是因为 Spring Boot 提供了自动化配置方案,让我们可以“零配置”的使用 Spring Security,所以在 Spring Boot 项目中我们通常使用的安全框架是 Spring Security 而在 Spring 中一般使用 Shiro。

在这里插入图片描述

  我们并没有配置静态的用户那么该如何登录呢,Spring Boot 为我们提供了一个默认的用户,用户名为:user,密码则是在启动 Spring Boot 项目是随机生成的,我们可以在控制台找到他。

在这里插入图片描述

1.2 配置认证

 1.2.1 添加静态用户

  Spring Boot 除了一些信息写道 yml 配置文件中,其他配置都使用配置类,Spring Security 需要继承 WebSecurityConfigurerAdapter,配置用户信息需要重写 configure(AuthenticationManagerBuilder auth) 方法。配置完毕后,将不会再使用 user 用户。

/**
 * Created with IntelliJ IDEA.
 *
 * @author Demo_Null
 * @date 2020/10/18
 * @description Spring Security 配置类
 */
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
 @Override
 protected void configure(AuthenticationManagerBuilder auth) throws Exception {
 // 配置静态用户
 auth.inMemoryAuthentication()
 .withUser("admin")
 .password("{noop}123") // 此处需要加 {noop} 表示该密码为明文
 .roles("USER");
 }
}

1.2.2 添加数据库认证 ☞ 添加用户实体类

  Spring Security 中使用的用户是 UserDetails,我们要么让自定义用户类实现 UserDetails,要么使用时将自定义用户类转换为 UserDetails。建议实现 UserDetails。因为该类中涉及到角色信息所以我们还需要创建角色类。我们在以后的操作中可能会将对象转为 json 或者将 json 转为对象,所以我们重写的方法需要加上 @JsonIgnore 将其忽略(该类本来就需要的不用忽略)。

/**
 * Created with IntelliJ IDEA.
 *
 * @author gaohu9712@163.com
 * @date 2020/10/18
 * @description 用户实体类
 */
public class SysUser implements UserDetails {

 private Long id;
 private String username;
 private String passwrod;
 private List roleList = new ArrayList<>();


 public Long getId() {
 return id;
 }

 public void setId(Long id) {
 this.id = id;
 }


 public void setUsername(String username) {
 this.username = username;
 }


 public void setPasswrod(String passwrod) {
 this.passwrod = passwrod;
 }

 public List getRoleList() {
 return roleList;
 }

 public void setRoleList(List roleList) {
 this.roleList = roleList;
 }

 @Override
 public Collection<&#63; extends GrantedAuthority> getAuthorities() {
 return roleList;
 }

 @Override
 public String getPassword() {
 return passwrod;
 }

 @Override
 public String getUsername() {
 return username;
 }

 @Override
 @JsonIgnore
 public boolean isAccountNonExpired() {
 return false;
 }

 @Override
 @JsonIgnore
 public boolean isAccountNonLocked() {
 return false;
 }

 @Override
 @JsonIgnore
 public boolean isCredentialsNonExpired() {
 return false;
 }

 @Override
 @JsonIgnore
 public boolean isEnabled() {
 return false;
 }
}

&#9758; 创建角色类

&#8195;&#8195;Spring Security 中使用的角色信息使用的是 GrantedAuthority 所以我们的角色类也需要实现 GrantedAuthority。

/**
 * Created with IntelliJ IDEA.
 *
 * @author Demo_Null
 * @date 2020/10/18
 * @description 角色类
 */
public class SysRole implements GrantedAuthority {

 private Long id;
 private String roleName;
 private String roleDesc;

 public Long getId() {
 return id;
 }

 public void setId(Long id) {
 this.id = id;
 }

 public String getRoleName() {
 return roleName;
 }

 public void setRoleName(String roleName) {
 this.roleName = roleName;
 }

 public String getRoleDesc() {
 return roleDesc;
 }

 public void setRoleDesc(String roleDesc) {
 this.roleDesc = roleDesc;
 }

 @Override
 @JsonIgnore
 public String getAuthority() {
 return roleName;
 }
}

&#9758; 添加持久层

此处省略使用通用 mapper 操作数据库的内容【&#9758; Mybatis 使用通用 mapper】,jpa 等其他操作数据库的方法亦可。

&#9758; 认证类

&#8195;&#8195;Spring Boot 中 Spring Security 的认证类与 Spring 中的并无区别,都需要实现 UserDetailsService 接口,然后重写 loadUserByUsername(String s) 方法并返回一个 UserDetails。

/**
 * Created with IntelliJ IDEA.
 *
 * @author Demo_Null
 * @date 2020/10/18
 * @description 认证类
 */ 
public class UserDetailsServiceImpl implements UserDetailsService {
 
 @Autowired
 private UserMapper userMapper;
 
 @Override
 public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
 return userMapper.findByName(s);
 }
}

&#9758; 配置类

/**
 * Created with IntelliJ IDEA.
 *
 * @author Demo_Null
 * @date 2020/10/18
 * @description Spring Security 配置类
 */
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

 @Autowired
 private UserDetailsService userDetailsService;

 @Bean
 // BCrypt 交由 Ioc 容器管理
 public BCryptPasswordEncoder passwordEncoder() {
 return new BCryptPasswordEncoder();
 }

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

1.3 授权

1.3.1 开启方法级授权

&#8195;&#8195;在启动类上使用 @EnableGlobalMethodSecurity 注解开启方法级授权。参数 prePostEnabled 代表 Spring 中的权限控制注解;securedEnabled 代表 Spring Security 中的权限控制注解; jsr250Enabled 代表 jsr250 的权限控制注解

@SpringBootApplication
@MapperScan("com.software.springsecurity.mapper")
@EnableGlobalMethodSecurity(securedEnabled = true)
public class SpringSecurityApplication {

 public static void main(String[] args) {
 SpringApplication.run(SpringSecurityApplication.class, args);
 }

}

1.3.2 添加方法权限

&#8195;&#8195;当用户仅有 ROLE_USER 权限时仅能访问 findStr 方法而不能访问 get 方法;要想访问 get 方法用户必须具有 ROLE_ADMIN 权限。

/**
 * Created with IntelliJ IDEA.
 *
 * @author Demo_Null
 * @date 2020/10/18
 * @description
 */
@RestController
@RequestMapping("/demo")
public class DemoController {

 @GetMapping("/find")
 @Secured("ROLE_USER")
 public String findStr() {
 return "请求成功";
 }

 @GetMapping("/get")
 @Secured("ROLE_ADMIN")
 public String get() {
 return "get";
 }
}

在这里插入图片描述

在这里插入图片描述

1.3.3 异常拦截页面

@ControllerAdvice
public class HandlerControllerAdvice {

 @ExceptionHandler(AccessDeniedException.class)
 public String handlerException(){
 return "redirect:/403.html";
 }

 @ExceptionHandler(RuntimeException.class)
 public String runtimeHandlerException(){
 return "redirect:/500.html";
 }
}

总结

到此这篇关于Spring Security 在 Spring Boot 中的使用详解【集中式】的文章就介绍到这了,更多相关Spring Security 在 Spring Boot使用内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!


推荐阅读
  • 使用Echarts for Weixin 小程序实现中国地图及区域点击事件
    本文介绍了如何使用Echarts for Weixin在微信小程序中构建中国地图,并实现区域点击事件。包括效果展示、条件准备和逻辑实现的具体步骤。 ... [详细]
  • 本文将探讨如何在 Struts2 中使用 ActionContext 和 ServletActionContext 来获取请求参数和会话信息,同时解释它们的内部机制和最佳实践。 ... [详细]
  • RTThread线程间通信
    线程中通信在裸机编程中,经常会使用全局变量进行功能间的通信,如某些功能可能由于一些操作而改变全局变量的值,另一个功能对此全局变量进行读取& ... [详细]
  • 作为一名新手开发者,我正在尝试使用 ASP.NET 和 Vue.js 构建一个单页面应用,涉及多个复杂组件(如按钮、图表等)。希望有经验的开发者能够提供指导。 ... [详细]
  • Java EE 平台集成了多种服务、API 和协议,旨在支持基于 Web 的多层应用程序开发。本文将详细介绍 Java EE 中的 13 种关键技术规范,帮助开发者更好地理解和应用这些技术。 ... [详细]
  • JavaScript 实现图片文件转Base64编码的方法
    本文详细介绍了如何使用JavaScript将用户通过文件输入控件选择的图片文件转换为Base64编码字符串,适用于Web前端开发中图片上传前的预处理。 ... [详细]
  • Spring Boot使用AJAX从数据库读取数据异步刷新前端表格
      近期项目需要是实现一个通过筛选选取所需数据刷新表格的功能,因为表格只占页面的一小部分,不希望整个也页面都随之刷新,所以首先想到了使用AJAX来实现。  以下介绍解决方法(请忽视 ... [详细]
  • 本文探讨了在UIScrollView上嵌入Webview时遇到的一个常见问题:点击图片放大并返回后,Webview无法立即滑动。我们将分析问题原因,并提供有效的解决方案。 ... [详细]
  • 在使用 Python 编程时,如果在一个函数中引用了未声明为全局变量的外部变量,可能会遇到 UnboundLocalError。本文将通过一个具体的例子来解释如何解决这个问题。 ... [详细]
  • 本文介绍了 PHP 的基本概念、服务器与客户端的工作原理,以及 PHP 如何与数据库交互。同时,还涵盖了常见的数据库操作和安全性问题。 ... [详细]
  • ABP框架是ASP.NET Boilerplate的简称,它不仅是一个开源且文档丰富的应用程序框架,还提供了一套基于领域驱动设计(DDD)的最佳实践架构模型。本文将详细介绍ABP框架的特点、项目结构及其在Web API优先架构中的应用。 ... [详细]
  • Spring 中策略模式的应用:Resource 接口详解
    本文探讨了在 Spring 框架中如何利用 Resource 接口实现资源访问策略。Resource 接口作为资源访问策略的抽象,通过多种实现类支持不同类型的资源访问。 ... [详细]
  • SvpplyTable: 实现可扩展和可折叠的菜单动画
    SvpplyTable 是一个示例项目,旨在实现类似 Svpply 应用程序中的可扩展和可折叠的菜单动画效果。该项目托管在 GitHub 上,地址为 https://github.com/liuminqian/SvpplyTable。 ... [详细]
  • 本文介绍了如何使用Postman构建和发送HTTP请求,包括四个主要部分:方法(Method)、URL、头部(Headers)和主体(Body)。特别强调了Body部分的重要性,并详细说明了不同类型的请求体。 ... [详细]
  • vue引入echarts地图的四种方式
    一、vue中引入echart1、安装echarts:npminstallecharts--save2、在main.js文件中引入echarts实例:  Vue.prototype.$echartsecharts3、在需要用到echart图形的vue文件中引入:   importechartsfrom&amp;quot;echarts&amp;quot;;4、如果用到map(地图),还 ... [详细]
author-avatar
冬日暖光816
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有