用的挺顺手的 Spring Security 配置类,居然就要被官方弃用了?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用的挺顺手的 Spring Security 配置类,居然就要被官方弃用了?相关的知识,希望对你有一定的参考价值。

参考技术A

用过 WebSecurityConfigurerAdapter的都知道对 Spring Security 十分重要,总管 Spring Security 的配置体系。但是马上这个类要废了,你没有看错,这个类将在5.7版本被@Deprecated所标记了,未来这个类将被移除。

相关的issues已经被处理并关闭

对此对此网友大呼“学着学着就被弃用了”。既然马上要弃用了,总要有个过渡方案或者新玩法吧。

早在2021年3月份胖哥就写了一篇文章,把新玩法给明明白白说清楚了,如果你看了的话,肯定不会学废弃技术。这里把整套的替代方案再搞一遍,可别再学过时技术了。

旧玩法:

新玩法:

相关原理去看这一篇文章。

使用WebSecurity.ignoring()忽略某些URL请求,这些请求将被 Spring Security 忽略,这意味着这些URL将有受到 CSRF、XSS、Clickjacking 等攻击的可能。以下示例仅仅作为演示,请勿使用在生产环境。是不是又学到了呢?

旧玩法:

新玩法:

AuthenticationManager配置主要分为全局的(Global )、本地的(Local)。

旧玩法

上面是通过 WebSecurityConfigurerAdapter开启的是本地配置。开启全局配置需要覆写其authenticationManagerBean()方法并标记为Bean:

新玩法

本地配置通过 HttpSecurity.authenticationManager实现:

全局配置摆脱了依赖 WebSecurityConfigurerAdapter.authenticationManagerBean()方法,只需要定义一个AuthenticationManager类型的Bean即可:

当然还可以通过自定义 GlobalAuthenticationConfigurerAdapter并注入 Spring IoC 来修改 AuthenticationManagerBuilder,不限制数量,但是要注意有排序问题。相关的思维导图:

很多技术方案都不是直接更改的,是会有一个变化的过程,只要你紧追变化,其实也就没有变化。

跟我学习Spring Security--在线宠物商店开发

    我们首先来一个简单Spring Security登录,首先需要搭建环境,这里我们用Spring+SpringMVC+Spring Security,数据库用Hibernate4+Oracle,关于jar包,Spring以及SpringMVC我用的是3.2版本的。

    在web.xml中我们主要是配置Spring、SpringMVC以及Spring Security的集成。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="DogStoreApp" version="2.5">
  <display-name>Dog Store</display-name>
   <!-- 集成spring的通用配置 -->
   <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
    
   </param-value>
   </context-param>
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  
  <!-- SpringMVC前端控制器 -->
 <servlet>
 <servlet-name>dogstore</servlet-name>
 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>  
 </servlet>
 <servlet-mapping>
    <servlet-name>dogstore</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>
  
  <!-- springSecurity核心过滤器配置 -->
  <filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

</web-app>

    现在我们需要配置Spring Security的组件,在配置Spring Security的权限控制文件之前,我们来拓展一下Spring Security权限控制方法:

1、不用数据库,全部数据写在配置文件,这个也是官方文档里面的demo;

2、使用数据库,根据spring security默认实现代码设计数据库,也就是说数据库已经固定了,这种方法不灵活,而且那个数据库设计得很简陋,实用性差;

3、spring security和Acegi不同,它不能修改默认filter了,但支持插入filter,所以根据这个,我们可以插入自己的filter来灵活使用;

4、暴力手段,修改源码,前面说的修改默认filter只是修改配置文件以替换filter而已,这种是直接改了里面的源码,但是这种不符合OO设计原则,而且不实际,不可用。

现在配置dogstore-security.xml这个文件,关于命名空间配置,官方提供了两种配置方案

<beans xmlns="http://www.springframework.org/schema/beans"  
  xmlns:security="http://www.springframework.org/schema/security"  
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  xsi:schemaLocation="http://www.springframework.org/schema/beans  
          http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
          http://www.springframework.org/schema/security  
          http://www.springframework.org/schema/security/spring-security.xsd">  
    ...  
</beans>

第二种、命名空间用security开头,在配置中不需要security前缀,但是bean的配置需要用<beans:bean>配置

<beans:beans xmlns="http://www.springframework.org/schema/security"  
  xmlns:beans="http://www.springframework.org/schema/beans"  
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  xsi:schemaLocation="http://www.springframework.org/schema/beans  
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
           http://www.springframework.org/schema/security  
           http://www.springframework.org/schema/security/spring-security.xsd">  
    ...  
</beans:beans>

首先我们先按照上面第一种权限控制来做个简单的demo:dogstore-security.xml,注意自己引用的jar与命名空间版本要一致

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:beans="http://www.springframework.org/schema/beans"
	xsi:schemaLocation="
		http://www.springframework.org/schema/beans 
		http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/security 
		http://www.springframework.org/schema/security/spring-security-3.1.xsd">
	<http auto-config="true">
		<intercept-url pattern="/*" access="ROLE_USER"/>
	</http>
	<authentication-manager alias="authenticationManager">
		<authentication-provider>
			<user-service>
				<user authorities="ROLE_USER" name="guest" password="guest"/>
			</user-service>
		</authentication-provider>
	</authentication-manager>	
</beans:beans>

      第一个http标签其实主要是配置拦截url用的,里边大概配置了如果你要访问某个路径,需要哪个连接权限,而http标签下边的authentication-manger标签下的标签则配置了那些用户都拥有哪些权限,目前我们先暂时按这个步骤去做,后面详细介绍。

   现在我们来完善Spring、SpringMVC所需的配置文件,上面web.xml中我们已经预留了contextConfigLocation来引入配置文件,首先创建dogstore-base.xml空文件,这是Spring配置文件,如果后面需要什么,我们再添加

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:jdbc="http://www.springframework.org/schema/jdbc"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/jdbc  http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
	">
 
</beans>

SpringMVC的配置文件,先配置视图解析,SpringMVC配置会自动查找配置文件,Servlet的名字是(<servlet-name>)是dogstore,约定胜于配置将会在WEB-INF目录下寻找名为dogstore-servelt.xml的配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:jdbc="http://www.springframework.org/schema/jdbc"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/jdbc  http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
	">	
	<bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
	    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
	   <property name="prefix" value="/WEB-INF/views/"/>
	   <property name="suffix" value=".jsp"/>
	</bean>
</beans>

目前Spring、SpringMVC以及Spring Security配置文件基本用法已经配置,引入web.xml,SpringMVC自己引入配置文件。

<context-param>  
  <param-name>contextConfigLocation</param-name>  
  <param-value>  
    /WEB-INF/dogstore-security.xml  
    /WEB-INF/dogstore-base.xml  
  </param-value>  
</context-param>

将上面配置的加入tomcat,启动,在没有自定义登录页面之前,SpringSecurity会自动生成登录页面,如下图,我们在web.xml下添加首页来验证拦截是否有效

 <welcome-file-list>
  <welcome-file>main.jsp</welcome-file>
  </welcome-file-list>

在WebContent下添加main.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
我已经登录进来了!
</body>
</html>


技术分享

输入错误的账号或者错误密码

技术分享

输入上面配置的guest/guest,登录成功。




本文出自 “进击的程序猿” 博客,请务必保留此出处http://zangyanan.blog.51cto.com/11610700/1874163

以上是关于用的挺顺手的 Spring Security 配置类,居然就要被官方弃用了?的主要内容,如果未能解决你的问题,请参考以下文章

Spring security实现国际化问题

打开和关闭 Spring Security SAML 的方法

Spring Security 玩出花!两种方式 DIY 登录

Spring Security 玩出花!两种方式 DIY 登录

跟我学习Spring Security--在线宠物商店开发

Spring Security:UserDetailsManager 接口是做啥用的?和更多!