Spring Security介绍

Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。由于它是Spring生态系统中的一员,因此它伴随着整个Spring生态系统不断修正、升级,在spring boot项目中加入springsecurity更是十分简单,使用Spring Security 减少了为企业系统安全控制编写大量重复代码的工作。

创建工程

创建maven工程 security-spring-security,工程结构如下:

引入以下依赖:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.cyj</groupId><artifactId>security-spring-security</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target></properties><dependencies><dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-web</artifactId><version>5.1.4.RELEASE</version></dependency><dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-config</artifactId><version>5.1.4.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.1.5.RELEASE</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.0.1</version><scope>provided</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.16.14</version></dependency></dependencies><build><finalName>security-springs-ecuristy</finalName><pluginManagement><plugins><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.8</source><target>1.8</target></configuration></plugin><plugin><artifactId>maven-resources-plugin</artifactId><configuration><encoding>utf-8</encoding><useDefaultDelimiters>true</useDefaultDelimiters><resources><resource><directory>src/main/resources</directory><filtering>true</filtering><includes><include>**/*</include></includes></resource><resource><directory>src/main/java</directory><includes><include>**/*.xml</include></includes></resource></resources></configuration></plugin></plugins></pluginManagement></build></project>

Spring容器配置

package com.cyj.security.springsecurity.config;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.stereotype.Controller;/*** @program: Spring-Security-OAuth2* @Description:* @Author C_Y_J* @create: 2021-01-28 19:14**/
@Configuration
@ComponentScan(basePackages = "com.cyj.security.springsecurity",excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, value = Controller.class)})
public class ApplicationConfig {//在此配置除了Controller的其它bean,比如:数据库链接池、事务管理器、业务bean等。
}

Servlet Context配置

package com.cyj.security.springsecurity.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.stereotype.Controller;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.view.InternalResourceViewResolver;/*** @program: Spring-Security-OAuth2* @Description:* @Author C_Y_J* @create: 2021-01-28 19:15**/
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.cyj.security.springsecurity",includeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, value = Controller.class)})
public class WebConfig implements WebMvcConfigurer {/*** 视频解析器** @return*/@Beanpublic InternalResourceViewResolver viewResolver() {InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();viewResolver.setPrefix("/WEB-INF/view/");viewResolver.setSuffix(".jsp");return viewResolver;}@Overridepublic void addViewControllers(ViewControllerRegistry registry) {registry.addViewController("/").setViewName("redirect:/login");}}

加载 Spring容器

在init包下定义Spring容器初始化类SpringApplicationInitializer,此类实现WebApplicationInitializer接口,Spring容器启动时加载WebApplicationInitializer接口的所有实现类。

package com.cyj.security.springsecurity.init;import com.cyj.security.springsecurity.config.ApplicationConfig;
import com.cyj.security.springsecurity.config.WebConfig;
import com.cyj.security.springsecurity.config.WebSecurityConfig;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;/*** @program: Spring-Security-OAuth2* @Description:* @Author C_Y_J* @create: 2021-01-28 19:20**/
public class SpringApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {/*** spring容器,相当于加载 applicationContext.xml** @return*/@Overrideprotected Class<?>[] getRootConfigClasses() {return new Class[]{ApplicationConfig.class};}/*** servletContext,相当于加载springmvc.xml** @return*/@Overrideprotected Class<?>[] getServletConfigClasses() {return new Class[]{WebConfig.class};}/*** url-mapping** @return*/@Overrideprotected String[] getServletMappings() {return new String[]{"/"};}
}

认证

springSecurity默认提供认证页面,不需要额外开发。

安全配置

spring security提供了用户名密码登录、退出、会话管理等认证功能,只需要配置即可使用。
(一)在config包下定义WebSecurityConfig,安全配置的内容包括:用户信息、密码编码器、安全拦截机制。

package com.cyj.security.springsecurity.config;import org.springframework.context.annotation.Bean;
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;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.password.NoOpPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;/*** @program: Spring-Security-OAuth2* @Description:* @Author C_Y_J* @create: 2021-01-28 19:16**/
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {/*** 定义用户信息服务(查询用户信息)** @return*/@Bean@Overridepublic UserDetailsService userDetailsService() {//暂时使用内存查询InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();manager.createUser(User.withUsername("zhangsan").password("123").authorities("p1").build());manager.createUser(User.withUsername("lisi").password("456").authorities("p2").build());return manager;}/*** 密码编码器** @return*/@Beanpublic PasswordEncoder passwordEncoder() {return NoOpPasswordEncoder.getInstance();}/*** 安全拦截机制(最重要)** @param http* @throws Exception*/@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/r/r1").hasAuthority("p1").antMatchers("/r/r2").hasAuthority("p2")//所有/r/**的请求必须认证通过.antMatchers("/r/**").authenticated()//除了/r/**,其它的请求可以访问.anyRequest().permitAll();http//允许表单登录.formLogin()//自定义登录成功的页面地址.successForwardUrl("/login-success");}
}

在userDetailsService()方法中,我们返回了一个UserDetailsService给spring容器,Spring Security会使用它来获取用户信息。我们暂时使用InMemoryUserDetailsManager实现类,并在其中分别创建了zhangsan、lisi两个用户,并设置密码和权限。

而在configure()中,我们通过HttpSecurity设置了安全拦截规则,其中包含了以下内容:
(1)url匹配/r/**的资源,经过认证后才能访问。
(2)其他url完全开放。
(3)支持form表单认证,认证成功后转向/login-success。

(二) 加载 WebSecurityConfig
修改SpringApplicationInitializer的getRootConfigClasses()方法,添加WebSecurityConfig.class:

    /*** spring容器,相当于加载 applicationContext.xml** @return*/@Overrideprotected Class<?>[] getRootConfigClasses() {return new Class[]{ApplicationConfig.class, WebSecurityConfig.class};}

Spring Security初始化

Spring Security初始化,这里有两种情况
若当前环境没有使用Spring或Spring MVC,则需要将 WebSecurityConfig(Spring Security配置类) 传入超类,以确保获取配置,并创建spring context。

相反,若当前环境已经使用spring,我们应该在现有的springContext中注册Spring Security(上一步已经做将WebSecurityConfig加载至rootcontext),此方法可以什么都不做。

在init包下定义SpringSecurityApplicationInitializer:

public class SpringSecurityApplicationInitializer extends AbstractSecurityWebApplicationInitializer {public SpringSecurityApplicationInitializer() {//super(WebSecurityConfig.class);}
}

默认根路径请求

在WebConfig.java中添加默认请求根路径跳转到/login,此url为spring security提供:

    @Overridepublic void addViewControllers(ViewControllerRegistry registry) {registry.addViewController("/").setViewName("redirect:/login");}

认证成功页面

在安全配置中,认证成功将跳转到/login-success,代码如下:

    /*** 安全拦截机制(最重要)** @param http* @throws Exception*/@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/r/r1").hasAuthority("p1").antMatchers("/r/r2").hasAuthority("p2")//所有/r/**的请求必须认证通过.antMatchers("/r/**").authenticated()//除了/r/**,其它的请求可以访问.anyRequest().permitAll();http//允许表单登录.formLogin()//自定义登录成功的页面地址.successForwardUrl("/login-success");}

spring security支持form表单认证,认证成功后转向/login-success。在LoginController中定义/login-success:

package com.cyj.security.springsecurity.controller;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** @program: Spring-Security-OAuth2* @Description:* @Author C_Y_J* @create: 2021-01-28 19:38**/
@RestController
public class LoginController {@RequestMapping(value = "/login-success", produces = {"text/plain;charset=utf-8"})public String loginSuccess() {return " 登录成功";}@GetMapping(value = "/r/r1", produces = {"text/plain;charset=UTF-8"})public String r1() {return " 访问资源1";}@GetMapping(value = "/r/r2", produces = {"text/plain;charset=UTF-8"})public String r2() {return " 访问资源2";}}

测试

(1)启动项目,访问 http://localhost:8080/security-spring-security 路径地址

页面会根据WebConfig中addViewControllers配置规则,跳转至/login,/login是pring Security提供的登录页面。
(2)登录
1、输入错误的用户名、密码

2、输入正确的用户名、密码,登录成功

(3)退出
1、请求/logout退出
http://localhost:8080/security-spring-security/logout

退出 后再访问资源自动跳转到登录页面

授权

实现授权需要对用户的访问进行拦截校验,校验用户的权限是否可以操作指定的资源,Spring Security默认提供授权实现方法。在LoginController添加/r/r1或/r/r2

    @GetMapping(value = "/r/r1", produces = {"text/plain;charset=UTF-8"})public String r1() {return " 访问资源1";}@GetMapping(value = "/r/r2", produces = {"text/plain;charset=UTF-8"})public String r2() {return " 访问资源2";}

在安全配置类WebSecurityConfig.java中配置授权规则:

    /*** 安全拦截机制(最重要)** @param http* @throws Exception*/@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/r/r1").hasAuthority("p1").antMatchers("/r/r2").hasAuthority("p2")//所有/r/**的请求必须认证通过.antMatchers("/r/**").authenticated()//除了/r/**,其它的请求可以访问.anyRequest().permitAll();http//允许表单登录.formLogin()//自定义登录成功的页面地址.successForwardUrl("/login-success");}

.antMatchers("/r/r1").hasAuthority(“p1”)表示:访问/r/r1资源的 url需要拥有p1权限。
.antMatchers("/r/r2").hasAuthority(“p2”)表示:访问/r/r2资源的 url需要拥有p2权限。
测试:
1、登录成功
2、访问/r/r1和/r/r2,有权限时则正常访问,否则返回403(拒绝访问)

小结

通过快速上手,咱们使用Spring Security实现了认证和授权,Spring Security提供了基于账号和密码的认证方式,通过安全配置即可实现请求拦截,授权功能,Spring Security能完成的不仅仅是这些。

原文链接

(二)Spring Security 快速上手相关推荐

  1. Spring Security快速上手

    Spring Security介绍 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架. 由于它是Spring生态系统中的一员,因此它伴 ...

  2. Spring Boot 快速上手(9)热部署

    Spring Boot 快速上手(9)热部署 IDE 配置 (idea) 添加依赖 IDE 配置 (idea) 设置 -> 构建.执行.部署 -> 编译器(点击文字) -> (右边界 ...

  3. 响应式Spring的道法术器(Spring WebFlux 快速上手 + 全面介绍)

    1. Spring WebFlux 2小时快速入门 Spring 5 之使用Spring WebFlux开发响应式应用. lambda与函数式(15min) Reactor 3 响应式编程库(60mi ...

  4. spring cloud 快速上手系列 -> 02-配置中心 Config -> 022-Config客户端

    spring cloud 快速上手系列 系列说明:快速上手,一切从简,搭建一个简单的微服务框架,让新手可以在这个基础框架上做各种学习.研究. 02-配置中心 Config 022-Config客户端 ...

  5. spring cloud 快速上手系列 -> 04-网关 Gateway -> 041-空的工程

    spring cloud 快速上手系列 系列说明:快速上手,一切从简,搭建一个简单的微服务框架,让新手可以在这个基础框架上做各种学习.研究. 04-网关 Gateway 041-空的工程 1,说明 网 ...

  6. Spring WebFlux快速上手——响应式Spring的道法术器

    [url=https://blog.csdn.net/get_set/article/details/79480233]Spring WebFlux快速上手--响应式Spring的道法术器[/url]

  7. Spring Boot实践 | 利用Spring Security快速搞定权限控制

    目录 开始之前 快速开始 使用内存签名服务 使用数据库签名服务 使用自定义签名服务 限制请求 强制使用HTTPS 防止跨站点伪造请求 用户认证功能 在java web工程中,一般使用Servlet过滤 ...

  8. Spring Boot+Vue/前后端分离/高并发/秒杀实战课程之spring Security快速搭建oauth2 内存版身份认证

    Springboot快速搭建oauth2 内存版身份认证 环境准备 点击[Create New Project]创建一个新的项目 项目环境配置 配置Thymeleaf 搭建oauth2认证,加入两个依 ...

  9. Spring Boot2 总结(二) Spring Security的基本配置

      Spring Boot对Spring Security提供了自动化配置方案,同时这也是在Spring Boot项目中使用Spring Security的优势,因此Spring Security整合 ...

最新文章

  1. self.navigationController push到指定控制器
  2. 一个DIV调用多个CSS样式
  3. ubuntu内核和主线内核_ubuntu上更新和卸载Linux内核
  4. dedecms调用自定义会员模型会员信息的方法
  5. STM32 SPI NSS 引脚为不能拉高问题
  6. Selenium_等待页面加载完毕
  7. java:1221是一个非常特殊的数,它从左边读和从右边读是一样的,编程求所有这样的四位十进制数。
  8. ComboBox控件-转
  9. PHP 长文章分页函数
  10. android aop 权限检查,AOP简单拦截实现验证权限功能
  11. .net System.Web.Mail发送邮件
  12. mybatis log4j 在日志中打印sql_SpringBoot整合MyBatis+详细打印执行SQL语句
  13. java判断名字是否为张三_用java代码写一个判断名字是不是以K或T开头的?
  14. 说说如何在 Spring 框架中使用 SpEL 表达式
  15. php自动提交百度收录,wordpress站点如何自动提交百度收录
  16. html表格 溢出,html – 如何创建在溢出时滚动的表格单元格
  17. 如何让Win10在开机时跳过锁屏
  18. AndroidQ适配之存储权限的变更
  19. 通过Gazebo仿真学TurtleBot3(四)——简单的/cmd_vel控制
  20. 多层感知器(Muti-Layer Perception ,MLP)

热门文章

  1. Java基础(final关键字、双亲委派机制)
  2. 应用宝apk_【小镇狼人杀】新角色猜测(末尾附上应用宝下载渠道)
  3. 解题报告 逃跑未遂
  4. Unity 在代码中利用Mesh实时生成圆环/空心圆柱
  5. 红米k40显示屏蔽相册方法分享
  6. 数学建模——皮尔逊person相关系数VS斯皮尔曼spearman相关系数学习笔记
  7. 刘嘉玲 琦琦拍摄SKII新广告
  8. mybatis-plus ${ew.sqlSegment}踩吭
  9. 荒野求生卡在获取服务器信息,武装突袭3 WasteLand荒野求生服务器教程
  10. linux nc反弹命令,详解NC反弹shell的几种方法