Spring实战读书笔记
第九章:保护web应用
Spring Security是为基于Spring的应用程序提供声明式安全保护的安全性框架。
过滤Web请求
-
Spring Security借助一系列Servlet Filter来提供各种安全性功能。但是我们要使用Security只需要配置一个Filter就行了。就是org.springframework.web.filter.DelegatingFilterProxy,它会拦截发往应用的请求,将请求委托给ID为springSecurityFilterChain的bean。
-
springSecurityFilterChain本身也是一个特殊的Filter,它可以链接一个或任意多个Filter。
-
如果我们利用web.xml来配置DelegatingFilterProxy的话直接使用<filter>元素就行了,但是如果使用Java配置的话,我们需要创建一个扩展的新类,它需要继承AbstractSecurityWebApplicationInitializer,并不需要重载任何方法,Spring会帮我们在Web容器中注册DelegatingFilterProxy。
编写简单的安全性配置
-
启用Spring Security(使用Java配置)
-
Spring Security必须配置在一个实现了WebSecurityConfigurer的bean中,所以我们的Security配置类必须要实现WebSecurityConfigurer或继承WebSecurityConfigurerAdapter。
-
还要在配置类上加相应注解,如果你的Web项目没有使用Spring MVC开发就加@EnableWebSecurity注解,如果是Spring MVC开发的可以使用@EnableWebMvcSecurity注解。
-
@EnableWebMvcSecurity注解配置了一个Spring MVC的参数解析器,这样的话Controller方法就能通过带有@AuthenticationPrincipal注解的参数获得认证用户的username,而且他还配置了一个bean,能帮我们在表单中添加一个隐藏的跨站请求伪造(CSRF)token输入域。
-
-
通过重载WebSecurityConfigurerAdapter的中不同的configure方法配置具体安全性。
基于数据存储认证用户
-
使用基于内存的用户存储
-
基于数据表进行认证
-
基于LDAP进行认证
-
配置自定义的用户服务
拦截请求
-
在一个Web应用中,有的路径是可以上用户随意访问的,但有的是需要一定权限才能访问的,所以我们就要对用户的请求进行拦截。对每个请求进行细颗粒度安全控制的关键在于重载configure(HttpSecurity)方法。
-
Security内置了一系列的配置方法,让我们可以为指定的路径配置不同的要求(表9.4,P268)。
-
配置的时候很重要的一点就是,要将最为具体的路径放在前面进行配置,最不具体的放在最后面。否则的话,那些不具体的路径会覆盖掉具体的路径。
-
但是如果直接使用Security内置的方法有一个很大的缺陷,就是我们只能对一个路径添加一个配置方法,无法添加多个限定条件。Security提供一个access方法,只有方法内参数为true的时候,路径才能访问。同时,Security还通过一些安全相关的表达式扩展了Spring的表达式语言(表9.5),让我们可以自由的发挥。
-
使用HTTP提交数据有很大的风险,我们可以使用requiresSecure方法要求页面使用HTTPS传输。
认证用户
-
启用HTTP Basic认证:在configure(HttpSecurity)方法内调用httpbasic方法即可
-
启用Remember-me功能:调用rememberMe方法,还可以通过tokenValiditySeconds设置token有效期
-
登录与退出:可以通过formLogin().loginPage("/login")设置登录URL,通过.logout().logoutSuccessUrl("/").logoutUrl("/logout")分别设置退出成功后跳转的页面,以及退出的URL
保护视图
-
Spring Security提供了一个JSP标签库,以security为前缀。通过<security:authentication>可以获得用户认证的详细信息,使用<security:authorize>可以有条件的渲染视图内容。
-
Thymeleaf的安全方言也提供了域Security标签库相对应的功能。都是以sec为前缀。要使用Thymeleaf的安全方言还需要使用SpringTemplateEngine注册SpringSecurityDialect。