慢慢来比较快,虚心学技术
安全性是绝大多数应用系统中的一个重要切面( aspect ),之所以说是切面,是因为安全性是超越应用程序功能的一个关注点。应用系统的绝大部分内容都不应该参与到与自己相关的安全性处理中。尽管我们可以直接在应用程序中编写安全性功能相关的代码(这种情况并不少见),但更好的方式还是将安全性相关的关注点与应用程序本身的关注点进行分离
一、什么是Spring Security?
一种基于 Spring AOP 和 Servlet 规范中的 Filter 实现的安全框架。 Spring Security 提供了完整的安全性解决方案,它能够在 Web 请求级别和方法调用级别处理身份认证和授权
Spring Security 从两个角度来解决安全性问题。
- 它使用 Servlet 规范中的 Filter 保护 Web 请求并限制 URL 级别的访问。
- Spring Security 还能够使用 Spring AOP 保护方法调用 —— 借助于对象代理和使用通知,能够确保只有具备适当权限的用户才能访问安全保护的方法
Spring Security的核心是 用户认证(Authentication)和用户授权(Authorization)
二、Spring Security基本组成
Spring Security 被分成了 11 个模块
ACL |
支持通过访问控制列表( access control list , ACL )为域对象提供安全性 |
切面( Aspects ) |
一个很小的模块,当使用 Spring Security 注解时,会使用基于 AspectJ 的切面,而不是使用标准的 Spring AOP |
CAS 客户端( CAS Client ) |
提供与 Jasig 的中心认证服务( Central Authentication Service , CAS )进行集成的功能 |
配置( Configuration ) |
包含通过 XML 和 Java 配置 Spring Security 的功能支持 |
核心( Core ) |
提供 Spring Security 基本库 |
加密( Cryptography ) |
提供了加密和密码编码的功能 |
LDAP |
支持基于 LDAP 进行认证 |
OpenID |
支持使用 OpenID 进行集中式认证 |
Remoting |
提供了对 Spring Remoting 的支持 |
标签库( Tag Library ) |
Spring Security 的 JSP 标签库 |
Web |
提供了 Spring Security 基于 Filter 的 Web 安全性支持 |
一个基本的Spring Security应用至少包括Core和Configuration模块,当涉及到Web应用时,还需要包含Web模块。
三、Spring Security使用
pom文件中引入基本的Spring Security及Spring MVC所需要的包
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<spring.security.version>5.1.3.RELEASE</spring.security.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!--引入Servlet支持-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!-- jstl -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!--个人封装的一个模块,可有可无,不影响功能实现-->
<dependency>
<groupId>com.my.spring</groupId>
<artifactId>com.m.spring.common</artifactId>
</dependency>
<!--引入Spring支持-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.13</version>
</dependency>
<!--引入Spring MVC支持-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<!--引入Spring Security支持-->
<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-core -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>${spring.security.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-web -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>${spring.security.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-config -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>${spring.security.version}</version>
</dependency>
</dependencies>
①配置SpringMVC默认DispatcherServlet类
public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
/*AbstractAnnotationConfigDispatcherServletInitializer 会同时创
建 DispatcherServlet 和 ContextLoaderListener 。 GetServlet-ConfigClasses() 方法返回的带有 @Configuration 注解的
类将会用来定义 DispatcherServlet 应用上下文中的 bean 。 getRootConfigClasses() 方法返回的带有 @Configuration 注解的类将
会用来配置 ContextLoaderListener 创建的应用上下文中的 bean 。*/
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[]{RootConfig.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{WebConfig.class};
}
@Override
protected String[] getServletMappings() {
logger.debug("DispatcherServlet获取匹配的前端控制器。。。。。。");
return new String[]{"/"};
}
}
②创建Spring Security的DelegatingFilterProxy,自动加载springSecurityFilterChain
/**
* 拦截发往应用中的请求,并将请求委托给 ID 为 springSecurityFilterChain的bean
* springSecurityFilterChain 本身是另一个特殊的 Filter,它也被称为 FilterChainProxy.它可以链接任意一个或多个其他的 Filter。
* Spring Security 依赖一系列 Servlet Filter 来提供不同的安全特性。
**/
public class SpringSecurityInitializer extends AbstractSecurityWebApplicationInitializer {}