定义:
Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反转Inversion of Control ,DI:Dependency Injection 依赖注入)和AOP(面向切面编程)功能,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作。
功能:
Spring Security对Web安全性的支持大量地依赖于Servlet过滤器。这些过滤器拦截进入请求,并且在应用程序处理该请求之前进行某些安全处理。 Spring Security提供有若干个过滤器,它们能够拦截Servlet请求,并将这些请求转给认证和访问决策管理器处理,从而增强安全性。根据自己的需要,可以使用适当的过滤器来保护自己的应用程序。
如果使用过Servlet过滤器且令其正常工作,就必须在Web应用程序的web.xml文件中使用 和元素配置它们。虽然这样做能起作用,但是它并不适用于使用依赖注入进行的配置。
FilterToBeanProxy是一个特殊的Servlet过滤器,它本身做的工作并不多,而是将自己的工作委托给Spring应用程序上下文 中的一个Bean来完成。被委托的Bean几乎和其他的Servlet过滤器一样,实现javax.servlet.Filter接 口,但它是在Spring配置文件而不是web.xml文件中配置的。
实际上,FilterToBeanProxy代理给的那个Bean可以是javax.servlet.Filter的任意实现。这可以是 Spring Security的任何一个过滤器,或者它可以是自己创建的一个过滤器。但是正如本书已经提到的那样,Spring Security要求至少配置四个而且可能一打或者更多的过滤器。
使用案例
在进行后台管理时,我们希望通过springsecurity框架帮助我们对非法访问进行拦截,必须通过账户和密码的登录才可以访问到其他页面。
- 第一步:引入依赖:
<!--SpringSecurity框架-->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>4.1.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>4.1.0.RELEASE</version>
</dependency>
- 第二步:配置web.xml文件,设置springsecurity过滤器,让其帮助我们拦截请求:
<!--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>
- 第三步,在资源文件中具体配置其参数,创建文件applicationContext-security.xml
<?xml version="1.0" encoding="UTF-8"?>
<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.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security.xsd">
<!--可以匿名访问的资源,也就是未登录就可以访问-->
<!--设置登录页面和其他css,js静态资源可以直接访问-->
<http pattern="/login.html" security="none"></http><!--security属性为none代表该资源可以直接访问-->
<http pattern="/css/**" security="none" />
<http pattern="/img/**" security="none" />
<http pattern="/js/**" security="none" />
<http pattern="/plugins/**" security="none" />
<http pattern="/fail.html" security="none" />
<!--2、具体拦截校验的配置-->
<http use-expressions="false">
<intercept-url pattern="/**" access="ROLE_ADMIN"></intercept-url> <!--除了第一步资源可以匿名访问,其他资源都需要进行拦截校验(认证和授权)-->
<form-login
login-page="/login.html"
default-target-url="/admin/index.html"
always-use-default-target="true"
authentication-failure-url="/fail.html"
></form-login><!--1、登录页面 2、登录成功跳转到的页面 3、无论何时只要登录成功都跳转到2的页面 4、认证失败(登录失败)跳转到的页面-->
<csrf disabled="true"></csrf> <!--禁止跨站请求伪造(默认不允许跨域访问),也是一种安全机制-->
<headers>
<!--index.html主页是一个框架页,有frame标签的-->
<frame-options policy="SAMEORIGIN"></frame-options><!--同源,当index完成授权,它所嵌套的页面自动完成授权-->
</headers>
<logout /><!--负责注销退出-->
</http>
<!--3、配置用户信息(xml db)-->
<authentication-manager>
<authentication-provider>
<user-service>
<!--配置了两个用户信息,都具有ROLE_ADMIN的权限-->
<user name="csdn" password="123" authorities="ROLE_ADMIN"></user>
<user name="yi" password="456" authorities="ROLE_ADMIN"></user>
</user-service>
</authentication-provider>
</authentication-manager>
</beans:beans>
总结:
- 使用< http pattern="/login.html" security=“none”>< /http>标签并且设置security属性为none来让框架对这些请求不拦截
- < intercept-url pattern="/**" access=“ROLE_ADMIN”>< /intercept-url>通过该标签设置剩余的请求都需要拦截认证,这里认证的方式是ROLE_ADMIN类型我们自己设置的账户密码
- < form-login> 标签的四个属性
属性 | 作用 |
---|---|
login-page | 登录页面 |
default-target-url | 通过认证校验后跳转的页面 |
always-use-default-target | 当设置true时,代表无论何时,只要登录成功都跳转到default-target-url设置的页面 |
authentication-failure-url | 设置验证失败后跳转的页面 |
- 设置禁止跨域请求:< csrf disabled=“true”>< /csrf>
- < logout />标签负责注销退出,这代表需要退回登录页面重新登录验证