Spring Security 在 Spring Boot 中的使用详解【集中式】

1.1 准备

1.1.1 创建 Spring Boot 项目

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


1.1.2 引入 Spring Security

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

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

  引入 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<SysRole> 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<SysRole> getRoleList() {
 return roleList;
 }

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

 @Override
 public Collection<? 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;
 }
}

☞ 创建角色类

  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;
 }
}

☞ 添加持久层

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

☞ 认证类

  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);
 }
}

☞ 配置类

/**
 * 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 开启方法级授权

  在启动类上使用 @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 添加方法权限

  当用户仅有 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使用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题的解决方法

    当前后端分离时,权限问题的处理也和我们传统的处理方式有一点差异.笔者前几天刚好在负责一个项目的权限管理模块,现在权限管理模块已经做完了,我想通过5-6篇文章,来介绍一下项目中遇到的问题以及我的解决方案,希望这个系列能够给小伙伴一些帮助.本系列文章并不是手把手的教程,主要介绍了核心思路并讲解了核心代码,完整的代码小伙伴们可以在GitHub上star并clone下来研究.另外,原本计划把项目跑起来放到网上供小伙伴们查看,但是之前买服务器为了省钱,内存只有512M,两个应用跑不起来(已经有一个V部落开

  • Spring Boot(四)之使用JWT和Spring Security保护REST API

    通常情况下,把API直接暴露出去是风险很大的,不说别的,直接被机器攻击就喝一壶的.那么一般来说,对API要划分出一定的权限级别,然后做一个用户的鉴权,依据鉴权结果给予用户开放对应的API.目前,比较主流的方案有几种: 用户名和密码鉴权,使用Session保存用户鉴权结果. 使用OAuth进行鉴权(其实OAuth也是一种基于Token的鉴权,只是没有规定Token的生成方式) 自行采用Token进行鉴权 第一种就不介绍了,由于依赖Session来维护状态,也不太适合移动时代,新的项目就不要采用了.

  • SpringBoot + Spring Security 基本使用及个性化登录配置详解

    Spring Security 基本介绍 这里就不对Spring Security进行过多的介绍了,具体的可以参考官方文档 我就只说下SpringSecurity核心功能: 认证(你是谁) 授权(你能干什么) 攻击防护(防止伪造身份) 基本环境搭建 这里我们以SpringBoot作为项目的基本框架,我这里使用的是maven的方式来进行的包管理,所以这里先给出集成Spring Security的方式 <dependencies> ... <dependency> <groupI

  • 详解如何在spring boot中使用spring security防止CSRF攻击

    CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF.  CSRF可以做什么? 你这可以这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求.CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账......造成的问题包括:个人隐私泄露以及财产安全. CSRF漏洞现状 CSRF这种攻击方式

  • 详解Spring Boot 使用Spring security 集成CAS

    1.创建工程 创建Maven工程:springboot-security-cas 2.加入依赖 创建工程后,打开pom.xml,在pom.xml中加入以下内容: <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.4.3.RELEASE</versio

  • Spring Boot如何使用Spring Security进行安全控制

    我们在编写Web应用时,经常需要对页面做一些安全控制,比如:对于没有访问权限的用户需要转到登录表单页面.要实现访问控制的方法多种多样,可以通过Aop.拦截器实现,也可以通过框架实现(如:Apache Shiro.spring Security). 本文将具体介绍在Spring Boot中如何使用Spring Security进行安全控制. 准备工作 首先,构建一个简单的Web工程,以用于后续添加安全控制,也可以用之前Chapter3-1-2做为基础工程.若对如何使用Spring Boot构建We

  • Spring Boot中使用 Spring Security 构建权限系统的示例代码

    Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一组可以在Spring应用上下文中配置的Bean,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作. 权限控制是非常常见的功能,在各种后台管理里权限控制更是重中之重.在Spring Boot中使用 Spring Security 构建权限系统是非常轻松和简单的.下面我们就来快速入门 Spring Security .在开始前我们需要一对

  • Spring Security 在 Spring Boot 中的使用详解【集中式】

    1.1 准备 1.1.1 创建 Spring Boot 项目   创建好一个空的 Spring Boot 项目之后,写一个 controller 验证此时是可以直接访问到该控制器的. 1.1.2 引入 Spring Security   在 Spring Boot 中引入 Spring Security 是相当简单的,可以在用脚手架创建项目的时候勾选,也可以创建完毕后在 pom 文件中加入相关依赖. <dependency> <groupId>org.springframework

  • Dubbo在Spring和Spring Boot中的使用详解

    一.在Spring中使用Dubbo 1.Maven依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.5.3.6</version> <exclusions> <exclusion> <groupId>log4j</groupId> <artif

  • Spring Security实现接口放通的方法详解

    目录 1.SpringBoot版本 2.实现思路 3.实现过程 3.1新建注解 3.2新建请求枚举类 3.3判断Controller方法上是否存在该注解 3.4在SecurityConfig上进行策略的配置 3.5在Controller方法上应用 3.6效果展示 在用Spring Security项目开发中,有时候需要放通某一个接口时,我们需要在配置中把接口地址配置上,这样做有时候显得麻烦,而且不够优雅.我们能不能通过一个注解的方式,在需要放通的接口上加上该注解,这样接口就能放通了.答案肯定是可

  • Spring IoC学习之ApplicationContext中refresh过程详解

    refresh() 该方法是 Spring Bean 加载的核心,它是 ClassPathXmlApplicationContext 的父类 AbstractApplicationContext 的一个方法 , 顾名思义,用于刷新整个Spring 上下文信息,定义了整个 Spring 上下文加载的流程. public void refresh() throws BeansException, IllegalStateException { synchronized(this.startupShu

  • Spring Security如何实现升级密码加密方式详解

    目录 本章内容 密码加密方式怎么升级? 升级方案源码 实战 第一种方式: Spring Bean 他是怎么自动升级到BCrypt加密方式的? 第二种方式: 多继承接口方式 第三种方式: HttpSecurity直接添加 本章内容 密码加密方式怎么升级? spring security底层怎么实现的密码加密方式升级? 密码加密方式怎么升级? 前面我们学过DelegatingPasswordEncoder类,但是不清楚他到底是做什么的,我也没讲的很清楚.所以呢,我们就重新再讲一讲它的另一个实际应用.

  • Spring Security基于JWT实现SSO单点登录详解

    SSO :同一个帐号在同一个公司不同系统上登陆 使用SpringSecurity实现类似于SSO登陆系统是十分简单的 下面我就搭建一个DEMO 首先来看看目录的结构 其中sso-demo是父工程项目 sso-client .sso-client2分别对应2个资源服务器,sso-server是认证服务器 引入的pom文件 sso-demo <?xml version="1.0" encoding="UTF-8"?> <project xmlns=&q

  • 详解Spring Security如何在权限中使用通配符

    目录 前言 1. SpEL 2. 自定义权限该如何写 3. 权限通配符 4. TienChin 项目怎么做的 前言 小伙伴们知道,在 Shiro 中,默认是支持权限通配符的,例如系统用户有如下一些权限: system:user:add system:user:delete system:user:select system:user:update … 现在给用户授权的时候,我们可以像上面这样,一个权限一个权限的配置,也可以直接用通配符: system:user:* 这个通配符就表示拥有针对用户的

  • Spring Boot Shiro在Web应用中的作用详解

    目录 01-Tomcat 中的 Filter 责任链 02-Shiro 中的 filter 链结构 03-shiro-filters 如何与 servlet 中的 filter 关联起来 04-总结 01-Tomcat 中的 Filter 责任链 在前面的文章中,我介绍了如何使用 Apache Shiro 进行安全认证. 其实 Shiro 在 Web 应用中出现的频率更高. 今天我将来分析下,Shiro 是如何应用到 Web 应用中的. Servlet 规范中定义了 Filter 和 Filte

  • Spring Boot Admin的使用详解(Actuator监控接口)

    第一部分 Spring Boot Admin 简介 Spring Boot Admin用来管理和监控Spring Boot应用程序. 应用程序向我们的Spring Boot Admin Client注册(通过HTTP)或使用SpringCloud®(例如Eureka,Consul)发现. UI是Spring Boot Actuator端点上的Vue.js应用程序. Spring Boot Admin 是一个管理和监控Spring Boot 应用程序的开源软件.每个应用都认为是一个客户端,通过HT

随机推荐